本文首发于先知社区
前言:
最近做了一道WEB题,涉及到XML外部实体注入(即XXE漏洞),恰好也没有系统的学习过,这次就了解一些其攻击方式包含的原理,并通过WEB题来实战一番。
0x01:简单了解XML
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 被设计为传输和存储数据,其焦点是数据的内容
XML 被设计用来结构化、存储以及传输信息
XML 允许创作者定义自己的标签和自己的文档结构
XML的优点:
xml
是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制,非常适合Web传输,而且xml有助于在服务器之间穿梭结构化数据,方便开发人员控制数据的存储和传输。
XML的特点及作用:
特点:
1. xml与操作系统、编程语言的开发平台都无关
2. 实现不同系统之间的数据交互
作用:
1. 配置应用程序和网站
2. 数据交互
而且在配置文件里边所有的配置文件都是以XMl
的格式来编写的,跨平台进行数据交互,它可以跨操作系统,也可以跨编程语言的平台,所以可以看出XML是非常方便的,应用的范围也很广,但如果存在漏洞,那危害就不言而喻了。
XML语法、结构与实体引用:
语法:
1.XML元素都必须有关闭标签。
2.XML 标签对大小写敏感。
3.XML 必须正确地嵌套。
4.XML 文档必须有根元素。
5.XML 的属性值须加引号。
结构:
1.XML 文档声明,在文档的第一行
2.XML 文档类型定义,即DTD,XXE 漏洞所在的地方
3.XML 文档元素
如:
实体引用:
在 XML 中一些字符拥有特殊的意义,如果把字符 <
放在 XML 元素中,便会发生错误,这是因为解析器会把它当作新元素的开始。
例如:
<message>hello < world</message>
便会报错,为了避免这些错误,可以实体引用来代替 <
字符
<message>hello < world</message>
XML
中,有 5 个预定义的实体引用,分别为:
上面提到XML 文档类型定义,即DTD,XXE 漏洞所在的地方,为什么这个地方会产生XXE漏洞那,不要着急,先来了解一下DTD。
0x02 了解DTD:
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
优点:
有了DTD,每个XML文件可以携带一个自身格式的描述。
有了DTD,不同组织的人可以使用一个通用DTD来交换数据。
DTD文档的三种应用形式:
1.内部DTD文档
<!DOCTYPE 根元素[定义内容]>
2.外部DTD文档
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
3.内外部DTD文档结合
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
例如:
上半部分是内部DTD文档,下半部分是XML文档
#PCDATA(Parsed Character Data)
,代表的是可解析的字符数据,即字符串
下面再举一个外部DTD文档的例子:
新建一个DTD文档,文件名叫LOL.dtd
,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT game (lol, dota, dnf)>
<!ELEMENT lol (#PCDATA)>
<!ELEMENT dota (#PCDATA)>
<!ELEMENT dnf (#PCDATA)>
再新建一个XML文档,加入外部DTD文件的名称(同一个路径下只给出文件名即可)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE game SYSTEM "LOL.dtd">
<game>
<lol>a</lol>