打开环境,这里发现flag在变量中,那不就是要在变量中寻找flag嘛
解题思路
php代码解读
1.error_reporting(0); 这行代码设置错误报告级别为0,也就是禁用错误报告。
2.include “flag1.php”; 这行代码用于包含一个名为"flag1.php"的文件。
3.highlight_file(_file_); 这行代码用于将当前文件的源代码进行语法高亮并输出到浏览器。
4.die(“args error!”); 这行代码输出错误信息"args error!"并终止程序的执行。
5.if(isset($_GET[‘args’])){} 这个条件判断语句检查是否存在名为"args"的GET参数。如果存在,则执行后面的代码块。
6.$args = $_GET[‘args’]; 这行代码将GET参数"args"的值赋给变量$args。
明显的 get传参,而需要一个args参数来接受“ /?args=”
7.eval(“var_dump( $ $ args);”); 这行代码使用eval()函数将变量$args的值作为PHP代码执行,也就是通过var_dump()函数将$ args变量的值输出
eval函数是php中的危险函数,允许执行任意php代码
$$args表示以$args变量的值为变量名的变量(也就是$args的值应该是另一个变量的变量名)
8.if(!preg_match("/^\w+ / " , /", /",args)){ } :这个条件判断语句使用正则表达式检查$args变量的值是否符合\w+这个模式,也就是是否只包含字母、数字和下划线。如果不符合,则执行后面的代码块
/^\w+$/中
- 两个/ / 表明正则表达式的开始与结束,
- ^是开始字符,
- $是结束字符,
- \w 包含【a-z, A-Z, ,0-9】中的字符,
- +代表可以有一个或多个。
总的加起来意思就是 以[a-z,A-Z,,0-9]中的其中一个字符开始,中间可以有任意个[a-z, A-Z, ,0-9]字符,最后再以[a-z,A-Z,,0-9]中的一个字符结束 这是对args传入的参数的要求。题目这里就相当于以所有字母数字模式,匹配args变量。也就是说我们赋值的args变量的值(可能包含字母和数字)要出现在PHP文件中(但是我想不到是去找PHP文件中的变量)
要找变量只有尝试用全局变量,下面是php九大超级全局变量,然后一个一个尝试,会发现用GLOBALS该全局变量包括全局组合数组
1.$_POST [用于接收post提交的数据]
2.$_GET [用于获取url地址栏的参数数据]
3.$_FILES [用于文件就收的处理img (最常见)]
4.$_COOKIE [用于获取与setCookie()中的name 值]
5.$_SESSION [用于存储session的值或获取session中的值]
6.$_REQUEST [具有get,post的功能,但比较慢]
7.SERVER[是预定义服务器变量的一种,所有SERVER[是预定义服务器变量的一种,所有_SERVER [是预定义服务器变量的一种,所有_SERVER开头的都
8.$GLOBALS [一个包含了全部变量的全局组合数组]`变量的名字就是数组的键`[不出意外就是你啦]
9.$_ENV [ 是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它]
传入?args=GLOBALS参数就可以得到1,php文件下的全局变量了,而flag就在其中