ctf show web入门123

这是一道典型的 PHP 代码审计与绕过题。核心目标是通过构造特殊的 POST 和 GET 请求,绕过极其严格的正则表达式与长度限制,最终执行代码并输出 $flag。

本来是要通过echo flag来得到flag但是!isset(flag来得到flag但是!isset(flag来得到flag但是!isset(_GET'fl0g')和if($fl0g==="flag_give_me")前后矛盾了,最后不能够通过echo flag来解决本题,但是还有一个eval()函数,我们通过eval()函数来执行我们传入的flag来解决本题,但是还有一个eval()函数,我们通过eval()函数来执行我们传入的flag来解决本题,但是还有一个eval()函数,我们通过eval()函数来执行我们传入的c

首先我们要满足

php 复制代码
if(isset($_POST['CTF_SHOW']) && isset($_POST['CTF_SHOW.COM']) && !isset($_GET['f10g']))

要求CTF_SHOW,CTF_SHOW.COM,必须存在而fl0g必须不存在

注意: PHP 在解析全局变量时,会将非法字符(如点号 .)自动转换为下划线 ,[ 会转换为 并且一旦已经进行了一次"非法字符检查"后就不会再进行检查,所以后面的.就保留了下来。(类似于双写绕过)

在 PHP 中,POST 传入 CTF_SHOW.COM=1 会被解析为 POST′CTFSHOWCOM′,导致isset(_POST'CTF_SHOW_COM',导致 isset(POST′CTFSHOWCOM′,导致isset(_POST'CTF_SHOW.COM') 失败。

绕过方法:使用 CTF[SHOW.COM=1。PHP 在解析时,遇到 [ 会将其转换为 _,但随后会停止转换后面的字符。因此 CTF[SHOW.COM 会被解析为 CTF_SHOW.COM

然后是正则表达式的限制和对$c参数长度的限制

php 复制代码
if(!preg_match("/\\\\|\/|\|\|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?/", $c) && strlen($c) <= 18)

未被过滤的常用符号:美圆符号 $、小括号 ()、方括号 \[\]、大于小于号 <>、冒号、空格

php 复制代码
eval("$c" . ";");
if($fl0g==="flag_give_me"){
    echo $flag;
}

当你传入 fun=echo flag(即 c 的值为 echo $flag)时,eval() 实际执行的字符串是:

php 复制代码
echo $flag;

所以payload为:

CTF_SHOW=1&CTF[SHOW.COM=1&fun=echo $flag

相关推荐
最爱老式锅包肉2 小时前
《HarmonyOS技术精讲-ArkWeb》桥接两岸:JSBridge原生与Web互调
前端·华为·harmonyos
IT_陈寒3 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
踩着两条虫3 小时前
可视化 vs 终端 vs 云端:VTJ.PRO、Claude Code、Codex 三强横评
前端·vue.js·人工智能·低代码·架构
kyriewen3 小时前
Godot 全面封杀 Vibe Coding,作为每天用 AI 写代码的人,我反而觉得这是件好事
前端·ai编程·claude
机智的张尼玛3 小时前
我基于 Kotlin Multiplatform 实现了一套跨平台的弱网离线同步引擎
android·开源·kotlin
前进的搬砖er3 小时前
4.three.js的几何体、纹理、光源、材质、uv属性 讲义
前端
前端毕业班3 小时前
uni-app 小程序支持 teleport 了
前端·javascript·vue.js
梨子同志4 小时前
qiankun
前端
梨子同志4 小时前
Nginx
前端
梨子同志4 小时前
NestJS
前端