XML外部实体(XXE)注入漏洞
XML外部实体(XXE)注入漏洞
XML
简介
XML 指可扩展标记语言(eXtensible Markup Language),是一种用于标记电子文件使其具有结构性的标记语言,被设计用来传输和存储数据。
构建模块
- 元素 元素是XML以及 HTML文档的主要构建模块,元素可包含文本、其他元素或者为空。
- 属性 属性可提供有关元素的额外信息,属性总是被置于某元素的开始标签中。例如:
,其中img为元素名,src为属性。 - 实体 实体是用来定义普通文本的变量。
- PCDATA PCDATA 的意思是被解析的字符数据(parsed character data) PCDATA是会被解析器解析的文本,这些文本将被解析器检查实体以及标记。
- DATA DATA的意思是字符数据(character data )。CDATA是不会被解析器解析的文本。
基本语法
XML 文档在开头有 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
的结构,这种结构被称为 XML prolog ,用于声明XML文档的版本和编码,是可选的,但是必须放在文档开头。
除了可选的开头外,XML 语法主要有以下的特性:
- 所有 XML 元素都须有关闭标签
- XML 标签对大小写敏感
- XML 必须正确地嵌套
- XML 文档必须有根元素
- XML 的属性值需要加引号
XML外部实体(XXE)注入
原理
当允许引用外部实体时,攻击者通过XML实体传递自己构造的恶意内容,发送给应用程序并执行
攻击方式
- 利用XXE来读取任意文件:定义一个包含文件内容的外部实体,并在应用程序的响应包中返回其内容
- 利用XXE来执行SSRF 攻击:根据后端系统的URL定义外部实体
- 利用XXE盲注带外数据泄露:敏感数据从应用服务器传输到攻击者控制的系统
- 利用XXE盲注通过报错信息来读取数据:通过触发XML解析错误,在返回的错误消息中包含敏感数据
危害
- 任意文件读取
- 执行系统命令
- 探测内网端口
- 攻击内网网站
- 发起DOS攻击
漏洞修复方法
XXE注入较为少见,修复也是比较简单的事,只需将预定义字符进行转义即可
预定义字符 | 转义后的预定义字符 |
---|---|
< | < |
> | > |
& | & |
' | ' |
" | " |