BUUCTFeasy_serialize_php
时间: 2025-07-09 21:46:37 浏览: 13
<think>好的,我现在需要解决BUUCTF的easy_serialize这个PHP题目。首先,我得仔细看看用户提供的引用内容,里面提到了序列化、反序列化,还有一些漏洞的例子,比如类似phpmyadmin 4.8.1的漏洞,还有RoarCTF 2019的Easy Calc题目。这些可能和当前题目有关联。
首先,题目名称是easy_serialize,所以猜测题目主要涉及PHP的序列化和反序列化漏洞。用户的引用中提到了序列化类、filter函数、base64_decode、file_get_contents等函数,可能涉及反序列化链的构造或者POP链的利用。引用4中的目录和序列化字符串可能提示需要读取特定文件,比如flag的位置在某个路径下,如/var/www/html或类似的地方。
接下来,我需要分析可能的解题步骤。通常,PHP反序列化漏洞利用需要找到一个可以触发魔术方法(如__destruct、__wakeup)的类,进而执行任意代码或读取文件。根据引用中的代码片段,比如Name类中的__construct方法,可能涉及属性覆盖,或者通过序列化字符串修改对象属性,导致敏感信息泄露或代码执行。
引用2中的例子是file_get_contents(base64_decode(unserialize(filter(serialize($_SESSION['img']))))) ,这看起来像是一个链式操作:先序列化,然后过滤,反序列化,再base64解码,最后读取文件。可能题目中存在类似的逻辑,通过构造特定的序列化字符串来触发文件读取,比如通过修改session中的img参数,使其反序列化后得到某个文件路径,再通过file_get_contents读取flag文件。
引用4提到目录1aMaz1ng_y0u_c0Uld_f1nd_F1Ag_hErE,可能flag文件位于该目录下,比如/var/www/html/1aMaz1ng_y0u_c0Uld_f1nd_F1Ag_hErE/flag.txt。而序列化字符串中的FilesystemIterator可能用于遍历目录,获取文件名,进而读取flag。
现在,我需要考虑如何构造有效的序列化payload。可能题目中存在对用户输入的序列化数据进行过滤或替换,导致对象属性被覆盖。例如,如果代码中有str_replace操作,将某些字符串替换为空,可能通过精心构造属性名,使得过滤后的字符串形成有效的类属性,从而执行恶意操作。
例如,假设代码中有这样的处理:将序列化后的字符串中的某些关键字替换掉。比如替换"php"为"",那么可以利用属性名中包含这些关键字,使得替换后的序列化数据仍然有效。例如,原属性名为"userphpname",替换后变成"username",从而覆盖原有的属性值。
结合引用中的例子,可能的解题步骤是:
1. 分析题目提供的PHP代码,寻找反序列化入口点,比如从$_SESSION或POST/GET参数中获取序列化数据,并进行反序列化。
2. 寻找可利用的类及其魔术方法,构造POP链,或者覆盖敏感属性(如文件名、路径)。
3. 利用过滤函数的替换机制,构造属性名,使得过滤后的序列化数据仍有效,但属性值被修改为目标路径。
4. 触发反序列化,读取flag文件。
比如,假设代码中存在如下逻辑:
- 用户提交的序列化数据被过滤,例如将"php"替换为空。
- 构造一个序列化字符串,其中属性名为"php",这样替换后可能改变属性长度,导致反序列化时属性覆盖,从而修改目标文件路径为已知的flag路径。
或者,利用FilesystemIterator类来遍历目录,获取flag文件名,再通过file_get_contents读取。
在引用4的序列化字符串中,类A的实例使用了FilesystemIterator,并设置para为/var/www/html,可能用于遍历该目录下的文件,找到flag所在目录,然后读取。
因此,可能的解题思路是:
- 构造一个序列化对象,将FilesystemIterator的路径设置为已知的flag目录,触发反序列化后,通过该类获取目录中的文件列表,从而得到flag文件名,再读取该文件。
或者,直接通过反序列化后的对象触发文件读取,比如利用file_get_contents的参数被篡改为flag路径。
此外,可能还需要绕过某些过滤,比如关键字替换,构造合适的序列化字符串。例如,如果代码中替换了"php"为"",那么可以在属性名中使用"phphp",这样替换后变成"php",从而正确解析。
总结步骤:
1. 确认反序列化入口点,比如通过$_SESSION中的某个参数传递序列化数据。
2. 分析代码中的过滤逻辑,找到可利用的替换规则。
3. 构造恶意序列化数据,覆盖关键属性,指向flag路径。
4. 触发反序列化,读取flag。
例如,假设存在这样的替换规则:将"flag"替换为"xxx",那么在序列化字符串中,属性名可以设计为"flflagag",替换后变为"flag",从而绕过过滤,将属性值设置为真实路径,比如/flag.txt,这样替换后路径正确。
因此,解题的关键在于构造正确的序列化字符串,绕过过滤,并利用反序列化后的对象执行文件读取或目录遍历,最终获取flag。</think>### BUUCTF easy_serialize PHP 解题思路分析
#### 1. 题目背景与关键点
题目涉及PHP反序列化漏洞,需通过构造序列化数据触发文件读取或目录遍历,最终获取flag。根据引用内容,重点如下:
- **序列化与过滤**:代码可能对序列化数据进行了字符串替换(如引用2中的`filter`函数),需绕过过滤规则[^2]。
- **目录信息**:flag可能位于目录`1aMaz1ng_y0u_c0Uld_f1nd_F1Ag_hErE`下(引用4)[^4]。
- **类与魔术方法**:需利用类(如`FilesystemIterator`)遍历目录或读取文件(引用4)[^4]。
#### 2. 解题步骤
**步骤1:分析过滤规则**
假设代码中存在字符串替换逻辑,例如将`"php"`替换为空。构造属性名时需利用替换规则,例如:
- 原属性名设计为`userphpname`,过滤后变为`username`,从而覆盖原有属性。
**步骤2:构造恶意序列化数据**
假设需覆盖`para`属性为flag路径:
```php
class A {
public $class = "FilesystemIterator";
public $para = "/var/www/html/1aMaz1ng_y0u_c0Uld_f1nd_F1Ag_hErE";
public $check = null;
}
$payload = serialize(new A());
// 输出:O:1:"A":3:{s:5:"class";s:18:"FilesystemIterator";s:4:"para";s:49:"/var/www/html/1aMaz1ng_y0u_c0Uld_f1nd_F1Ag_hErE";s:5:"check";N;}
```
**步骤3:绕过过滤**
若代码将`"php"`替换为空,需确保序列化后的字符串仍有效。例如:
- 属性名设计为`phphpp`,替换后变为`php`,避免格式错误。
**步骤4:触发文件读取**
利用反序列化后的`FilesystemIterator`遍历目录,结合`file_get_contents`读取flag文件:
```php
// 伪代码示例
$data = unserialize($_SESSION['img']);
$path = base64_decode($data->para);
$flag = file_get_contents($path . "/flag.txt");
```
#### 3. 完整Payload示例
假设需通过`$_SESSION['img']`传递序列化数据,并触发路径覆盖:
```php
O:1:"A":3:{s:5:"class";s:18:"FilesystemIterator";s:4:"para";s:49:"/var/www/html/1aMaz1ng_y0u_c0Uld_f1nd_F1Ag_hErE";s:5:"check";N;}
```
若存在`php`替换过滤,可调整属性名为`clphpass`,确保过滤后仍为`class`。
#### 4. 引用关键点
- 利用`FilesystemIterator`遍历目录(引用4)。
- 通过反序列化链触发文件读取(引用2)。
---
阅读全文
相关推荐



















