



XXE(XML External Entity Injection, XML外部实体注入)是一个注入漏洞,并且注入的是XML外部实体。如果能注入外部实体并且成功解析,就会大大拓宽XML注入的攻击面。
在了解XXE漏洞之前我们先了解一下XML文档的基本语法。
1.XML
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、文档类型定义(可选)、文档元素,如图1-193所示。
图1-193 XML文档结构
2.DTD
DTD(Document Type Definition,文档类型定义)的作用是定义XML文档的合法构建模块。DTD可以在XML文档内声明,如图1-194所示。也可以外部声明,如图1-195所示。
图1-194 内部声明
图1-195 外部声明
实体又分为一般实体和参数实体,如图1-196所示。
图1-196 DTD实体
● 一般实体的声明语法:<!ENTITY实体名"实体内容">。
● 引用实体的方式:&实体名。
● 参数实体的声明格式:<!ENTITY%实体名"实体内容">,只能在DTD中使用。
● 引用实体的方式:%实体名。
1.读取任意文件
读取任意文件的示例代码如下。
由于这里使用的是php://input接收的参数,因此我们直接POST即可,Payload如下,利用结果如图1-197所示。
图1-197 读取Windows系统配置文件
2.执行系统命令
执行系统命令的示例代码同上,Payload如下。
需要在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能执行系统命令。
3.扫描与攻击内网服务
扫描与攻击内网服务的示例代码同读取任意文件,我们直接给出Payload如下。
XXE也有没有回显的时候,这时候我们要用到Blind XXE,示例代码如下。
我们需要一台安装了Apache等服务的服务器,在Web根目录下放置test.dtd文件,代码如下。
给出利用Payload,利用结果如图1-198、图1-199所示。
图1-198 引入外部dtd
图1-199 返回文件Base64编码后的内容