PHP代码审计03之实例化任意对象漏洞 (2)

效果如下图,我们发现了flag.txt的文件。

PHP代码审计03之实例化任意对象漏洞


下一步,就是查看这个文件,获取flag。用到的内置类为SimpleXMLElement,上面简单的提到了一下,现在就来使用它来进行XXE攻击来查看flag.txt文件的内容。这里需要注意一点:要结合PHP流的使用,因为当文件中存在: < > & ' " 等符号时会导致XML解析错误。我们用PHP流进行base_64编码输出就可以了。
什么是PHP流呢?这里简单说一下,PHP提供了php://的协议允许访问PHP的输入输出流,标准输入输出和错误描述符,内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器,主要提供如下访问方式来使用这些封装器:

php://stdin php://stdout php://stderr php://input php://output php://fd php://memory php://temp php://filter

咱们用的最多的是php://input、php://output、php://filter。这里咱们就用php://filter,它是一个文件操作的协议,可以对文件进行读写操作,具体看下表:

PHP代码审计03之实例化任意对象漏洞


read参数值可为:

string.strip_tags: 将数据流中的所有html标签清除

string.toupper: 将数据流中的内容转换为大写

string.tolower: 将数据流中的内容转换为小写

convert.base64-encode: 将数据流中的内容转换为base64编码

convert.base64-decode:解码
这样是不是清楚许多了呢?那就构造如下payload:

?name=SimpleXMLElement&param=<?xml version="1.0"?><!DOCTYPE ANY [<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=http://www.likecs.com/phpstudy_pro/WWW/DMSJ/day3/flag.txt">]><x>%26xxe;</x>&param2=2

上面payload中的param2=2,实际上这里2对应的模式是 LIBXML_NOENT,具体效果如下图:

PHP代码审计03之实例化任意对象漏洞


解码一下,如下:

PHP代码审计03之实例化任意对象漏洞


我们拿到了flag。

小结

通过这篇文章的讲解,是不是对实例化漏洞和XXE漏洞有了更多的理解呢?下一篇文章会对strpos使用不当引发漏洞进行学习和分析,一起努力吧!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgpyd.html