题目描述
题目截图如下:
进入场景看看:
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);");
}
?>
解题思路
- 代码第一行就提示说:flag在变量中,那不就是要读取变量的值?
- PHP代码解读
相关工具
略
解题步骤
假装PHP代码审计一下:
-
error_reporting(0); 这行代码设置错误报告级别为0,也就是禁用错误报告。
-
include “flag1.php”; 这行代码用于包含一个名为"flag1.php"的文件。
-
highlight_file(_file_); 这行代码用于将当前文件的源代码进行语法高亮并输出到浏览器。
-
die(“args error!”); 这行代码输出错误信息"args error!"并终止程序的执行。
-
if(isset($_GET[‘args’])){} 这个条件判断语句检查是否存在名为"args"的GET参数。如果存在,则执行后面的代码块。
-
$args = $_GET[‘args’]; 这行代码将GET参数"args"的值赋给变量$args。
所以需要一个args参数来接收
/?args=
值是多少?看看preg_match解释.
- eval(“var_dump( $ $ args);”); 这行代码使用eval()函数将变量$args的值作为PHP代码执行,也就是通过var_dump()函数将$ args变量的值输出。
-
eval()函数,允许执行任意 PHP 代码
-
$$args表示以$args变量的值为变量名的变量(也就是$args的值应该是另一个变量的变量名)。,比如:
$change_name = "trans"
$trans = "you"
echo $change_name
echo "<br>"
echo $$change_name
输出:
trans
you
简单说就是:这段代码的功能是接受一个名为"args"的GET参数,将其作为变量名来进行求值,并将结果通过var_dump()函数输出到浏览器。
- 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文件中的变量
)。这怎么做到???
这时候就出现了全局变量、超全局变量!这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。
总不可能定义一个特别的变量,那么就可以将php九大超级全局变量一个一个试:
$_POST [用于接收post提交的数据]
$_GET [用于获取url地址栏的参数数据]
$_FILES [用于文件就收的处理img (最常见)]
$_COOKIE [用于获取与setCookie()中的name 值]
$_SESSION [用于存储session的值或获取session中的值]
$_REQUEST [具有get,post的功能,但比较慢]
SERVER[是预定义服务器变量的一种,所有SERVER[是预定义服务器变量的一种,所有_SERVER [是预定义服务器变量的一种,所有_SERVER开头的都
$GLOBALS [一个包含了全部变量的全局组合数组]`变量的名字就是数组的键`[不出意外就是你啦]
$_ENV [ 是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它]
先试试_REQUEST:
确实有反应,但是没有flag,再试试其他的,直到GLOBALS($GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。):
http://114.67.175.224:13462/?args=GLOBALS
得到Flag
flag{6df491b3ca68fc5d2afef2dfd0aea228}
新知识点
-
preg_match函数
-
var_dump()函数
<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
?>
输出:
array(3) {[0]=>int(1)[1]=>int(2)[2]=>array(3) {[0]=>string(1) "a"[1]=>string(1) "b"[2]=>string(1) "c"}
}
- isset 函数
- PHP 超级全局变量
本题重点是学习一下关于PHP的超级全局变量相关知识!
有用的话,请
点赞收藏评论
,帮助更多的同学哦