题目
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);"); } ?>
error_reporting(0)关闭错误报告include文件包含,此时包含文件flag1.phphighlight_file(__file__);高亮代码,没啥用isset判断args参数是否存在,存在则将用户的输入赋值给它preg_match匹配正则表达式,/^(开始), \w表示任意一个单词字符,即[a-z,A-Z,0-9_] ,+将前面的字符匹配一次或多次,$/(结尾)。此时如果用户输入超出这里的范围,如输入符号是不被允许的die()函数输出一条消息,并退出当前脚本。此时如果用户输入不满足第二个if的正则表达式,则输出args error!flag In the variable !提示flag在变量中两个$$即把
args设置为可变变量。eval把括号里的内容当作代码执行
解题思路
- 利用文件包含打印出flag
- 利用题目的提示
flag In the variable获取flag
获取flag
采用思路一,行不通。正则判断条件不允许出现
.()等特殊符号,因为不满足正则条件,所以输入flag.php会直接返回args error!,所以无法通过执行system(cat flag1.php)等系统命令查看flag1.php
如果输入满足正则条件,是下面的结果,但无法和思路一结合起来
结合题目提示,利用可变变量,把所有的变量都打印出来即可获得flag
- 题目里面除了
args以及没有第二个变量,所以我们要使用默认存在的全局变量``$GLOBALS获得所有变量即获得flag,PHP 在名为$GLOBALS[index] `的数组中存储了所有全局变量。
- 题目里面除了
args=GLOBALS正好符合条件利用可变变量输出,最后得到flag。执行流程
- 用户输入
args=GLOBALS,根据第七行把GLOBALS赋给$args,满足第八行的判断,跳到evel执行var_dump($GLOBALS);

- 用户输入
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至1694933467@qq.com