正版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+ 结束字符 \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的输入数组名