<?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);"); } ?>
error_reporting(0);
- 这行代码关闭了错误报告,这意味着PHP将不会显示任何错误信息。这可能会隐藏一些重要的错误,使得调试和安全审查变得更加困难。include "flag1.php";
- 这行代码尝试包含名为flag1.php
的文件。这个文件可能包含一些变量定义或其他代码。highlight_file(__file__);
- 这行代码使用highlight_file
函数高亮显示当前脚本文件的源代码。__file__
是一个魔术常量,它返回当前文件的路径。if(isset($_GET['args'])){
- 这个if
语句检查$_GET['args']
是否存在。$_GET
是一个超全局数组,包含了GET请求的参数。$args = $_GET['args'];
- 如果args
参数存在,将其值赋给变量$args
。if(!preg_match("/^\w+$/",$args)){
- 使用preg_match
函数来检查$args
是否只包含单词字符(字母、数字和下划线)。如果不符合这个模式,preg_match
将返回false
。die("args error!");
- 如果$args
不符合预期的模式,脚本将终止执行并输出错误信息。eval("var_dump($$args);");
- 如果$args
通过验证,eval
函数将执行一个字符串作为PHP代码。这里,它尝试输出变量$args
所指向的变量的值。$$args
是一个变量的引用,它将根据$args
变量的值来确定要输出的变量名。
超全局变量:在全部作用域中始终可用的内置变量。
提示说flag在变量里面,经分析只要运行 eval("var_dump($$args);");,falg很有可能就会出来
$$args====>我们可以猜想$args很有可能是一个数组,应该想到的就是超全局变量$GLOBALS
他是用存储全局变量的,全局变量的值在这个超级全局变量里面是一个键值,相当于hashmap的键值对
全局变量可以通过变量名在$GLOBALS找到相对应的值。
eval()这个函数的作用是字符串里面的php代码按正常的php代码被执行
通过构造一个GET参数,直接传GET一个全局变量即可
原文链接:https://blog.csdn.net/weixin_43272781/article/details/95034922