XXE漏洞

XXE漏洞

基础知识:

1、xml:

XML 指可扩展标记语言
XML 被设计用来传输和存储数据
HTML 被设计用来显示数据

XML与HTML的主要差异:
XML不是HTML的替代。
XML和HTML为不同的目的而设计:
XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息,而XML旨在传输信息。

一个 XML 文档实例
XML 使用简单的具有自我描述性的语法:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

解释:
第一行是 XML 声明
<note> 描述文档的根元素
接下来 4 行描述根的 4 个子元素(to, from, heading 以及 body)
最后一行 </note> 定义根元素的结尾

XML 语法规则:
所有 XML 元素都须有关闭标签
XML 标签对大小写敏感
XML 必须正确地嵌套
XML 必须正确地嵌套
XML 的属性值须加引号

实体引用
在 XML 中,一些字符拥有特殊的意义。
如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。为了避免这个错误,请用实体引用来代替 "<" 字符:

<message>if salary < 1000 then</message>

在 XML 中,有 5 个预定义的实体引用:

<    <    小于
>    >    大于
&amp;    &    和号
&apos;    '    单引号
"    "    引号

2、DTD

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

01、内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>

一个实例:

<?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>

以上 DTD 解释如下:
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

02、外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 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>

这是包含 DTD 的 "note.dtd" 文件:

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

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

元素是 XML 以及 HTML 文档的主要构建模块。

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

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

大多数同学都了解这个 HTML 实体引用:" "。这个“无折行空格”实体在 HTML 中被用于在某个文档中插入一个额外的空格。
当文档被 XML 解析器解析时,实体就会被展开。
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

以下用案例重点说明下实体:

01、一个内部实体声明

语法:

<!ENTITY 实体名称 "实体的值">

例子:
DTD 例子:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:

<author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (😉。

02、一个外部实体声明

语法:

	<!ENTITY 实体名称 SYSTEM "URI/URL">

例子:

DTD 例子:

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

XML 例子:

<author>&writer;&copyright;</author>

3、XML Schema

XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD:

定义可出现在文档中的元素

定义可出现在文档中的属性

定义哪个元素是子元素

定义子元素的次序

定义子元素的数目

定义元素是否为空,或者是否可包含文本

定义元素和属性的数据类型

定义元素和属性的默认值以及固定值

下面这个例子是一个名为 "note.xsd" 的 XML Schema 文件,它定义了上面那个 XML 文档的元素:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
 
<xs:element name="note">
    <xs:complexType>
      <xs:sequence>
    <xs:element name="to" type="xs:string"/>
    <xs:element name="from" type="xs:string"/>
    <xs:element name="heading" type="xs:string"/>
    <xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>
 
</xs:schema>

note 元素是一个复合类型,因为它包含其他的子元素。其他元素 (to, from, heading, body) 是简易类型,因为它们没有包含其他元素。您将在下面的章节学习更多有关复合类型和简易类型的知识。

此文件包含对 XML Schema 的引用:

<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
 
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

元素是每一个 XML Schema 的根元素, 元素可包含属性。一个 schema 声明往往看上去类似这样:

<?xml version="1.0"?>
 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
 
...
...
</xs:schema>

代码解释:

显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema" 。同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs:

xmlns:xs="http://www.w3.org/2001/XMLSchema"

显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: "http://www.w3school.com.cn"。

targetNamespace="http://www.w3school.com.cn"

指出默认的命名空间是 "http://www.w3school.com.cn"。

	
xmlns="http://www.w3school.com.cn"

指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。

elementFormDefault="qualified"

在 XML 文档中引用 Schema:

<?xml version="1.0"?>
 
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
 
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

代码解释:

下面的片断:

xmlns="http://www.w3school.com.cn"

规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 "http://www.w3school.com.cn" 这个命名空间。

一旦您拥有了可用的 XML Schema 实例命名空间:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

您就可以使用 schemaLocation 属性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置:

xsi:schemaLocation="http://www.w3school.com.cn note.xsd"

注:学***E漏洞需要一定的xml基础知识,以上摘自w3c文档,详细教程参考w3c

XML教程

DTD

XSD

XSLT

XML DOM

xxe的原理与案例

XXE(XML External Entity Injection)即xml外部实体注入

当程序在解析XML输入时,允许引用外部实体,导致能够引用一个外部恶意文件,可导致执行系统命令、内网端口探测、文件读取,攻击内网服务、dos攻击等。以下用vwapp漏洞靶场进行读取文件的演示。

要对XXE漏洞进行验证,可以用BWAPP这款漏洞演示平台,buggy web Application是一个集成了web常见漏洞的开源web应用程序,目的是帮助安全爱好者及程序员研究安全漏洞,其中已经包含了100多种web漏洞

下载及安装教程:
BWAPP:一款非常好用的漏洞演示平台

安装好之后,Choose your bug 选择 XML External Entity Attacks (XXE)

img

Set your security level: 选择low

img

点击any bugs? 使用burpsuite抓包,在request中看到传输的xml数据:

img

img

xxe-1.php页面在向xxe-2.php页面传输数据过程中,其中的xml数据是可控的,也就是说可以构造恶意数据进行传输,添加一个外部实体在XML数据中进行实体调用,从而进行XXE攻击。

payload:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE copyright [
<!ENTITY attack SYSTEM "file:///etc/passwd">
]>
<reset>
<login>&attack;</login>
<secret>xxx</secret>
</reset>

img

xxe的修复与防御:

1、使用开发语言提供的禁用外部实体的方法

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

Python:

from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

2、过滤用户提交的XML数据

过滤关键词:<!DOCTYPE,<!ENTITY,SYSTEM,PUBLIC。

posted @ 2020-04-15 18:12  tomyyyyy  阅读(469)  评论(1编辑  收藏  举报