当前位置: 首页 > news >正文

XPath 注入与修复

问题:

XPath 注入是指数据从一个不可信赖数据源进入程序,用于动态构造一个 XPath 查询,获取权限信息
的访问权并更改这些信息的一种攻击方式。
例如:以下代码片段中,可动态地构建并执行一个 XPath 查询,为指定的帐户 ID 检索电子邮件地址。
String acctID = request.getParameter("acctID");
String query = null;
if(acctID != null) {
StringBuffer sb = new StringBuffer("/accounts/account[acctID='");
sb.append(acctID);
sb.append("']/email/text()");
query = sb.toString();
}
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("accounts.xml");
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile(query);
Object result = expr.evaluate(doc, XPathConstants.NODESET);
正常情况下(例如搜索属于帐号 1 的电子邮件地址),此代码所执行的查询如下所示:
/accounts/account[acctID='1']/email/text()
如果攻击者为 acctID 输入字符串 1' or '1' = '1 ,则该查询会变成:
/accounts/account[acctID='1' or '1' = '1']/email/text()
附加条件 1' or '1' = '1 会使 where 从句永远评估为 true ,因此该查询在逻辑上将等同于一个更为简化的
查询:
//email/text()
这样就可以查询到文档中存储的所有电子邮件地址。
修复:
造成 XPath 注入的根本原因在于攻击者能够改变 XPath 查询的上下文,导致程序员期望解释为数据的
某个数值被解释为命令了。为了防止攻击者侵犯程序员的各种预设情况,可以使用白名单的方法,确保
XPath 查询中由用户控制的数值完全来自于预定的字符集合,不包含任何 XPath 元字符。如果由用户控制
的数值要求它包含 XPath 元字符,则使用相应的编码机制转义或删除这些元字符。
例如:以下代码片段中,将不可信赖的数据 acctID 转化为一个整形再用于构造 XPath 查询,避免了 XPath
注入攻击。
String acctID = request.getParameter("acctID");
String query = null;
if(acctID != null) {
Integer iAcctID = -1;
try {
iAcctID = Integer.parseInt(acctID);
}
catch (NumberFormatException e) {
throw new InvalidParameterException();
}
StringBuffer sb = new StringBuffer("/accounts/account[acctID='");
sb.append(iAcctID.toString());
sb.append("']/email/text()");
query = sb.toString();
}
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("accounts.xml");
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile(query);
Object result = expr.evaluate(doc, XPathConstants.NODESET);

相关文章:

  • 前端面经整理【2】
  • 12V,24V降5V,12V,输出大电流15A电源解决方案的理想选择WD5030A
  • 《单光子成像》第三章 预习2025.6.13
  • 二叉树的算法
  • Python 基础语法
  • 题目类型——左右逢源
  • 41.第二阶段x64游戏实战-封包-分析周围对象ID
  • 【Steel Code】8.4 PLATE GIRDER 钢板梁
  • RT_Thread内核源码分析(五)——内存管理@小堆内存管理算法
  • 自动化基础随心记三-zabbix
  • 麒麟信安支撑2025年电力监控系统安全运维新技能推广应用示范培训班顺利举办
  • libcuckoo 介绍和使用指南
  • 高通IPA硬件加速介绍
  • 【MV】上下文感知选择算法:基于关键词映射简单实现
  • 面试官:介绍一下测试中常用的工具有哪些?
  • ACCU-100安科瑞协调控制器:精准调控光伏逆变器
  • 暴雨亮相EAC2025分享热管理液冷技术
  • Matlab的GUI编程之一
  • MATLAB实现图像纹理特征提取
  • 力扣-322.零钱兑换
  • 百度网站建设费用多少知乎/昆明百度推广优化
  • 对单位网站建设的建议/百度新闻下载安装
  • 超低价的郑州网站建设/百度空间登录入口
  • 做门窗投标网站/百度广告位
  • 下载网页图片/关键词优化价格表
  • 网站优化怎么做效果才好/网站seo课设