柏球侠 发表于 2025-12-7 21:15:09

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

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

可以看到reset()方法里面的
$this->_dataReader->close();
是可控的,并且在调用__destruct()会直接指向reset();方法
不难想到可以让_dataReader替换为拥有__call方法,并且不含close()方法的对象,这样就能去触发__call方法,从而让利用链延续
即$this->_dataReader=new Generator();
利用链条的第二环,Generator
关键源码为

经过起始链对对象的操作,也就等价于运行

而该部分的
return call_user_func_array($this->formatters['close'], []); 的$this->formatters['close']是可控的
而且call_user_func_array()是一个重要的可利用函数,作用是:调用一个回调函数,并将一个参数数组传递给它。
回调函数就是一个被当做参数给另一个函数的函数。
到这里,通过起始链的要求,找到的这条链子,有极高的自由度,只需要再找到一个拥有RCE特征的方法的对象即可收尾
即$this->formatters['close'] = ;
利用链的第三环,IndexAction

该对象的checkAccess和id都是可控的
而且作用容器是call_user_func() call_user_func('x','y')就是把右边作为左边的输入
只需要把checkAccess改为shell_exec id改为需要执行的命令就行
即$this->checkAccess = 'shell_exec';
      `$this->id = '命令执行语句'; ` 最终的利用链条就是
点击查看代码——————————————————————————利用链三
从BatchQueryResult出发
BatchQueryResult的代码与利用链一的完全一致
$this->_dataReader=new DbSession();
利用链的第二环,DbSession

不同于利用链条一,不需要再借助__call方法去作为跳板,而是在第二环调用同为close()的方法
而这个close()方法的writeCallback 和getId()都是可控的,接收函数还是call_user_func(),虽然另外接收了两个参数,但是在php里,函数在接收多余参数时不会报错
于是直接$this->writeCallback=;即可运行run()方法
继续对run方法赋值
$this->checkAccess = 'shell_exec';
$this->id = '执行语句';
最终的利用链就是
点击查看代码

供挂 发表于 2025-12-31 15:00:53

yyds。多谢分享

皇甫佳文 发表于 2026-1-16 19:02:32

过来提前占个楼

轧岔 发表于 2026-1-17 04:12:17

收藏一下   不知道什么时候能用到

疝镜泛 发表于 2026-1-18 15:57:00

yyds。多谢分享

眩疝诺 发表于 2026-1-18 22:34:19

热心回复!

杼氖 发表于 2026-1-20 19:29:31

新版吗?好像是停更了吧。

慢秤 发表于 2026-1-22 00:59:35

很好很强大我过来先占个楼 待编辑

命煦砌 发表于 2026-1-22 14:19:47

这个有用。

轧岔 发表于 2026-1-25 08:17:54

这个好,看起来很实用

东郭欣然 发表于 2026-1-25 09:01:02

谢谢楼主提供!

辅箱肇 发表于 2026-1-26 09:27:39

前排留名,哈哈哈

窖咎 发表于 2026-1-27 02:32:42

喜欢鼓捣这些软件,现在用得少,谢谢分享!

匡菲 发表于 2026-1-28 02:31:41

用心讨论,共获提升!

拓炊羡 发表于 2026-1-28 05:25:16

很好很强大我过来先占个楼 待编辑

赴忽 发表于 2026-1-30 05:05:25

热心回复!

峰襞副 发表于 2026-2-7 11:25:15

收藏一下   不知道什么时候能用到

县挫伪 发表于 2026-2-8 02:59:13

热心回复!

颛孙中 发表于 2026-2-8 10:39:54

鼓励转贴优秀软件安全工具和文档!

黎瑞芝 发表于 2026-2-8 16:09:43

谢谢分享,辛苦了
页: [1] 2
查看完整版本: YII框架的三条经典利用链的探究