Bugku-变量1之浅谈超全局变量 $GLOBALS

    Bugku  变量一                   链接:http://120.24.86.145:8004/index1.php

    

代码审计

 代表关闭报错提示

包含文件 flag1.php

 对文件进行语法高亮显示

条件判断 get方法传递的args参数是否存在存在为真

  赋值给变量  $args

正则表达式判断

   正则表达式格式 为:开头 /^   结尾 $/   \w 代表任意大小写字母和数字  不包括特殊符号  +为匹配前一个字符一次或无数次

   if条件判断 $args 是否符合正则表达式格式   不符合返回true    (函数取反) 

   输出 args error!  

  eval()函数 将字符串作为php代码执行结尾加分号    

var_dump()函数 显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

    

如果是数组,就以数组的方式输出 变量类型+变量               本题就是以数组的方式输出。

 

 

$$args 可以理解为$($args)   

eg:

 $a="hello world!";

 $args="a";

 echo $$args;   输出结果为: hello world!  

介绍完每一行代码意思,我们来整理一下思路。

eval()函数存在命令执行漏洞  我们的目标是查看flag1.php中的flag 首先想到的是本地包含漏洞查看源码  或者上传一句话木马等思路 

            链接 http://120.24.86.145:8003/     这道题思路为上述所说。  

而本题条件判断加了正则表达式判断,过滤了括号和引号等字符。无法构造!  但输出时是   $$args

我们想到构造 php中超全局变量 $GLOBALS  

PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

可以看到$x和$y本身局部变量,未在函数体内声明,但是在全局变量$GLOBALS数组中存放着,可以调用,最后输出95。

构造         

eval("var_dump($$args);");    首先将 var_dump($$args); 当成代码执行   var_dump($GLOBALS);   

var_dump()函数将$GLOBALS数组中存放的所有变量以数组的方式输出 得到flag!

 

最后补充一点  很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然。

 前者为变量实体 后者为别名引用

eg:


$var1 = 1;
function test(){
unset($GLOBALS['var1']);
}
test();
echo $var1;
?>

因为$var1被删除了,所以什么东西都没有打印。

 


$var1 = 1;
function test(){
global $var1;
unset($var1);
}

test();
echo $var1;
?>
意外的打印了1。

证明删除的只是别名,$GLOBALS['var']的引用,起本身的值没有受到任何的改变。
验证了我们之前所说的东西 

 

 

你可能感兴趣的:(CTF)