英文全名即 Xml External Entity Injection, 即我们所说的 xml 外部实体注入攻击。
实体可以通过预定义在文档中被调用,而实体的标识符又可以访问本地或者远程内容,当允许引用外部实体时,攻击者便可以构造恶意内容来达到攻击。
XML:
xml
是一种可扩展的标记语言,主要就是用来传输数据的,你可以理解为就是一种写法类似于 html 语言的数据格式文档。但是 xml
跟 html
是为不同目的而设计的,html
旨在显示数据信息,而 xml
旨在传输数据信息。
DTD:
跟 xml
格式相关的就是这个叫 dtd
(document type definition )的东西了,这个 dtd
的作用就是去定义 xml
文档的合法构建模块,也就是说声明了 xml
的内容格式规范。
DTD的声明方式:
1、内部 dtd:即对 XML
文档中的元素、属性和实体的 DTD
的声明都在 XML
文档中。
2、外部 dtd : 即对 XML
文档中的元素、属性和实体的 DTD
的声明都在一个独立的 DTD
文件(.dtd)中。
内部DTD
的实例:
<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD,文档类型声明-->
<!DOCTYPE note [
<!ELEMENT note (body)>
<!ELEMENT body (#PCDATA)>
<!ENTITY writer "hello word">
]>
<!--文档元素-->
<note>
<body>&writer</body>
</note>
我们就 dtd
的内容一个一个来看,
1、!DOCTYPE note (第四行)定义此文档是 note 类型的文档。
2、!ELEMENT note (第五行)定义 note 元素有一个元素:“body "
3、!ELEMENT body (第六行)定义 body 元素为 " #PCDATA” 类型
4、!ENTITY writer " hello world"(第七行)定义了一个内部实体
最后 body 元素标签里的"&writer"
就是对内部实体的一个引用,到输出的时候 &writer
就会被 "hello world"
替换。
外部DTD
的实例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
<root>
<body>&xxe</body>
</root>
1、!ELEMENT foo ANY (第三行)定义元素为 ANY,即可以接受任何元素。
2、!ENTITY xxe SYSTEM “file:///c:/test.dtd”(第四行)定义了一个外部实体
这里样义文档就会对 c:/test.dtd 文件资源进行引用,这是一种用 SYSTEM 关键字的引用方式,还有一种用 PUBLIC 引用公用 DTD 的方式:
<!DOCTYPE 根元素名称 PUBLIC "DTD标识名" "公用DTD的URI">