时效性
2025年8月3日
题目来源
题目描述
<?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){ // 正则表达式的意思是匹配任意 [A-Za-z0-9_] 的字符,就是任意大小写字母和0到9以及下划线组成
die("args error!");
}
eval("var_dump($$args);");
}
?>
Write up
所以我们只需给变量传一个全局数组变量就好了 所以我们构造 ?args=GLOBALS加到url后面
117.72.52.127:17081/?args=GLOBALS
注:此处全局变量的GLOBALS必须为大写!
总结
有时候使用可变变量名是很方便的。就是说,一个变量的变量名可以动态的设置和使用。一个普通的变量通过声明来设置,例如:
<?php$a = 'hello';?>
一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。在上面的例子中 hello 使用了两个美元符号($)以后,就可以作为一个可变变量的变量了。例如:
<?php$$a = 'world';?>
这时,两个变量都被定义了:hello 的内容是“world”。因此,以下语句:
<?phpecho "$a {$$a}";?>
与以下语句输出完全相同的结果:
<?phpecho "$a $hello";?>
它们都会输出:hello world。
所以当属输入GOBALS 的时候,该题会实际上输出var_dump出变量名为 GOBALS 的值