首先看一下源码:
flag In the variable ! <?php
error_reporting(0); // 关闭php错误显示
include "flag1.php"; // 引入flag1.php文件代码
highlight_file(__file__); //对文件进行语法高亮显示
if(isset($_GET['args'])){ // 条件判断 get方法传递的args参数是否存在
$args = $_GET['args']; //赋值给变量 $args
if(!preg_match("/^\w+$/",$args)){ // /^开始, \w表示任意一个单词字符,即[a-zA-Z0-9_] ,+将前面的字符匹配一次或多次,$/结尾
die("args error!"); //输出 args error!
}
eval("var_dump($$args);"); // 将字符串作为php代码执行结尾加分号 var_dump()函数 显示关于一个或多个表达式的结构信息,包括表达式的类型与 值。数组将递归展开值,通过缩进显示其结构。$$args 可以理解为$($args)
}
?>
$$args的意思是将变量$args的值作为一个变量
题目已经通过正则表达式对$args进行了过滤,不能上传一句话木马等思路
我们可以使用超全局变量$GLOBALS,因为PHP在$GLOBALS[index]数组中储存了所有全局变量,变量的名字就是数组的键;
var_dump($$args)=var_dump($GLOBALS),将所有的变量的以数组的方式输出,得到flag
|