前言
大概练习了下一些简单的PHP反序列化漏洞以后,决定尝试一下漏洞复现。正好做CTF的时候看到了ThinkPHP
反序列化漏洞的复现题,结果因为一些很小的问题(还是经验不足)废了很多很多时间,踩了很多坑,当然最后也收获了很多,对php反序列化漏洞有了新的认识。
看了下README,得知是5.1版本的,网上有各个师父的WP,看了很久终于搞明白了。
PHP审计环境安装
为了方便,参考网上的资料后,我在windows系统上安装了XAMPP
和PhpStorm
,PhpStrom
的配置就不说了,具体参考PHPstorm配置PHP运行环境,不过我在配置运行的时候遇到很多坑,比如在某个php文件点击运行的时候,右上角设置的configuration
会自动改变,导致我以为网站运行不起来。不过PhpStorm
还是挺好用的,英语输入法下ctrl+shift+f
可全局搜索关键词(这个快捷键会自动转换成windows系统拼音的繁体)
任意文件删除漏洞复现
发现、分析过程
拿到源码的第一件事,我是搜索unserialize
,后来在index.php
发现了,所以我们可以通过POST
请求来发送恶意代码。
接下来全局搜索魔法函数 __destruct
,出现了四个结果
发现只有Windows.php下的函数有利用价值
1 | public function __destruct() |
跟进removeFiles()
之后,发现该方法依然在windows这个class里
1 | private function removeFiles() |
这意味着我们可以构造$files,让他执行removeFiles()
来删除任意文件
构造POC
坑点一:需要注意的是,我们需要使用与Windows类相同的namespace(命名空间),我没加,导致在这卡了好久好久。
坑点二:序列化后的对象用file_put_contents()
打出来乱码,发现是加了namespace
后就会乱码,具体原因没有深入探究,改用echo就好了。
坑点三:加入namespace
后,private类型attribute的格式发生了变化,变成了%00namespace\类名\%00属性名
,一个小诀窍,记不住可以右键–查看网页源代码
最后POC如下
1 |
|
RCE漏洞复现
待更新。。