天天看点

XXE攻击原理研究

XMLExternal Entity

附上Owasp对于XXE的相关说明

https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing

XXE 翻译过来是XML外部实体,XXE攻击一般是指XXE注入攻击

XXE 攻击的是XML这种标记格式,理论上所有XML进行配置或者作为传输的应用程序都会受到这种攻击

在2017年OWASP在Top 10 中将XXE攻击列为第四名

从此国内引发了XXE学习的热潮,一开始我并不感冒,因为这不是一个新的漏洞,在《黑客攻防技术宝典 WEB实战篇》中已经包含过这种攻击方式,在《白帽子讲web安全》中只是一笔带过

所以我并没有因为这个而打乱自己的学习计划,直到最近和Hr 聊天的时候,他们涉及到了这个话题,由此引发今天的这篇文章!

XML

在介绍攻击方法之前还是要介绍一下我们的“被害方”XML

http://www.w3school.com.cn/xml/index.asp

上面是一个学习XML的网站,大家可以学习一下XML的表现和传递数据的形式

XXE攻击原理研究

可以看到是一种树状结构,与HTML类似,表示方法都是在两个标签中表示数据

漏洞成因

与SQL注入,XSS的漏洞成因很相似,都是通过注入恶意字符,改变网站原本意图,从而达到某些目的。

在XSS防御的时候,防御方法就是把类似 < > “ 等字符转化为HTML实体,就是像 &lt; 这种形式,从而规避由恶意输入导致的用户资产损失。

XML为了保证自身的结构不被破坏,所以约定在 数据段使用 < & 都是非法的,如果想要使用都要替换为相应的实体字符

XXE攻击原理研究

从此引出 XML实体(DTD实体)

http://www.w3school.com.cn/dtd/dtd_entities.asp

在我看来,XML实体其实也就是其他语言中说的变量,准确来说可能更像是全局变量,这样说大家可能更好的理解

XXE攻击原理研究

从上面的图片,大家可以看出如何定义一个外部实体,并且给它“赋值”

最后就是在XML中如何调用它

<author>&writer;&copyright;</author>

这种调用方式和php中的变量差不多,

writer的值如果是“aaaa”,copyright的值如果是"bbbb",

最终的返回值就是 aaaabbbb

重点来了!!!

很多程序使用 XML作为传输格式,导致我们可以修改参数,提交任意XML,从而导致定义任何实体,并且做引用。

遗憾的是XML外部实体能做的事还挺多,可以读取文件,可以发起网络请求等等,我就以读取文件作为危害点来进行简单的讲述吧!

模拟情景

此处我们提交的是一个关键字,之后通过XML传输,最后页面会返回我们的关键字

原本我们提交的应该是<keyword>hahaha</keyword>

然而我们提交的是

<?xml version="1.0"encoding="utf-8"?>

<!DOCTYPE foo [

<!ENTITY filecontent SYSTEM"file:///etc/passwd">]>

<aaa>&filecontent;</aaa>

此时就会造成 /etc/passwd 文件的内容直接赋值给了filecontent

之后再由<aaa>这个标签调用这个变量,把内容显示了出来,从而造成了文件读取

看到这里之前,大家一定要把DTD的那个教程链接看了,其中的内容也就花费你20分钟,当你读完之后再来向下看就会清晰得多了

如果你看完了,这回我再说说DTD

通俗来讲,DTD其实就是给了一个规范,是我们的XML规范化,比如

XXE攻击原理研究

可以看到这个DTD 用!DOCTYPE来定义了note这个标签的内部内容规范

有四个元素

XXE攻击原理研究

之后给出了一个真实XML中的实现

XXE攻击原理研究

看到这里,大家应该已经能够明白DTD的作用以及简单的使用方法了

上面的例子中,DTD是被写入到XML源码中的,也就是通常说的内部文档类型声明,正常的内部文档类型声明没有什么问题

XML中还支持外部文档类型声明,也就是说定义了规则的DTD代码并没有写在XML文件中,可能是因为不想XML的文本太过臃肿或者其他的一些个原因

此时我们只需要在XML中做一条外部引用的语句,如下

XXE攻击原理研究

对比之前就会发现,这里使用SYSTEM语法来指定了一个外部的文档定义,文档定义的文件名称是note.dtd

下面我们来看看这个文件中的内容有哪些?

XXE攻击原理研究

可以看到就是之前XML中的那些内容,只不过用一个独立的文件进行了封装而已,并且在XML中进行了引用

看到这里,大家应该已经能够了解XML是如何进行外部文档声明的了

这个时候你在回去看我们之前的那个例子

模拟情景

此处我们提交的是一个关键字,之后通过XML传输,最后页面会返回我们的关键字

原本我们提交的应该是<keyword>hahaha</keyword>

然而我们提交的是

XXE攻击原理研究

此时就会造成 /etc/passwd 文件的内容直接赋值给了filecontent

之后再由<aaa>这个标签调用这个变量,把内容显示了出来,从而造成了文件读取

基于刚才的知识我们知道了:

提交的数据中首先定义了一个内部文档声明,对foo标签进行了规则的定义,

而对于foo的进行了元素声明(用[ ]扩起来的 )

声明的内容就是我们白色框中的,我们在这个位置添加了payload

这个payload是一个外部实体引用,特征就是SYSTEM

外部实体引用的是/etc/passwd 文件,而不是其他的DTD文件

注意:此处其实是可以很多种协议的,比如file, http, ftp

这些声明赋值给了foo,之后被<aaa>标签打印出来

此时大家应该就可以明白XXE漏洞产生的原因及其简单利用了吧!

-END-