XXE
0x01、XML
什么是XML?
XML 是可扩展标记语言(EXtensible Markup Language)
XML的特点
- 是一种标记语言
- 被设计来进行数据传输
- 可以自定义标签
- 具有层级结构
- 具有自我描述性
XML数据格式组成
- 声明
<?xml version="1.0" encoding="UTF-8"?>
-
元素/节点
- 根节点:有且只有一个根元素·
- 子节点:可以嵌套,可以重复
- 每个节点必须成对出现,空节点也必须成对出现
-
属性
-
每个元素/节点可以有多个属性
-
属性以键值对的方式出现:名称=“值”。属性的值添加双引号,多个属性以空格分开。
-
-
注释:
<!-- 注释内容 -->
示例
XML数据格式作用
- 简化数据共享
- 简化数据传输
- 简化平台变更
- 使数据更加有用
0x02、DTD基础知识
定义
DTD全称是The document type definition,即是文档类型定义,可定义合法的XML文档
它使用一系列合法的元素来定义文档的结构。DTD可以被成行的声明于XML DTD作用
作用
一个应用程序可以使用DTD来确认收到的XML数据是有效的
每个XML文件可以携带一个自身格式的描述。
不同组织的人可以使用一个通用DTD来交换数据。
分类
内部DTD、外部DTD和共有DTD
内部DTD
<?xml version="1.0"?>
<!DOCTYPE note[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
外部DTD
共有DTD
DTD实体
实体的概念:实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。
实体可在内部或外部进行声明。
DTD实体分类:内部实体、外部实体、参数实体
内部实体
外部实体
参数实体
<!ENTITY % 实体名称 [SYSTEM] "URL">
DTD定义
<!ENTITY % TAG_NAME "姓名|EMAIL|电话|地址">
<!ELEMENT 个人信息(%TAG_NAME;|生日)>
<!ELEMENT 客户信息(%TAG_NAME;|公司名)>
对参数实体的说明
1、参数实体只能在DTD中定义,DTD中引用;
2、参数实体和通用实体一样,参数实体也可以外部引用;
3、实体的声明中不能引用其他参数实体;
4、非参数实体只能在DTD中定义,在xml文档中引用。
DTD元素
0x03、XXE漏洞原理
XXE -“xml external entity injection”
“xml外部实体注入漏洞”
概括一下就是"“攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题”
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
0x04、XXE实操
以pikachu靶场为例实践XXE漏洞
现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。
pikachu靶机为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析
如何探测xxe漏洞?
抓包,如果是xml格式的body,则发送一个<元素>数据</元素>
能回显,就可能存在XXE漏洞