找回密码
 立即注册
首页 业界区 安全 YII框架的三条经典利用链的探究

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

柏球侠 昨天 21:15
利用链一
BatchQueryResult出发,关键源码:(下文关于类的代码都只保留了关键部分)
1.png

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

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

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

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

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

相关推荐

您需要登录后才可以回帖 登录 | 立即注册