XXE(xml external entity injection):即xml外部实体注入漏洞,也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
XML由3个部分构成,它们分别是:
XML:可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。它的设计宗旨是传输数据,而不是显示数据。它的标签没有被预定义,需要自行定义标签。
可扩展标记语言(XML)和超文本标记语言(HTML)为不同的目的而设计:
- XML被设计用来传输和存储数据,其焦点是数据的内容。
- HTML被设计用来显示数据,其焦点是数据的外观。
XML使用元素和属性来描述数据。在数据传送过程中,XML始终保留了诸如父/子关系这样的数据结构。几个应用程序可以共享和解析同一个XML文件,不必使用传统的字符串解析或拆解过程。
XML总体是由元素(如
)组成;元素可以额外附加属性,需要提前定义;元素中可以引用实体,相当于变量,存在内置变量和自定义变量。例如:
<square width="100" /> &a; square>
元素 属性 实体
xml中的5个实体引用:
< <
> >
& &
" "
' '
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
DTD(文档类型定义)用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
当DTD存在于XML源文件中,由以下格式进行包裹,然后XML文件对于DTD的内容进行引用
DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Georgeto>
<from>Johnfrom>
<heading>Reminderheading>
<body>Don't forget the meeting!body>
note>
可以看到在DTD设置了一些变量,然后在xml文档中再使用到这些变量。这就是DTD与XML之间的使用方法。
从xml文件外部引入DTD:
DOCTYPE 根元素 SYSTEM "文件名">
例如:
DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Georgeto>
<from>Johnfrom>
<heading>Reminderheading>
<body>Don't forget the meeting!body>
note>
note.dtd文件:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
DTD可以声明元素、属性和实体:
(1)DTD声明元素
(2)DTD声明属性
基本格式:
例如:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
<square width="100" />
(3)DTD声明实体
(只在DTD中有效)
(只在DTD中有效)
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
<author>&writer;©right;author>
">
(1)输入个包含命名实体(内部实体)的xml数据。
DOCTYPE foo [
<!ENTITY xxe "仙女" > ]>
<foo>&xxe;foo>
foo
是元素,相当于html中的标签;
xxe
是实体,相当于一个变量,变量的值在DTD已经被赋值了,为“仙女”。
(2)通过抓包,可以看到:浏览器对xml数据进行url编码,以post方式发送给服务端。
xml
;simple_load_string()
转换形式良好的 XML 字符串为 SimpleXMLElement 对象,并且开启外部实体解析。(4)通过外部实体读取系统文件。
DOCTYPE foo [
]>
<foo>&xxe;foo>