模板注入攻击SSTI

模板引擎

目的:用户界面与业务数据(内容)分离。
模板引擎根据获取到的用户数据,放到渲染函数生成前端html页面。

SSTI

服务器端模板注入(Server-Side Template Injection)

MVC

  1. 用户输入进入控制器Controller
  2. 根据请求类型和指令发送到相应业务模型Model
  3. 业务模型进行业务逻辑判断和数据库的存取操作
  4. 结果返回到视图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}}
posted @ 2021-09-28 13:00  天气冷  阅读(103)  评论(0)    收藏  举报