#7 XXE漏洞基础

作者: saya 分类: Web安全基础系列,XXE篇 发布时间: 2010-01-03 17:39

xml基础知识

要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成。XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

xml文档的构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:元素、属性、实体、PCDATA、CDATA

下面是每个构建模块的简要描述。

1,元素

元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。

实例:

<body>body text in between</body>

<message>some message in between</message>

空的 HTML 元素的例子是 “hr”、”br” 以及 “img”。

2,属性

属性可提供有关元素的额外信息

实例:

<img src=”computer.gif” />

3,实体

实体是用来定义普通文本的变量。实体引用是对实体的引用。

4,PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

5,CDATA

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。

DTD(文档类型定义)

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD 可以在 XML 文档内声明,也可以外部引用。

1,内部声明:<!DOCTYPE 根元素 [元素声明]> ex: <!DOCTYOE test any>

完整实例:

<?xml version="1.0"?>

<!DOCTYPE note [

  <!ELEMENT note (to,from,heading,body)>

  <!ELEMENT to      (#PCDATA)>

  <!ELEMENT from    (#PCDATA)>

  <!ELEMENT heading (#PCDATA)>

  <!ELEMENT body    (#PCDATA)>

]>

<note>

  <to>George</to>

  <from>John</from>

  <heading>Reminder</heading>

  <body>Don't forget the meeting!</body>

</note>

2,外部声明(引用外部DTD):<!DOCTYPE 根元素 SYSTEM “文件名”> ex:<!DOCTYPE test SYSTEM ‘http://www.test.com/evil.dtd’>

完整实例:

<?xml version="1.0"?>

<!DOCTYPE note SYSTEM "note.dtd">

<note>

<to>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

而note.dtd的内容为:

<!ELEMENT note (to,from,heading,body)>

<!ELEMENT to (#PCDATA)>

<!ELEMENT from (#PCDATA)>

<!ELEMENT heading (#PCDATA)>

<!ELEMENT body (#PCDATA)>

DTD实体

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

实体又分为一般实体和参数实体

1,一般实体的声明语法:<!ENTITY 实体名 “实体内容“>

引用实体的方式:&实体名;

2,参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 “实体内容“>

引用实体的方式:%实体名;

1,内部实体声明:<!ENTITY 实体名称 “实体的值”> ex:<!ENTITY eviltest “eviltest”>

完整实例:

<?xml version=”1.0″?>

<!DOCTYPE test [

<!ENTITY writer “Bill Gates”>

<!ENTITY copyright “Copyright W3School.com.cn”>

]>

<test>&writer;©right;</test>

2,外部实体声明:<!ENTITY 实体名称 SYSTEM “URI”>

完整实例:

<?xml version=”1.0″?>

<!DOCTYPE test [

<!ENTITY writer SYSTEM “http://www.w3school.com.cn/dtd/entities.dtd”>

<!ENTITY copyright SYSTEM “http://www.w3school.com.cn/dtd/entities.dtd”>

]>

<author>&writer;©right;</author>

在了解了基础知识后,下面开始了解xml外部实体注入引发的问题。

 

3种XXE不同攻击方式

Web/移动应用程序,Word处理器,Web服务和内容管理平台使用可扩展标记语言(XML)格式在人类可读和机器可读格式的系统之间存储和传输数据。如果未正确验证XML数据的输入,则可能使您容易受到许多不同类型的攻击,例如SQL注入,跨站点脚本,服务器端请求伪造,

本地文件读取,拒绝服务以及(此时的英雄) post)XML外部实体(XXE)注入攻击。本文主要关注使用XXE注入攻击的不同攻击场景。

什么是XXE?

XML外部实体(XXE)注入是一个严重的缺陷,允许攻击者读取服务器上的本地文件,访问内部网络,扫描内部端口或在远程服务器上执行命令。它针对解析XML的应用程序。

当包含对外部实体的引用的XML输入由弱配置的XML解析器处理时,会发生此攻击。攻击者通过在XML数据中嵌入恶意内联DOCTYPE定义来利用它。当Web服务器处理恶意XML输入时,实体将被扩展,这可能会导致攻击者访问Web服务器的文件系统,远程文件系统访问或通过HTTP/HTTPS建立与任意主机的连接。

 

示例攻击场景

  • 来自服务器的本地文件劫持
  • 通过文件上载功能访问服务器文件
  • 具有递归实体扩展的DOS攻击

 

攻击场景1:本地文件劫持服务器

当攻击者在请求中发送格式错误的XML payload时,服务器处理此payload并发回包含敏感信息的响应,例如服务器的本地文件,应用程序配置文件,内部网络详细信息等。在少数情况下,在使用精心设计的XXE payload提交HTTP请求时,服务器使用服务器的/etc/passwd/进行响应。

快照1:具有恶意INLINE DOCTYPE定义的HTTP请求 – 具有相应的响应

但是,在许多情况下,服务器可能不会发回响应。攻击者可以利用此方法的另一种方法是在XXE payload中包含URL(攻击者控制的服务器)。当服务器解析payload时,它会对攻击者控制的服务器进行额外调用,从而攻击者侦听受害者的服务器并捕获本地文件,服务器配置文件和其他服务器详细信息等信息。

以下图像(快照2和3)显示URL包含在XXE payload中。提交HTTP请求后,服务器会对攻击者控制的服务器进行额外调用。因此,攻击者侦听来自受害者系统的请求并捕获服务器详细信息(/etc/passwd/)

快照2:包含受攻击控制URL的HTTP请求

快照3:受害者的服务器向攻击者的服务器发出额外的呼叫

 

攻击场景2:通过“ 文件上载” 功能访问服务器文件

许多应用程序支持“文件上载”功能(XLSX,DOCX,PPTX,SVG或任何XML MIME类型格式)以供进一步处理。通常,这些文件具有XML MIME类型。攻击者可以利用固有的XML类型并上传嵌入了XXE payload的恶意文件。当服务器解析文件时,执行包含XXE有效载荷的文件,导致客户端服务器的敏感信息泄露。请注意,在站点的一部分上解析XML的库(例如API)可能与解析上载文件的库不同。

快照4:将XXE payload嵌入到Docx文件中.Docx(就像pptx和xlsx一样)本质上是Open XML(OXML)文件。

 

快照5:将恶意docx文件上载到(示例)应用程序

快照6:文件提交后,服务器会响应服务器/ etc / passwd的敏感信息

 

攻击场景3:使用递归实体扩展进行DOS攻击

这种攻击也称为Billion Laugh攻击,XML Bomb或递归实体扩展攻击。当解析器不断扩展其自身内的每个实体时会发生此攻击,这会使服务器过载并导致服务器关闭。

从上图中,我们看到当解析器开始解析XML文件时,最初是“&lol9;” 引用实体“lol9”来获取值,但“lol9”本身再次引用“lol8”实体。就像一个实体引用了十个实体一样,这十个实体再次引用其他实体。这样,当解析器扩展实体时,CPU的利用率会大幅增加,从而导致服务器崩溃并变得无响应。

 

结论

在OWASP排名前10位的2017年排行榜中排名第四,XXE并不是一个新的漏洞,而是一个在最近的应用程序中越来越受欢迎的漏洞。成功的XXE攻击可能会导致安全和业务功能方面的巨大损失。阻止XXE攻击的几种方法包括。

禁用外部实体。必要时,仅允许受限和受信任的外部链接

关闭XML中的实体扩展

仔细检查所使用的XML库的版本是否容易受到XXE的攻击。

在解析之前验证用户提供的外部/内部实体和INLINE DOCTYPE定义的输入。

 

补充:

https://www.cnblogs.com/r00tuser/p/7255939.html

https://xz.aliyun.com/t/3357

https://www.we45.com/blog/3-ways-an-xxe-vulnerability-could-hit-you-hard

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签云