ctf show web入门123
2026/6/15 21:44:10 网站建设 项目流程

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


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

首先我们要满足

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参数长度的限制

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

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

eval("$c".";");if($fl0g==="flag_give_me"){echo$flag;}

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

echo$flag;

所以payload为:
CTF_SHOW=1&CTF[SHOW.COM=1&fun=echo $flag

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询