这是一道典型的 PHP 代码审计与绕过类型的 CTF 题目它的核心考点是PHP 的可变变量、引用传递 以及 利用 PHP 全局变量数组绕过正则限制。核心代码functiongetFlag($v1,$v2){eval($$v1 $$v2;);var_dump($$v1);}这里使用了v1和v1 和v1和v2也就是可变变量。例如如果 $v1 “a”那么 $$v1 就相当于 $a。eval(“KaTeX parse error: Expected EOF, got at position 6: v1 ̲v2;”); 的意思是让以 $v1 的值命名的变量强行引用指针指向以 $v2 的值命名的变量。随后 var_dump($$v1); 会把这个变量的值打印出来。我们的目标就是让它打印出存储在内存或某个变量中的 flag。但是这里对v1v2的输入存在严格的正则限制if(preg_match(/\~| |\|\!|\|\#|\\$|\%|\^|\|\*|\(|\)|\_|\-|\|\|\{|\[|\;|\:|\|\|\,|\.|\?|\\\\|\/|[0-9]|\|\/,$v1))被禁用的字符包括空格、数字0-9以及绝大多数特殊符号包括 $、_ 等。允许的字符基本上只剩下了大小写英文字母此外还对v1进行限制if(preg_match(/ctfshow/,$v1)){getFlag($v1,$v2);}在进入getflag前v1的值里面必须包含ctfshow这个字符串既然 include(“flag.php”); 被执行了flag 通常会被定义为一个变量例如 $flag。但在 PHP 中所有的全局变量都会被自动存储在超全局配置数组 $GLOBALS 中。如果我们能让KaTeX parse error: Cant use function $ in math mode at position 7: v1 指向 $̲GLOBALS那么 var_…v1) 就会把所有的全局变量包括 flag全部打印出来假设我们传入v1 ctfshowv2 GLOBALS带入 getFlag 函数后v1的值是ctfshow−v1 的值是 ctfshow-v1的值是ctfshow−$v1 代表变量ctfshowctfshowctfshowv2 的值是 “GLOBALS” - $$v2 代表变量 $GLOBALS执行 eval 语句就变成了$ctfshow$GLOBALS;接着执行var_dump($ctfshow);因为 $ctfshow 已经引用了GLOBALS这就等于vardump(GLOBALS这就等于 var_dump(GLOBALS这就等于vardump(GLOBALS);在 PHP 中$GLOBALS 是一个包含当前脚本中所有全局变量的全局组合数组。只要在当前页面中出现过、定义过的变量或者是系统自带的运行环境便利全都会在这个数组里所以flag就直接输出在当前页面中了flag为ctfshow{8fa1650c-3dfd-4645-8c3f-ca3c0ef9533d}
ctf show web入门111
发布时间:2026/6/10 12:52:46
这是一道典型的 PHP 代码审计与绕过类型的 CTF 题目它的核心考点是PHP 的可变变量、引用传递 以及 利用 PHP 全局变量数组绕过正则限制。核心代码functiongetFlag($v1,$v2){eval($$v1 $$v2;);var_dump($$v1);}这里使用了v1和v1 和v1和v2也就是可变变量。例如如果 $v1 “a”那么 $$v1 就相当于 $a。eval(“KaTeX parse error: Expected EOF, got at position 6: v1 ̲v2;”); 的意思是让以 $v1 的值命名的变量强行引用指针指向以 $v2 的值命名的变量。随后 var_dump($$v1); 会把这个变量的值打印出来。我们的目标就是让它打印出存储在内存或某个变量中的 flag。但是这里对v1v2的输入存在严格的正则限制if(preg_match(/\~| |\|\!|\|\#|\\$|\%|\^|\|\*|\(|\)|\_|\-|\|\|\{|\[|\;|\:|\|\|\,|\.|\?|\\\\|\/|[0-9]|\|\/,$v1))被禁用的字符包括空格、数字0-9以及绝大多数特殊符号包括 $、_ 等。允许的字符基本上只剩下了大小写英文字母此外还对v1进行限制if(preg_match(/ctfshow/,$v1)){getFlag($v1,$v2);}在进入getflag前v1的值里面必须包含ctfshow这个字符串既然 include(“flag.php”); 被执行了flag 通常会被定义为一个变量例如 $flag。但在 PHP 中所有的全局变量都会被自动存储在超全局配置数组 $GLOBALS 中。如果我们能让KaTeX parse error: Cant use function $ in math mode at position 7: v1 指向 $̲GLOBALS那么 var_…v1) 就会把所有的全局变量包括 flag全部打印出来假设我们传入v1 ctfshowv2 GLOBALS带入 getFlag 函数后v1的值是ctfshow−v1 的值是 ctfshow-v1的值是ctfshow−$v1 代表变量ctfshowctfshowctfshowv2 的值是 “GLOBALS” - $$v2 代表变量 $GLOBALS执行 eval 语句就变成了$ctfshow$GLOBALS;接着执行var_dump($ctfshow);因为 $ctfshow 已经引用了GLOBALS这就等于vardump(GLOBALS这就等于 var_dump(GLOBALS这就等于vardump(GLOBALS);在 PHP 中$GLOBALS 是一个包含当前脚本中所有全局变量的全局组合数组。只要在当前页面中出现过、定义过的变量或者是系统自带的运行环境便利全都会在这个数组里所以flag就直接输出在当前页面中了flag为ctfshow{8fa1650c-3dfd-4645-8c3f-ca3c0ef9533d}