打开页面:
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);");
}
?>
代码解读:
preg_match用于执行一个正则表达式匹配。
eval() 函数把字符串按照 PHP 代码来执行。
var_dump() 打印变量的相关信息
[\w+]表示匹配数字、字母、下划线和加号本身字符
思路:用户可控的变量只有args,但是经过了过滤,只允许是数字,字母与下划线的组合。
这里我们看到eval("var_dump($$args);");
语句中,var_dump中的变量有两个$
符,说明var_dump
中的变量名由$args
指定,而题目提示说flag在变量里,考虑到可以利用$GLOBLES
变量。
$GLOBALS — 是一个数组,包含了全局作用域中可用的全部变量。变量的名字就是数组的键。
payload:http://120.24.86.145:8004/index1.php?args=GLOBALS
得到flag。
p:代码执行漏洞,对$_GLOBALS变量的使用