XXE漏洞浅析及CTF例题

这篇博客主要来分析一下XXE漏洞和它在CTF中出现的情况。

首先,我们来看一下什么是XML。

什么是XML

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

图片来源见水印

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

DTD(文档类型定义)

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

DTD 可以在 XML 文档内声明,也可以外部引用。 XXE漏洞也在于此。接下来,我们来分别介绍一下内部实体声明与外部实体声明。

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

 

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

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

 

XXE漏洞(XML External Entity)

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

如何构建外部实体注入

图片来源网络

任意文件读取

按照我们上面的理论,如果我们构造以上结构的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注入方法:

 

即可读出flag

发表评论

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