thinkphp5.0.24反序列化pop链分析
[toc]
关于本文
这篇是对thinkphp5.0.24反序列化漏洞的复现,因为代码量有点大,分析起来属实让人自闭,看的我头疼。
本文分析会附带poc。
环境搭建
从网上下载下来此版本的代码,然后打开 application\index\controller\index.php,写下如下代码。
phpstorm+xdebug配置,下载一个chrome插件:xdebug helper,跟着网上教程设置一下,然后phpstorm监听,就可以断点单步跟踪调试了。
然后还开了框架的debug模式。
反序列化分析
全局搜索一下__destruct()方法,在Windows类中发现一个可以利用的。
跟进removeFiles()方法
这里的file_exists()函数会触发__toString()方法,全局搜索__tostring(),在Model类中发现可以利用的,因为Model是抽象类,不能被实例化为对象,必须找到他的子类Pivot,父类中的方法子类是可以继承的嘛,一会用Pivot就好了。
__toStrint() => toJson() => toArray()
跟进toArray()方法,这个方法前半部分是没有用的,不用管他,直接看后半部分
看这一行代码
1 | $item[$key] = $value ? $value->getAttr($attr) : null; |
这里的 value 和 attr 都是可控的,这不是正好可以触发__call方法吗,于是向前看看这两个变量是怎么来的。
首先 this->append不为空且为数组,数组里面的值不能为数组,并且不能包含点号。这个 loader::parseName()
就是转换大小写的函数,不用管。然后往下第902行,如果 $this->$relation()
存在并且把其返回值赋值给 $modeRelation 。
因为这里是 $this->$relation()
而不是 $this->relation()
,我们便可以通过 $relation参数调用这个类中的任意方法
往下找了找找到了这个方法,可以返回任意值。
然后下面这行代码,调用了 $modeRelation 作为参数,并且把返回值传给 $value ,
1 | $value = $this->getRelationData($modelRelation); |
跟进一下
这里又一个if/else分支,按道理来说if为真时完全可以达成一条完整的pop链,把 $this->parent 的值赋值给value,然后再往下触发__call 即可,但不知道为什么复现时候老是报错,没办法执行,真难,艹。
然后又找到了另一条链子,这里就不看没成功的那个了,回头有时间再看看。
看646行,
1 | $value = $modelRelation->getRelation(); |
调用了 getRelation 方法,我们要找一个有这个方法并且返回值可控的,于是在 HasOne 这个类中找到了这个方法,看一下
看第53、54行,这里两个参数都是可控的,在这里可以触发 __call() 。
可调用的 __call() 在 Output 类中:
跟进 Output 类 block 方法
跟进 writeIn 方法
跟进 write 方法
这里可以调用任意类的write方法,全局搜索一下write方法,在 Memcache 类中的 write 可以调用任意类的 set方法。
寻找 set 方法,在 File 类中,
需要使用伪协议绕过exit()使用file_put_contents()写入shell,
这里第一次调用 set 参数是不可控的,无法写shell,真正写shell是利用 setTagItem() 方法第二次调用set,然后就可以写入shell了。
中途写好后运行了几次无法在windows中复现成功,于是参考了这里:
下面是最后的POC:
POC
1 | <?php |
运行后生成a.php6218150bbcad1e6eec78da4604c4b6c7.php,其中包含了一个eval($_POST[‘ccc’])
最后
只想说是真的难,和平时比赛中的反序列化链子完全不是一个级别的。然后总之就是多审链子,还是太菜了。
- Post Title: thinkphp5.0.24反序列化pop链分析
- Post Author: Katharsis
- Post Link: http://yoursite.com/2020/09/13/thinkphp5-rce/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
1.thinkphp6反序列化链
2.thinkphp_5.1.39反序列化分析
3.ciscn2019 laravel反序列化利用链
4.代码审计之——PHP-Audit-Labs