ISLab 2020结训赛WP

发布于 2020-08-13  882 次阅读


WEB

Trick Trick

index.php源码

<?php
error_reporting(0);
include "class.php";
highlight_file(__FILE__);


if (isset($_GET['last'])) {
    $last = $_GET['last'];
    if (!stristr($last, "flag")) {
        unserialize($last);
        echo "<br>"."you find it";
        // class is getF: public key
        // must key="flag"
    }
}

class.php源码

<?php
class getF
{
    public $key;
    public $flag = "flag{unserialize_have many_tricks!}";
    function __destruct()
    {
        if ($this->key === "flag") {
            echo $this->flag;
        }
    }
}

出题的目的是为了让同学们了解序列化后的字符串的表示格式

详情见:墨雨琪师傅的博客

a    -->array     --> a:1:{"1","abc"}
b    -->boolean   --> b:0;
d    -->double    --> d:1.2323;
i    -->integer   --> i:3;
s/S  -->string,S可以有16进制字符    --> s:3:"abc"; 或者 S:3:"\61bc"
O    -->class     --> O:1:"A":3:{s:4:"\00A\00a";N;s:4:"\00*\00b";N;s:1:"c";s:5:"hello";}
N    -->null      --> N;
r    -->对象引用   --> r:1 (数字为所引用的对象在序列化字符串中第一次出现的位置)
R    -->指针引用   --> R:1 (会修改指针指向的内容)

这道题就在反序列化之前,过滤flag字符,为了获得flag,需要反序列化后的key为flag 根据上面序列化的格式,我们可以看到可以用大写S,利用16进制绕过 最终payload: O:4:"getF":1:{s:3:"key";S:4:"\66lag";

EasySQL