jsonpath-plus远程代码执行漏洞 CVE-2024-21534 ->CVE-2025-1302
字数 1799 2025-08-29 08:30:24
JSONPath-Plus 远程代码执行漏洞分析 (CVE-2024-21534 & CVE-2025-1302)
漏洞概述
JSONPath-Plus 是 JSONPath 的 JavaScript 实现,带有一些附加运算符。该软件包在受影响版本中存在远程代码执行 (RCE) 漏洞,原因是输入清理不当。攻击者可以利用不安全的默认模式使用方式在系统上执行任意代码,即使设置了 eval='safe'。
漏洞时间线
- CVE-2024-21534 - 初始漏洞
- CVE-2025-1302 - 对 CVE-2024-21534 补丁的绕过
- 最终修复 - 在 jsonpath-plus 10.3.0 版本中完全修复
环境搭建
测试环境配置
- 创建项目目录
- 初始化 Node.js 项目
- 安装基础依赖
- 安装多个版本的 jsonpath-plus:
- 10.0.0 (存在 CVE-2024-21534)
- 10.2.0 (存在 CVE-2025-1302)
- 10.3.0 (已修复)
- 创建
multi-version-server.js测试服务器
测试服务器将在 http://localhost:3000 上提供三个端点:
/query- 使用 jsonpath-plus 10.0.0 版本/query1- 使用 jsonpath-plus 10.2.0 版本/query2- 使用 jsonpath-plus 10.3.0 版本
漏洞复现
CVE-2024-21534 (v10.0.0)
- 构造恶意 payload
- 发送请求到
/query端点 - 成功触发 RCE
CVE-2025-1302 (v10.2.0)
- 构造绕过补丁的 payload
- 发送请求到
/query1端点 - 成功触发 RCE
- 尝试在
/query2(v10.3.0) 触发失败
漏洞分析
原始漏洞 (CVE-2024-21534)
问题根源:
- 没有对危险属性(如
constructor、__proto__等)的访问进行限制 - 可以直接通过对象的
constructor属性获取Function构造函数 - 可以执行任意 JavaScript 代码,导致远程代码执行漏洞
第一次修复及其绕过 (CVE-2025-1302)
修复方式:
- 添加了对危险属性的检查
- 限制了对
constructor等属性的访问
存在的问题:
- 只检查字符串类型的属性名
- 没有考虑 JavaScript 的类型转换机制
- 安全检查发生在类型转换之前
绕过原理:
- 使用数组形式提供属性名
- 黑名单检查无法直接匹配数组
- JavaScript 会自动调用数组的
toString()方法['constructor'].toString()返回"constructor"字符串
- 最终仍然可以访问
constructor属性
最终修复 (v10.3.0)
修复提交: 30942896d27cb8a806b965a5ca9ef9f686be24ee
修复要点:
- 使用
String()函数强制转换属性名 - 确保所有属性访问都经过字符串转换
- 添加了对
toString方法被重写情况的处理 - 实现了更严格的类型检查和异常处理
关键改进:
- 强制类型转换确保安全检查在正确的数据类型上执行
- 防止了通过数组或其他类型绕过检查的可能性
- 即使攻击者尝试使用特殊对象或重写方法,也能有效阻止漏洞利用
防御建议
- 立即升级到 jsonpath-plus 10.3.0 或更高版本
- 如果无法立即升级,实施以下缓解措施:
- 严格验证所有 JSONPath 表达式输入
- 禁用或限制使用可能执行代码的功能
- 在沙箱环境中运行 JSONPath-Plus 处理
- 审查应用程序中所有使用 JSONPath-Plus 的地方
- 监控可疑的 JSONPath 表达式模式
总结
JSONPath-Plus 的这两个漏洞展示了安全修复过程中常见的"补丁-绕过"循环。初始修复往往只解决表面问题,而攻击者可以通过深入理解修复逻辑和 JavaScript 特性找到绕过方法。最终修复通过强制类型转换和更严格的检查机制,从根本上解决了问题。这提醒开发者在修复安全漏洞时需要考虑所有可能的攻击向量和语言特性。