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的防御

  1. 使用开发语言提供的禁用外部实体的方法

  2. 过滤用户提交的XML数据。过滤关键词: