PHP超全局变量
在php中预定义了九大超级全局变量,它们在一个脚本的全部作用域中都可用。这意味着我们不用进行特殊的说明,就可以在函数及类中使用。
- $GLOBALS : 一个包含了全部变量的全局组合数组。变量的名字就是数组的键
- $_SERVER : 一个包含了头信息、路径、脚本位置等信息的数组
- $_GET : 用于收集提交 HTML 表单,传参方式为 get 的表单数据
- $_POST : 同样收集提交 HTML 表单,但是传参方式为 post
- $_REQUEST : 具有 get 和 post 二者的功能。
- $_FILES : 用于文件的接收处理
- $_COOKIE : 用于获取与setCookie()中的name 值
- $_SESSION : 用于存储有关用户会话的信息,或更改用户会话的设置
- $_ENV : 是一个包含服务器端环境变量的数组,可以在PHP 程序的任何地方直接访问它
PHP可变变量
所谓可变变量就是一个变量以另外一个变量的值作为变量名
可变变量是php中的一个特殊变量,在其他语言中也是十分少见。鄙人也是第一次见到这种类型的变量,还是太菜了 /(ㄒoㄒ)/~~
使用下面的代码来可能会更清楚
可以看到 $$b 输出的结果为 123,从而能够解释变量a以变量b的值作为变量名
CTF
了解超全局变量和可变变量之后,再来看一道php代码审计的CTF
题目:
<?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);");
}
?>
首先正则表达式匹配都是字母的字符串,之后使用eval()执行输出可变变量args的命令 所以我们就要给 $$args 赋值一个变量名,那么就要用到PHP的九大超全局变量
将args赋值为$GLOBALS超全局变量,就会输出包含全部变量的数组,从而出现flag
|