目录
前言
XML基础知识
XML用途
XML内容
XML格式要求
XML格式校验
不同语言支持的协议
完整的XML内容
什么是XXE
案列演示
盲打-DNSLog
XXE 防御
前言
现在许多不同的客户端技术都可以使用XMl向业务应用程序发送消息,为了使应用程序使用自定义的XML消息,应用程序必须先去解析XML文档,并且检查XML格式是否正确。当解析器允许XML外部实体解析时,就会造成XXE漏洞,导致服务器被攻击。
XML基础知识
XML用途
XML可以同作于配置文件
XML可以用来交换数据
XML内容
XML的内容是怎样的呢?我们来一下样例。
XML格式要求
XML格式校验
XML有种格式校验类型叫做DTD
我们可以自定义DTD内容,以让这个XML文件里面该有哪些元素
我们也可以去定义实体,让别的XML文件来引用这个实体
实体的引用有两种,一种是内部实体引用:
还有一种就是外部实体引用:
我们可以看到这里通过file文件协议去访问了本机D盘上的资源,除了file协议,那我们还有哪些协议可以使用呢?
不同语言支持的协议
完整的XML内容
我们再来看一下一个完整的XML内容是什么样的:
什么是XXE
XXE
XXE(XML External Entity Injection)也就是XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml 库,而 libxml2.9 以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的XML文件时,未对XML文件引用的外部实体(含外部一般实体和外部参数实体)做合适的处理,并且实体的URL支持 file:// 和 ftp:// 等协议,导致可加载恶意外部文件 和 代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
接下来我们来看一串代码:
这串代码的含义是它有一个表单,它会接受从用户输入的内容,然后把他解析为XML,然后把它输出到浏览器里面。
然后我们将这串代码保存为xxe.php文件,并将其配置在我们的网站上,用浏览器打开它,效果如图下所示:
我们往里面放入一串内部实体的代码,看看会发生什么:
可以看到,点击提交后,它将我们的数据解析并显示在了浏览器上:
这里可以看到引用内部实体成功,那如果是外部实体呢?
可以看到这里是外部实体的引用,通过外部实体去引用我们在E盘下的in.txt文件。
可以看到,我们点击提交后,成功引用了外部实体:
那这里是不是任意读取了我们本机E盘下的文件呢?是不是就导致了XXE漏洞了呢?
XXE漏洞除了用来读取任意文件,还可以进行端口探测:
我们利用http协议去探测本机的3307端口有没有开放,如下出现报错,说明没有开放:
同样的,如果是3306端口呢?
结果点击提交后,显示正常,跟上面3307出现的报错情况一对比,可以看出3306端口是开放的。
我们还可以利用XXE漏洞去执行系统命令,不过这里有个前提,那就是你的php必须安装了expect扩展才可以执行系统命令。
XXE炸弹攻击,这种攻击方式是通过读取一个很大的随机任意文件,导致你的服务器服务中断:
案列演示
我们来看一下这个叫做XXE-Lab的靶场:
我们打开F12,在UserName和Password字段中输入1和1来查看Request信息:
如上所看到这里确实运用了XML文件来传递参数。
接下来我们打开BurpSuite,抓包分析:
抓到如下数据包:
从这里确实可以看出这里用了XML格式,那我们该如何去利用它呢?
首先第一步,我们要先添加上下面这串代码,来去读本机的文件:
然后第二步,我们要去引用这个外部实体,否则这串代码是不会被执行的:
然后我们放包,查看回显信息:
假设这里有一种情况,就是对方网站进行了限制,导致我们恶意执行的命令不会回显在我们的网页上,那我们遇上这种情况该怎么办呢?我们这里就运用到了一种攻击手法,叫做盲打-DNSLog。
盲打-DNSLog
首先我们输入这个网址,打开DNSLog平台:
点击Get SubDomain获取一个子域名:
然后我们构造如下的xml数据看看会发生什么:
可以看到这里通过DNS-Log平台产生了DNS解析的记录。
还有一种叫做盲打-http接口参数,写入文件。
这串代码是去读取公网下的一个evil.dtd文件。
我们再来看一下evil.dtd文件的内容:
这整串代码的整体思路就是首先去attacker.com网站上解析evil.dtd文件的内容。然后通过php协议通过base64编码去读取c盘下的system.ini文件信息,然后将其赋值给file,最后通过p接受这个file传参将其发送到http://192.168.142.135:8080端口上,这里的192.168.142.135:8080可以是我们攻击者的主机,这样我们就接收到了从目标服务器上回显的信息了。
XXE 防御
PHP :
添加上下面这串代码:
libxml_disable_entity_loader(true);
Java:
添加上下面这串代码:
DocumentBuilderFactory dbf
=DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
.Net:
ASP
Python
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=Fa
lse))
过滤用户提交的XML数据:
安装WAF等安全产品: