题目出处:首页 - Bugku CTF
✨打开链接后你将会看到一段代码,如下所示:
✨首先,第一句话就提示你,flag就在这段代码中!!!
✨其次,对这段代码进行分析!!!
-
error_reporting(0);
:这行代码是用来关闭错误报告的,这样在执行脚本时就不会显示任何错误信息。 -
include "flag1.php";
:这行代码是用来包含一个名为"flag1.php"的文件。这个文件可能包含了一些重要的设置或者变量。 -
highlight_file(__file__);
:这行代码是用来高亮显示当前文件的源代码。__file__
是一个魔术常量,它返回当前文件的路径。 -
if(isset($_GET['args'])){...}
:这是一个条件判断语句,它检查是否设置了名为'args'的GET请求参数。如果设置了,就执行大括号内的代码。 -
$args = $_GET['args'];
:这行代码将GET请求参数'args'的值赋给变量$args。 -
if(!preg_match("/^\w+$/",$args)){...}
:这是另一个条件判断语句,它使用正则表达式检查$args是否只包含字母、数字和下划线。如果不是,就执行大括号内的代码。 -
die("args error!");
:这行代码用于终止脚本的执行,并输出一条错误信息"args error!"。
✨接下来,你就应该了解到args应该满足的正则匹配的内容是!!!
^:匹配输入字符串的开始位置
\w:包含下划线的任意单词字符
+:匹配前面的子表达式一次或多次
$:匹配输入字符串的结束位置
args只要是字母和下划线组成就行
✨所以我令args=flag,竟然发现NULL!!!
✨然后我令args=args,又发现输出了args的属性和内容---string(4) "args"!!!
✨最后就该考虑应该用哪一个变量了!!!
-
PHP中预定义超全局变量有:
$_GET : 通过 URL 参数传递给当前脚本的变量的数组。
$_POST : 通过 HTTP POST 方法传递给当前脚本的变量的数组
$_REQUEST :是 PHP 中的一个超全局变量,它包含了通过 HTTP GET、POST 和 COOKIE 方法发送的所有变量。
$_SERVER: 主要包含了Http请求行和消息头的信息,同时还有服务器自己的一些信息,比如DOCUMENT_ROOT, SCRIPT_FILENAME ..
$_ENV : 当我们希望获取服务器端的环境信息时,可以使用 $ENV
$_FILES : 与文件上传相关
$_COOKIE : 与COOKIE 相关
$_SESSION : 与SESSION相关
$GLOBALS : 一个包含了全部变量的全局组合数组。变量的名字就是数组的键,同时一个自定义的全局变量,也会自动的被$GLOBALS 管理
发现GLOBALS这个超全局变量(它在php中的作用还是很大的,记住这个变量,在bugku中做题会常用到),然后我就一试!!!
OK !!! 成功找出flag