在周日刚结束的红帽杯比赛中,很遗憾的是,一道web题,都没有做出来,总结一下就是,突发性的神智不清导致很多原本应该有思路做出来的题目都是打开就放弃。例如这次的XXE,提示都到脸上了就是没想到,那么为了开始准备下一次的比赛,现在开始慢慢的会写一些类似的学习笔记(当然因为懒,有的并不会写),就当是整理一下,记忆一下
那么为了方便实验,首先搭建一个xxe漏洞的环境,直接上github找就好了
github地址:https://github.com/c0ny1/xxe-lab
下载完之后,直接将文件夹部署到php环境中就好了
开启抓包工具 burpsuite
,抓取一下数据看结构
看到类似这样的包结构,都可以尝试用xxe漏洞,当然不同编程语言写的页面,解析出来的结果也不一样,这里针对PHP环境
那么接下来就是构造语句的问题了
这里就得提一下DTD这个东西了
DTD又称为 DOCTYPE声明
、 DocumentTypeDefinition文档类型定义
,它的作用是用于定义一些我们自己定义的标记的含义
举个例子, <eee></eee>
这个标签,我们可以定义它为某一个类型分别为
名称 | PCDATA | CDATA |
---|---|---|
介绍 | PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。 | CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开 |
它两者作用都相同,但是区别在于 PCDATA
和 CDATA
的针对特殊字符上的处理
在XML中,<>&这些是不合法的,例如
<elapse>you age > 18</elapse>
这其中的 >
会导致报错,而如果将 <elapse>
设置为 PCDATA
类型,那么他就会将这个标签中的内容转义成合法的字符串\<
实体如下
实体引用 | 字符 |
---|---|
\< | < |
\> | > |
\& | & |
\" | " |
\' | ' |
而CDATA会将它内容中的所有<>当成正常字符来处理,但是不会用于XML解析器
例如
在一个环境中确实需要用到<而不是\<,例如在编写sql查询语句,这是就可以使用CDATA类型,这时候xml解析器理都不带理一下这其中的所有内容,不会拿去解析
那么回到主题上,DTD的作用基本就是这些,去定义元素的类型
那么为啥要解释这个DTD呢,因为DTD可以去定义元素类型,反之,也可以利用它去定义实体,接着调用它,导致XXE漏洞,也就是实体注入漏洞
DTD中有一个写法
DTD 实例:
<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
XML example:
<author>&writer;©right;</author>
这是调用外部实例的写法,但是稍微改动一下
改动:
<!ENTITY writer SYSTEM "file:///etc/passwd">
XML example:
<author>&writer;</author>
那么这个时候,通过 file://
这个协议,他就会去读取本机上 /etc/passwd
这个文件内容,接着输出出来
除了 file://
外,还有其他的协议
libxml2 | PHP | Java | .NET |
---|---|---|---|
file | file | http | file |
http | http | https | http |
ftp | ftp | ftp | https |
php | file | ftp | |
compress.zlib | jar | ||
compress.bzip2 | netdoc | ||
data | mailto | ||
glob | gopher * | ||
phar |
当然你也可以通过 except://
来执行命令,只是多半情况下PHP都不会有这个插件(反正我挺少遇到能直接执行的)