BugkuCTF变量1(全局数组)

正版writeup
题目代码

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);");
}
?>

代码审计:检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞
对代码进行分析:
第一点:
var_dump():打印变量的相关信息
正则表达函数:preg_match():用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。

语法:    preg_match (pattern , subject, matches);
			pattern:正则;	
			subject:需要匹配检索对象;
			match: 可选,存储匹配结果的数组,

error_reporting(0);// 关闭错误报告
PHP 有诸多错误级别,使用erro_reporting()函数可以设置在脚本运行时的级别。如果没有设置可选参数 level,error_reporting() 仅会返回当前的错误报告级别。
highlight_file() 函数对文件进行语法高亮显示。

语法:highlight_file(filename,return)
   			  filename 	必需。要进行高亮处理的 PHP 文件的路径。
  			  return 	可选。如果设置 true,则本函数返回高亮处理的代码。

第三点

/^\w+ / i / / /i 两个/ / 表明正则表达式的开始与结束; ^ 表示开始字符, 结束字符 \w 包含【a-z,A-Z,,0-9】中的字
符,+代表可以有一个,或多个\w 后面的一个i是不区分大小写,其实放在这里没用了,因为\w包含着
大小写 总的加起来意思是 以[a-z,A-Z,
,0-9]中的其中一个字符开始,中间可以有任意个[a-z,A-Z,,0-9]
字符,最后再以[a-z,A-Z,
,0-9]中的一个字符结束 比如适合的有:a,a09,a_01,001 不适合的有a-
5,@12,¥12,中文字符,这些都不在[a-z,A-Z,_,0-9]范围里面
i表示不区分大小写

对writeup:

?args=GLOBALS

可变变量:两个$$一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。
全局数组,可以在函数内部调用全局变量,

$GLOBALS[] 包含正在执行脚本所有超级全局变量的引用内容

$GLOBALS[];

最后的[]没有输入的问题:
这里的$args = $_GET[‘args’];将url里 的args=后的值赋给args,如下例

<?php echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!'; ?>

假设用户访问的是 http://example.com/?name=Hannes

以上例程的输出类似于:

Hello Hannes!

这里输出的是一串字符,个人想法是作为一段数组,因此,使用GLOBAL[]时,类似C的输入数组名

猜你喜欢

转载自blog.csdn.net/Sandra_93/article/details/83117265