SSTI

PYTHON

Flask

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from flask import Flask, request
from jinja2 import Template

app = Flask(__name__)
app.config['See'] = "passwd:12345"

@app.route("/")

def index():
    name = request.args.get('name', 'guest')
    t = Template('''
    <html>
        <head>
            <title>SSTI_TEST</title>
        </head>
        <body>
            <h1>hello, %s</h1>
        </body>
    </html>
    ''' % (name))
    return t.render()

if __name__ == "__main__":
    app.run()

简单运行结果:

ssti1

name={{5*6}}的时候,就会显示hello,30

ssti2

说明name的参数被执行。

SSTI的关键词就是,参数被执行。

关于为什么会被执行,简单的说法就是,输入的内容,先加入渲染,然后一起输出。

一个不会出现SSTI的示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from flask import Flask, request
from jinja2 import Template

app = Flask(__name__)
app.config['See'] = "passwd:12345"

@app.route("/")

def index():
    return render_template("index.html", title="SSTI_TEST", name=request.args.get("name"))


if __name__ == "__main__":
    app.run()
1
2
3
4
5
6
7
8
9
//index.html
<html>
  <head>
    <title>{{title}} - cl4y</title>
  </head>
 <body>
      <h1>Hello, {{name}} !</h1>
  </body>
</html>
  • 服务器先将前端的index.html渲染,然后从后端获取用户输入——就像往空缺的地方搭积木一样放进去,就只是放进去,不会参与解析渲染。

Jinja2

一个python的模板引擎,被广泛利用

在上面的代码示例中就使用了Jinja2,不过造成SSTI的不是Jinja2本身代码哪里有错误,而是,用户的使用不当。 也就是:

Jinja2作为一个模板引擎,其设计允许在模板中执行复杂的表达式和调用Python函数,这为其提供了强大的功能性,但也带来了安全风险。如果未能正确处理用户输入,这些强大的功能就可能被攻击者利用,从而导致SSTI漏洞。


Jinja2语法简介

ssti3

假设layout.html

ssti4

Jinja2渲染时候,会将标记着 {和百分号 的部分进行插值 假如传入的user列表如下:

1
2
3
4
5
users = [
    {"username": "alice", "url": "/users/alice"},
    {"username": "bob", "url": "/users/bob"},
    {"username": "carol", "url": "/users/carol"}
]

最终就会呈现下面的效果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    <nav>
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/about">About</a></li>
            <li><a href="/contact">Contact</a></li>
        </ul>
    </nav>
    
    <main>
        <ul>
            <li><a href="/users/alice">alice</a></li>
            <li><a href="/users/bob">bob</a></li>
            <li><a href="/users/carol">carol</a></li>
        </ul>
    </main>
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy