CTF-PHP2

  1. 题目
  2. 解题思路
  3. 获取flag

题目

  • 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.php

  • highlight_file(__file__);高亮代码,没啥用

  • isset判断args参数是否存在,存在则将用户的输入赋值给它

  • preg_match匹配正则表达式,/^(开始), \w表示任意一个单词字符,即[a-z,A-Z,0-9_] ,+将前面的字符匹配一次或多次,$/(结尾)。此时如果用户输入超出这里的范围,如输入符号是不被允许的

  • die() 函数输出一条消息,并退出当前脚本。此时如果用户输入不满足第二个if的正则表达式,则输出args error!

  • flag In the variable !提示flag在变量中

  • 两个$$即把args设置为可变变量。

    • 可变变量介绍
  • eval把括号里的内容当作代码执行

解题思路

  1. 利用文件包含打印出flag
  2. 利用题目的提示flag In the variable获取flag

获取flag

  1. 采用思路一,行不通。正则判断条件不允许出现.()等特殊符号,因为不满足正则条件,所以输入flag.php会直接返回args error!,所以无法通过执行system(cat flag1.php)等系统命令查看flag1.php

    • 返回error
    • 如果输入满足正则条件,是下面的结果,但无法和思路一结合起来

    • 返回null
  2. 结合题目提示,利用可变变量,把所有的变量都打印出来即可获得flag

    • 题目里面除了args以及没有第二个变量,所以我们要使用默认存在的全局变量``$GLOBALS获得所有变量即获得flag,PHP 在名为 $GLOBALS[index] `的数组中存储了所有全局变量。
  3. args=GLOBALS正好符合条件利用可变变量输出,最后得到flag。

  4. 执行流程

    1. 用户输入args=GLOBALS,根据第七行把GLOBALS 赋给$args,满足第八行的判断,跳到evel执行var_dump($GLOBALS);

    writeup


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