【缺陷周话】第58期:XQuery注入
字数 976 2025-08-18 11:39:07
XQuery注入漏洞分析与防御指南
1. XQuery注入概述
XQuery是一种函数式语言,专门用于检索以XML格式存储的信息,能够从XML文档中查找和提取元素及属性。它常用于网络服务中提取信息、生成摘要报告以及数据转换等场景。
类似于XPath注入,XQuery注入攻击利用了XQuery解析器的松散输入和容错特性。攻击者通过在URL、表单或其他信息中附带恶意代码,当这些信息参与动态构造XQuery查询表达式时,就会造成XQuery注入漏洞。利用此漏洞,攻击者可以获得权限信息的访问权并更改这些信息。
2. XQuery注入的危害
XQuery注入可能导致以下严重后果:
- 访问存储在敏感数据资源中的信息
- 获取被入侵服务器的配置信息
- 绕过身份验证机制
- 非法获取或修改数据库中的敏感数据
3. 漏洞示例分析
3.1 缺陷代码示例
// 获取XML数据源对象
XMLDataSource ds = new XMLDataSource();
ds.setDataSourceName("xdb");
// 获取用户输入
String username = request.getParameter("username");
String password = request.getParameter("password");
// 连接数据源
XQConnection conn = ds.getConnection();
// 动态构造XQuery查询表达式
String query = "for $user in doc(users.xml)//user[username='" + username +
"' and pass='" + password + "'] return $user";
// 执行查询
XQExpression expr = conn.createExpression();
XQResultSequence result = expr.executeQuery(query);
3.2 攻击原理分析
正常情况下,查询表达式如下:
for $user in doc(users.xml)//user[username='test_user' and pass='pass123'] return $user
当攻击者输入admin' or 1=1 or ''='作为用户名时,查询变为:
for $user in doc(users.xml)//user[username='admin' or 1=1 or ''='' and password='x' or ''=''] return $user
这个表达式会永远评估为true,等同于:
//user[username ='admin']
从而绕过用户名与密码的匹配验证,直接返回管理员用户信息。
4. 漏洞修复方案
4.1 参数化查询修复
// 使用declare语法声明变量
String query = "declare variable $username as xs:string external;" +
"declare variable $password as xs:string external;" +
"for $user in doc(users.xml)//user[username=$username " +
"and pass=$password] return $user";
XQExpression expr = conn.createExpression();
// 绑定变量到查询
expr.bindString(new QName("username"), username, null);
expr.bindString(new QName("password"), password, null);
XQResultSequence result = expr.executeQuery(query);
4.2 其他防御措施
-
输入验证:
- 创建安全字符串白名单,限制用户只能输入列表中的数据
- 对输入进行严格格式验证
-
输入净化:
- 过滤特殊字符:
'、[、=、&等 - 特别注意处理以下函数:
fn:doc()fn:collection()xdmp:eval()xdmp:value()
- 过滤特殊字符:
-
最小权限原则:
- 数据库连接使用最小必要权限账户
- 限制XQuery执行环境的权限
5. 检测与工具
使用静态代码分析工具(如奇安信代码卫士)可以检测XQuery注入漏洞。工具会:
- 识别动态构造的XQuery查询
- 跟踪用户输入的数据流
- 标记未经验证或净化的输入参与查询构造的位置
6. 最佳实践总结
- 优先使用参数化查询:避免字符串拼接构造查询
- 实施严格的输入验证:白名单优于黑名单
- 进行输入净化:过滤或转义特殊字符
- 采用安全编码规范:建立安全的XQuery使用标准
- 定期安全审计:使用自动化工具检查代码
- 错误处理:避免泄露敏感信息给攻击者
通过以上措施的综合应用,可以有效预防和防御XQuery注入攻击,保护XML数据存储的安全。