什么是XML (Extensible Markup Language)
一种类似于HTML(超文本标记语言)的可扩展标记语言,可以用来标记数据、定义数据类型。XML语言没有预定义的标签,允许用户自定义标签和文档结构,XML 被设计用来传输和存储数据。
下面去学习XML的文档结构(怎么写):
- XML声明
- DTD文档类型定义(可有可无),用来约束一个XML文档的书写规范。
- 文档元素
<!-- 声明版本,编码格式 -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- 两个主机进行传输数据需要规范格式,当然与你自己进行交流就可以不需要 -->
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<!-- 这里怎么写没有限制 -->
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
DTD的基本语法 (Document Type Define 文档类型定义)
基础语法
<!ELEMENT 元素名 类型>
内部定义
<!DOCTYPE 根元素[
元素声明
<!ELEMENT 元素名 类型>
]>
外部实体
在DTD中定义外部实体,实体即为标签里的值,上面的都是内部实体,现在是外部实体,定义外部实体,就需要加上SYSTEM
<!ENTITY 实体名SYSTEM "file:///文件路径" >
这里就产生了漏洞利用
xxe是一个外部实体(ENTITY 的中文意思是实体),实体的值是来自于外部文件的,构成XML文件的外部实体漏洞。
下面我们还是通过代码的形式来了解漏洞,同时了解XML这门语言
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Person[
<!-- 这里就是一个内部实体,username是变量,也是实体名,张三丰即是值 -->
<!ENTITY username "张三丰">
<!-- 这里是一个外部实体,file是一个变量,变量的值是文件的内容 -->
<!ENTITY file SYSTEM "file:///C:/Windows/win.ini">
<!-- 但是我们在使用浏览器去访问的时候,没有将该文件的内容显示出来,这是出于安全的考虑,浏览器没有这样的功能 -->
]>
<!-- 那么我们就只能通过代码来解析文件数据 -->
<Person sex="男">
<name>&username;</name>
<resume>&file;</resume>
<age>101</age>
<address>
<city>十堰市 </city>
<distinct>武当山</distinct>
</address>
<job>武当派掌门人</job>
</Person>
问题又来了,我们自己不会写如何去解析文件的代码,怎么办嘞,看别人是怎么写的,这个别人就是pikachu靶场
先去查看xxe漏洞的源代码,路径
这里我加了注释,细细理解
这里已经给我们写好了payload,记得改一下
成功执行
上面是外部实体,下面是内部实体,当然外部实体是有危害性的
我们再详细的说说XXE漏洞
全称是“xml external entity ”,即XML外部实体注入
攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行
服务端接收和解析来自用户端的XML数据,而没有做严格的安全控制,从而导致xml外部实体注入
那怎么去防御呢
理论上的防御措施 (靠xml文件本身和加载xml文件的函数)
禁用外部实体
过滤和验证用户提交的xml数据
不允许xml中含有任何自己声明的dtd
实践有效的防御措施(加载xml的函数)
配置xml parser(xml解析器)只能使用静态dtd,禁止外来引入