__wakeup函数漏洞随笔

__wakeup()函数漏洞利用随笔

<!-- php __wakeup() 函数漏洞分析,测试 -->
<!-- __wekup()函数是在反序列化操作时,unserialize()函数会先检查有没有存在
一个名为 __wakeup()的函数,如果存在,先执行 __wakeup()-->
<?php
class A{
    function __wakeup(){
        echo 'hello';
    }
}
// 反序列化一个类,__wakeup() 执行,输出 hello
$d =  unserialize('O:1:"A":0:{}');

// echo '<br/>'.serialize($d);
?>

<!-- __wakeup() 函数漏洞说明 -->

<?php

echo "<br/>";
class Student{
    public $full_name = "zhangsan";
    public $score = 150;
    public $grades = array();

    function __wakeup(){
        echo "__wakeup is invoked";
    }
}

$s = new Student();
// 输出Student 对象的序列化结果以及类型,长度
var_dump(serialize($s));
// 输出为 :string(86) "O:7:"Student":3:{s:9:"full_name";s:8:"zhangsan";s:5:"score";i:150;s:6:"grades";a:0:{}}" 


// 漏洞利用:当序列化结果(字符串)表示对象属性个数的值 大于 真实个数的属性值时,就会跳过 __wakeup() 函数的执行
// 构造payload:"O:7:"Student":5:{s:9:"full_name";s:8:"zhangsan";s:5:"score";i:150;s:6:"grades";a:0:{}}"

echo "<br/>";
// 如果属性值为 3 ,即为真实结果,输出 __wakeup is invoked ,随意改为大于 3 的值,页面无输出;
$stu = @unserialize('O:7:"Student":3:{s:9:"full_name";s:8:"zhangsan";s:5:"score";i:150;s:6:"grades";a:0:{}}');
?>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值