cl4y@星盟
[toc]

SSTI模板注入(Python+Jinja2)

之前有做过一些SSTI的ctf,但是没有系统的学习,今天来总结一下。

前提知识

python、flask、jinja2

SSTI介绍

ssti主要为python的一些框架 jinja2 mako tornado django,PHP框架smarty twig,java框架jade velocity等等使用了渲染函数,这些函数对用户的输入信任,造成了模板注入漏洞,可以造成文件泄露,rce等漏洞。
**永远 不要 相信 用户的任何输入**

SSTI种类

不同框架有不同的渲染模板:

漏洞成因

一个安全的代码应该如下:

#/www
from flask import Flask,request,render_template
from jinja2 import Template
app = Flask(__name__)
app.config['SECRET'] = "root:password"

@app.route('/')
@app.route('/index')
def index():
    return render_template("index.html",title='SSTI_TEST',name=request.args.get("name"))

if __name__ == "__main__":
    app.run()
<!--/www/templates/index.html-->
<html>
  <head>
    <title>{{title}} - cl4y</title>
  </head>
 <body>
      <h1>Hello, {{name}} !</h1>
  </body>
</html>

可以看到,我们在index.html里面构造了两个渲染模板,用户通过传递name参数可以控制回显的内容:

即使用户输入渲染模板,更改语法结构,也不会造成SSTI注入:

原因是:服务端先将index.html渲染,然后读取用户输入的参数,模板其实已经固定,用户的输入不会更改模板的语法结构。

而如果有程序员为了图省事,将代码这样写:

from flask import Flask,request
from jinja2 import Template
app = Flask(__name__)
app.config['SECRET_KEY'] = "password:123456789"
@app.route("/")
def index():
    name = request.args.get('name', 'guest')
    t = Template('''
<html>
  <head>
    <title>SSTI_TEST - cl4y</title>
  </head>
 <body>
      <h1>Hello, %s !</h1>
  </body>
</html>
                '''% (name))
点击收藏 | 4 关注 | 2
  • 动动手指,沙发就是你的了!
登录 后跟帖