XXE漏洞
XML外部实体注入(XML External Entity),简称 XXE 漏洞。
XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML 文档结构包括 XML 声明、DTD文档类型定义、文档元素。
DTD (Document Type Definition,文档类型定义),用来为 XML 文档定义语法约束。
攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题。
即服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
一段常见的 XML 语法结构:
看起来有点像 HTML 语言,不过 XML 是用来传输和存储数据,HTML 是用来显示数据。
文档类型定义可以是内部声明也可以用外部 DTD。
内部声明 DTD 格式:<!DOCTYPE 根元素 [元素声明]>
引用外部 DTD 格式:<!DOCTYPE 根元素 SYSTEM "文件名">
内部声明实体格式:<!ENTITY 实体名称 "实体的值">
引用外部实体格式:<!ENTITY 实体名称 SYSTEM "URI">
在 DTD 中进行实体声明时,将使用 ENTITY 关键字来声明。
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
还有其他的一些关键字:
DOCTYPE (DTD 的声明)
SYSTEM 、PUBLIC (外部资源申请)
——
——
XXE漏洞的危害
文件读取
命令执行
内网端口扫描
攻击内网网站
发起 dos 攻击
……
——
——
XXE漏洞的修复
禁止使用外部实体,例如 libxml_disable_entity_loader(true) 。
过滤用户提交的 XML 数据,防止出现非法内容。
——
——
下面通过 pikachu 靶场对 XXE 漏洞进行简单的测试
XXE漏洞测试
打开界面,可以看到一个输入窗口,如果随便输入的话,会回显错误。
先尝试输入:
<?xml version="1.0"?>
<!DOCTYPE note [ <!ENTITY b "text"> ]>
<name>&b;</name>
&b; 是用来将 b 这个实体进行调用,可以以看到 b 实体的内容 “text”成功在前端回显。( b 这个的名称是可以更改的)
再尝试用file协议读取本地文件 win.ini :
<?xml version="1.0"?>
<!DOCTYPE note [ <!ENTITY b SYSTEM "file:///C:/Windows/win.ini"> ]>
<name>&b;</name>
可以看到,成功回显文件里的内容。