0%

MAR DASCTF2021

MAR DASCTF2021

平台好卡,环境时不时就访问不上了。卡到不想做题。。。感觉题目也有点莫名其妙的

baby_flask

很容易验证是SSTI,先fuzz一遍过滤的字符# "'.0123456789:[\_ config chr request pop大概测出来这些,不给用引号数字点号右括号下划线和几个函数,访问属性可以用attr()|attr()这样子绕,不过下划线这些关键字符还是得想办法搞出来,并且没了数字chr和引号也不好凑字符串了
以前看到过”%c”%num这种方法进行格式化字符串来拼字符的,现在的问题就在于引号没得数字没得,凑不出来,看到这么文章上写了这么个东西
{%set pc = g|lower|list|first|urlencode|first%} 取得%
用set定义一堆变量开始慢慢拼,g是flask一个奇怪的模块,g|lower|list|first会获得一个字符<,其URL编码为%3C,直接一波获得%c两个字符
{%set c = g|lower|list|first|urlencode|last|lower%} 取得c
{%set udl=(pc,c)|join%}
得到”%c”字符串,接下来就要想办法获取数字了,可以像上面的方法如法炮制url反复编码拿到数字,也可以用bool变量加加减减获得数字{%set one=-(False-True)%},然后一路加法获得所有数字
最后通过{%set a=udl%((nine|string, seven|string)|join|int) %}这样子获得
最后的最后凑齐字母表再一个个join起来通过attr()形式命令执行

ps

在模板引擎里面|感觉就是个管道符,也有点像.操作符,可以一层层调用函数套娃的感觉
还看到有个大哥使用奇怪编码方式的数字直接绕过对数字的限制打通

BestDB

很简单的SQL注入,过滤了flag,update,drop单引号空格什么的,mysql数据库给的root账户
过滤约等于没有,空格直接/**/都能绕,flag不能用就转16进制也能读
平台及其卡,幸好是union注入,盲注可能这辈子都注不出来了,最后会在dasf1ag下找到一个flag.txt,用loadfile读文件,验证了/etc/passwd可读,也试了读根目录和web根目录,但是就是没有,写文件可以写到/tmp,但是web目录没有写权限。写/tmp也没有什么用,最后我直接读/flag读到了flag。。。
服了,出题和部署题目的时候记得统一一下,猜路径的时候猜的我想骂人,先给出题人一拳

剩下两个web一个反序列化看不懂,一个SSRF看不懂

看了别人的wp开始复现

Ez_serialize

代码很简单,看一眼就知道应该是原生类toString利用,搜得到的原生类没有什么能利用的然后也不想fuzz就直接摸鱼了(主要是上一个SQL题搞我心态)
贴关键部分代码

<?php

class A{
    public $class;
    public $para;
    public $check;
    public function __construct(){没用}
    public function __wakeup()
    {
        $this->check = new C;
        if($this->check->vaild($this->para) && $this->check->vaild($this->class)) {
            echo new  $this->class ($this->para);
        }
        else
            die('bad hacker~');
    }

}
class B{
没用
}
class C{
    // check,不知道在check个啥
    function vaild($code){
        $pattern = '/[!|@|#|$|%|^|&|*|=|\'|"|:|;|?]/i';
        if (preg_match($pattern, $code)){
            return false;
        }
        else
            return true;
    }
}


if(isset($_GET['pop'])){
    unserialize($_GET['pop']);
}

就一个check一个反序列化,check过了构造函数构造一个对象然后echo触发toString

找不到原生类就不知道咋打了,看wp
使用这两个类

FilesystemIterator
SplFileObject

第一个类构造函数接受一个目录,toString的时候会把当前目录按字典顺序第一个文件输出出来(好没用)
第二个类构造函数接受一个文件路径,toString的时候把该文件的前30个字符输出出来(也好没用)
但是就够做这个题了

update

这两个类不能直接序列化和反序列化,在zend_class_unserialize_deny这个配置文件这里有限制。我就说怎么之前从来没见到过这种类的利用。。。这里是额外多了一个工具类调用构造函数才直接拉起来的,正常情况下并不能利用这两个类

参考链接

浅谈flask ssti 绕过原理
Python模板注入(SSTI)深入学习
MAR DASCTF Wp