1.代码审计部份
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);");
}
?>
flag In the variable ! 说flag在变量中
error_reporting(0); 关闭错误显示
include “flag1.php”; 引入flag1.php的代码
highlight_file(file); 高亮显示
if(isset($_GET['args'])){
$args = $_GET['args'];
判断参数args是否被传入值,若有则赋值给变量$args
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
匹配正则表达式,满足则强行结束程序,不满足则输出$$args中的内容。
2.知识点:
preg_match("/^\w+$/",$args)
执行正则表达式匹配
/^开始,\w表示任意一个单词字符,即[a-z][A-Z][0-9],+将前面的字符匹配一次或多次,$/结束。后面的args变量是被匹配的。相当于在args变量里寻找符合正则表达式的部分,若有则返回1,若没有则返回0。(相当于搜索子字符串)。
$$args
表示可变变量,可变变量是一种独特的变量,它允许动态改变一个变量名称。其原理是变量的名称由另外一个变量的值来确定,即一个可变变量获取了一个普通变量的值作为这个可变变量的变量名,实现过程是在变量前面多加美元符号 “$”举一个例子:
$a = "hello";//声明变量a
$hello = "world";//声明变量hello
echo $$a //输出world
3.思路分析
我们的目标是要拿到flag,因为有正则表达式的验证过程,所以我们没法利用本地包含漏洞查看flag1。而题目提示了flag在变量中,于是联想到PHP中$GLOBALS[index] 的数组中存储了所有全局变量,令args=GLOBALS正好符合条件利用可变变量输出,最后得到flag。
构造payload:
http://123.206.87.240:8004/index1.php?args=GLOBALS