1. 环境介绍
- PHP 7.0.30
- libxml 2.8.0
libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡。为了演示PHP环境下的XXE漏洞,本例会将libxml2.8.0版本编译进PHP中。PHP版本并不影响XXE利用。
2. 漏洞利用
利用vulhub漏洞环境,启动后,访问http://your-ip:8080/index.php
即可看到phpinfo,搜索libxml即可看到其版本为2.8.0。
该漏洞环境包含dom.php、SimpleXMLElement.php、simplexml_load_string.php等文件均可触发XXE漏洞。
以SimpleXMLElement.php为例:
(1) 查看其源码如下,
(2)php://input可以读取post请求中的 http body数据,构建如下payload以读取敏感文件信息。
其他环境同理可利用成功。
3.相关函数介绍
- loadxml()函数:解析xml标签字符串。
- new SImpleXMLElement($data),构建可操作的对象,$data是xml字符串。
- simplexml_load_string($data) ,转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元
- php://input是个可以访问请求的原始数据的只读流。可以读取http entity body中指定长度的值,由于Content-Length指定长度。
- php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini
- php://input 与 $HTTP_RAW_DATA读取的数据是一样的,都是只读取Content-Type的值不是multipart/form-data的数据。
- Content-Type: application/x-www-data-urlencoded时,php://input数据和$_POST数据相一致。$_POST是对php://input做了再封装。