模板注入攻击SSTI
模板引擎
目的:用户界面与业务数据(内容)分离。
模板引擎根据获取到的用户数据,放到渲染函数生成前端html页面。
SSTI
服务器端模板注入(Server-Side Template Injection)
MVC
- 用户输入进入控制器Controller
- 根据请求类型和指令发送到相应业务模型Model
- 业务模型进行业务逻辑判断和数据库的存取操作
- 结果返回到视图View,经过模板渲染展示到前端。
漏洞成因
服务端将用户恶意输入未经处理就作为Web应用模板内容
同常规的 SQL 注入检测,XSS 检测一样,模板注入漏洞的检测也是向传递的参数中承载特定 Payload 并根据返回的内容来进行判断的。
https://www.cnblogs.com/bmjoker/p/13508538.html
个人理解
在输入数据到模板中时,没有使用参数化的输入,而是直接跳过了上述过滤操作直接进行了拼接输入,与SQL注入等代码注入原理类似。
修复
如果使用一个固定好了的模板,在模板渲染之后传入数据,就不存在模板注入,就好像SQL注入的预编译一样
SSTI版本(jinja2)
from flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
@app.route("/")
def index():
name = request.args.get('name', 'guest')
t = Template("Hello " + name)
return t.render()
if __name__ == "__main__":
app.run()
利用
/?name={{2*2}}
Hello 4
修复版本
from flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
@app.route("/")
def index():
name = request.args.get('name', 'guest')
t = Template("Hello {{n}}")
return t.render(n=name)
if __name__ == "__main__":
app.run()
无法利用
/?name={{2*2}}
Hello {{2*2}}

浙公网安备 33010602011771号