印象深刻的csrf利用:
在phpwind下:漏洞点(但是都是在后台的漏洞)
代码追:
task到unserialize,然后重写PwDelayRun的构造函数,给callback和args赋值,然后当程序执行结束,进入垃圾回收时,(进行反序列化)__destruct就会执行,此时会将call和args的恶意代码执行。
找到__destruct的位置:
php
class PwDelayRun {
private static $instance = null;
private $_callback = array();
private $_args = array();
private function __construct() {
}
public function __destruct() {
foreach (this->_callback as key => $value) {
call_user_func_array(value, this->_args[$key]);
}
}
...
}
但是在执行时并没有加载PwDelayRun这个类:
进行反序列化的时候,如果发现不存在的类,就会传入注册好的spl_autoload函数中:
可以发现spl_autoload_register函数的调用:(最后会走入一个include)
php
include className . '.' . self::_extensions;
命名空间中可以包含\,而在windows下,\也可以作为路径的分隔符。(由此可见,这个漏洞仅限于Windows服务器)整个phpwind全局是没有使用命名空间的,也就是默认命名空间为\,但现在的PwDelayRun类所在的命名空间并不在\下。
所以我们需要生成src\library\utility\PwDelayRun类和\PwDelayRun类两个对象,放在一个数组中,在反序列化前者的过程中include目标文件,在反序列化后者的过程中拿到PwDelayRun对象。
但是在数组传进去的过程中:会被其拦住
php
public function beforeAction($handlerAdapter) {
parent::beforeAction($handlerAdapter);
var = unserialize(this->getInput('var'));
if (is_array($var)) {
this->setOutput(var, 'condition');
}
}
在php源码层,对象是用数组来模拟的,所以我们只需要用一个对象代替数组即可。
最后加上csrf:
漏洞本身为后台漏洞,但漏洞又有一个特点,那就是其为GET方法,只需要一个URL即可触发。
php
[img]http://127.0.0.1/web.php[/img]