XXE漏洞
一、xml基础
? XML 指可扩展标记语言,可以自定义标签
? XML 被设计用来传输和存储数据。
? XML 仅仅是纯文本
一个 XML 文档实例
#第一行是 XML 声明
<?xml version="1.0" encoding="ISO-8859-1"?>
#XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分
George
John
Reminder
Don't forget the meeting!
- DTD
? 文档类型定义(DTD)使用一系列合法的元素来定义XML文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。DTD声明始终以!DOCTYPE开头,空一格后跟着文档根元素的名称。
#内部的 DOCTYPE 声明(DTD 被包含在您的 XML 源文件中)
#外部文档声明(DTD 位于 XML 源文件的外部)
- 实体
? 实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
? 实体引用是对实体的引用。
? 实体可在内部或外部进行声明。
一个内部实体声明:
&writer;©right;
一个外部实体声明:
#语法
#声明实体
#引用实体
&writer;©right;
二、XXE漏洞
2.1 漏洞原理
? XXE (XML External Entity injection)XML 外部实体注入漏洞, 应用程序在解析XML 文件时没有过滤外部实体的加载,执行恶意内容,导致读取任意文件,命令执行和对内网的攻击。简单来说就是,DTD引用外部实体导致的漏洞。
注:xml的解析依赖libxml库,在libxml2.9之前的版本默认支持并开启了对外部实体的引用。
? 实体的url支持file://和ftp://等伪协议
xml漏洞代码
2.2 漏洞条件
? XXE漏洞实际中遇到的不多,CTF中可能比较常见
? 这种漏洞类型的前提:
- 服务端接收客户端提交的xml数据格式请求
- 服务端xml格式解析器本身格式/规则存在漏洞
2.3 漏洞利用
? 利用这个XXE攻击,可以任意读取目标靶机的文件、内网探测及攻击、命令执行等。
? xxe漏洞的主要特征:无论向服务端提交什么样的数据,服务端都会返回同样的结果(和XSS漏洞脚本类似)。
2.3.1 读取任意文件
通过加载外部实体,利用file://、php://等为协议读取本地文件
file://伪协议payload如下:
#第一部分:xml声明部分
<?xml version = "1.0"?>
#第二部分:文档类型定义DTD
#定义此文档是note类型的文档
#读取文件内容
#读取源码
]>
#将f这个实体进行调用
&f;
2.3.2 执行命令
要求PHP支持expect拓展,默认是没开的
expect://伪协议调用系统命令
<?xml version="1.0" encoding="utf-8"?>
]>
&xxe;
2.3.3 内网探测与攻击
如果端口开启,请求返回的时间会很快,并且会有服务的banner返回;
如果端口关闭,请求返回的时间会很慢,会返回报错信息。
- 探测内网服务器端口
<?xml version="1.0" encoding="utf-8"?>
]>
&xxe;
- 攻击内网机器
<?xml version="1.0" encoding="utf-8"?>
]>
&xxe;
2.4 XXE的防御
-
使用开发语言提供的禁用外部实体的方法
-
过滤用户提交的XML数据。过滤关键词: