SSTI模板注入小结

news2025/4/12 13:26:44

文章目录

  • 一、漏洞简述🍺
  • 二、flask模板注入🍺
  • 三、shrine(攻防世界)🍺
  • 四、SSTI注入绕过🍺

一、漏洞简述🍺

1、SSTI(Server-Side Template Injection,服务器端模板注入)指的是一种攻击技术,攻击者通过向服务器发送恶意代码,从而在服务器端执行任意代码并获取敏感信息,SSTI攻击通常发生在服务器端模板渲染引擎中,攻击者在模板中注入恶意代码,从而导致服务器端执行该代码

2、SSTI攻击的目标通常是使用模板引擎的Web应用程序,例如Flask、Django、Jinja2等,攻击者可以利用这些模板引擎的弱点,将恶意代码注入到模板中,然后将其发送到服务器执行

3、常见的SSTI攻击载荷如:

  • {{7*7}}:将会输出49,则存在SSTI
  • {{config}}:将会输出服务器端的配置信息

二、flask模板注入🍺

1、不同框架有不同的渲染模板

2、如:flask支持使用Jinja2来作为渲染引擎

  • Flask是一个Python Web框架,它使用Werkzeug工具箱和Jinja2模板引擎,它被设计成易于扩展和灵活的,并且可以很好地处理小到大的Web应用程序
  • Jinja2是一个Python模板引擎,它允许你以灵活和安全的方式构建HTML页面

3、flask的渲染方法有render_template和render_template_string两种,其中render_template_string则是用来渲染一个字符串的,SSTI与这个方法密不可分

三、shrine(攻防世界)🍺

1、弄个环境理清一下思路,开启环境访问,即发现一段源代码,Flask 框架

import flask
import os

app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')

@app.route('/')
def index():
    return open(__file__).read()

@app.route('/shrine/')
def shrine(shrine):

    def safe_jinja(s):
        s = s.replace('(', '').replace(')', '')
        blacklist = ['config', 'self']
        return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s

    return flask.render_template_string(safe_jinja(shrine))

if __name__ == '__main__':
    app.run(debug=True)

2、路由作用

route装饰器的作用是将函数与url绑定,如代码中就是当你访问http://61.147.171.105:57667/shrine的时候,flask会执行shrine函数

3、对代码简单分析

(1)、将环境变量中的FLAG值存储到应用程序对象的配置中,然后从环境变量中移除FLAG值:
app.config['FLAG'] = os.environ.pop('FLAG')

(2)、定义/shrine/路由处理函数,使用safe_jinja函数处理输入的模板字符串shrine,然后渲染模板并返回结果

s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s

使用replace方法替换掉字符串中的左右括号,设置黑名单过滤config、self字符

最后一行代码负责将黑名单的东西遍历并设为空,即进行过滤

(3)、在Jinja模板语言中,{{…}}用于表示需要被替换的变量或执行的表达式,而{%…%}用于表示控制流语句,比如if、for、set等,因此,{{%…%}}就是将控制流语句转义,表示这部分内容不需要被替换,将控制流语句转义,即是使用{{%…%}}可以将一段Python代码作为字符串输出,而不会被解释器当成控制流语句执行,这样可以方便在模板中使用包含了Python语法的代码段

在这个代码中,{{% set {}=None%}}是用于定义一个变量,表示将黑名单中的变量设置为None,从而防止黑客利用这些变量进行注入攻击

(4)、就是将过滤后的变量进行渲染HTML页面并返回

return flask.render_template_string(safe_jinja(shrine))

4、操作过程

/shrine/目录下执行

在这里插入图片描述
由于黑名单的过滤,我们输入config的值为None

在这里插入图片描述

为了获取信息,可以读取例如current_app这样的全局变量,python的沙箱逃逸这里的方法是利用python对象之间的引用关系来调用被禁用的函数对象,有两个函数包含了current_app全局变量,url_forget_flashed_messages

利用{{url_for.__globals__}}注入

在这里插入图片描述

出现了**current_app**变量,**{{url_for.__globals__['current_app']}}**

在这里插入图片描述

**app** 变量为Flask应用程序实例

然后注入当前**app****config****{{url_for.__globals__['current_app'].config}}**

在这里插入图片描述

成功找到**flag**

利用**get_flashed_messages**注入的方法同步

同时,Flask的所有接口文档可参考:API — 烧瓶文档 (1.1.x) (palletsprojects.com)

参考学习文章:

  • 从零学习flask模板注入 - FreeBuf网络安全行业门户
  • [WesternCTF2018]shrine - 春告鳥 - 博客园 (cnblogs.com)

四、SSTI注入绕过🍺

1、出现以下情况的;

  • 过滤了敏感字符,如**eval**,**os**等
  • 过滤了中括号**[]、引号'"**
  • 过滤双下划线**__**
  • 删除built下的一些函数,不能执行命令存在
  • 过滤了**{{**

参考文章:SSTI注入绕过(沙盒逃逸原理一样) - 冬泳怪鸽 - 博客园 (cnblogs.com)

2、常见不同模板引擎的姿势

(1)、Smarty模板引擎,PHP
(2)、Twig模板引擎,PHP
(3)、JinJa模板引擎,Python
(4)、Django框架,Python
(5)、Tornado框架,Pyhon

参考文章:SSTI模板注入 | Err0r的小站

3、还有经典

参考文章:一篇文章带你理解漏洞之 SSTI 漏洞 | K0rz3n’s Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5个面向Python高级开发者的技巧

使用这些用于自定义类行为、编写并发代码、管理资源、存储和操作数据以及优化代码性能的高级技术来探索 Python 的深度。 本文探讨了 Python 中的五个高级主题,它们可以为解决问题和提高代码的可靠性和性能提供有价值的见解和技术。从允许您在定义类时自定义类行为的…

SpringBoot基础学习之(二十):Shiro与Thymeleaf的整合版本

还是一样,本篇文章是在上一篇文章的基础上,实施再次进阶 Shiro是一种特别的流行的安全框架,Thymeleaf则是spring boot架构中使用的一种特别引擎。今天介绍的则是它们俩的整合版本。 实现的功能:前端的显示的内容,是根…

vi/vim命令,使用vi编辑器命令详解

linux常用命令:vi/vim vi命令有三种模式:一般模式,编辑模式,命令模式(底行模式) 可以通过 vi [文件路径]文件名 的命令启动vi,并且打开指定的文件进行查看、编辑,其中[文件路径] 是可选参数。如…

微信小程序开发:实现毛玻璃效果

前言 在微信小程序开发的时候,也会遇到一些和在前端开发一样的样式需求,二者的相通类似性非常的高,就拿样式相关的需求来说,可以说是一模一样的操作。那么本文就来分享一个关于实现高斯模糊效果的需求,微信小程序和前端…

【Linux网络服务】FTP服务

FTP服务 一、FTP服务1.1FTP服务概述1.2FTP服务的特点1.3FTP服务工作过程 二、设置FTP服务2.1实验一:设置匿名用户访问FTP服务(最大权限)2.2实验二:设置本地用户验证访问ftp,并禁止切换到ftp以外的目录(默认…

Linux- 进程的切换和系统的一般执行过程

我想在介绍进程切换之前,先引入中断的相关知识,它是我们理解进程切换的重要前提,也是Linux操作系统的核心机制。 中断的类型 • 硬件中断(Interrupt),也称为外部中断,就是CPU的两根引脚&…

微服务学习-SpringCloud -Nacos (集群及CP架构相关学习)

文章目录 Nacos集群下心跳机制相对于单机会有怎样的改变?CAP原则和BASE原则常见的注册中心实现对比Nacos集群实现协议Nacos CP架构实现源码Nacos CP架构leader是如何选举的呢? Nacos集群下心跳机制相对于单机会有怎样的改变? 在上一遍单机模…

百万赞同:网络安全为什么缺人? 缺什么样的人?

1.网络安全为什么缺人? 缺人的原因是有了新的需求 以前的时候,所有企业是以产品为核心的,管你有啥漏洞,管你用户信息泄露不泄露,我只要做出来的产品火爆就行。 这一切随着《网络安全法》、《数据安全法》、《网络安全审查办法》…

No.041<软考>《(高项)备考大全》【第25章】量化项目管理

第25章】量化项目管理 1 考试相关2 量化项目管理3 准备量化管理项目4 量化的管理项目5 练习题参考答案: 1 考试相关 选择可能考0-1分,案例论文不考。 2 量化项目管理 量化项目管理(QPM)的目的在于量化地管理项目,以达成项目已建…

Auto-GPT 5分钟详细部署指南

安装 conda 1. 下载安装 miniconda3 : Miniconda — conda documentation conda是一个包和环境管理工具,它不仅能管理包,还能隔离和管理不同python版本的环境。类似管理nodejs环境的nvm工具。 2. conda环境变量: 新建 CONDA_H…

混合网络监控工具

多年来,网络不可避免地变得更加复杂。混合网络架构包括跨多个供应商的 LAN、WAN、公共或私有云存储以及混合云。简而言之,它是虚拟和物理网络组件的混合体,自远程工作出现以来,这种类型的网络架构已经起飞。 什么是混合网络 混合…

【《C和指针》笔记】第一章<快速上手>

注释以/*开始到*/结束或者使用// .预处理指令:因为它们是由预处理器解释的,预处理器读入代码,根据预处理指令对其进行修改,然后把修改过的源代码递交给编译器。预处理指令(#include、#define)所定义的变量…

【论文阅读笔记|CASE 2022】EventGraph: Event Extraction as Semantic Graph Parsing

论文题目:EventGraph: Event Extraction as Semantic Graph Parsing 论文来源:CASE2022 论文链接:https://aclanthology.org/2022.case-1.2.pdf 代码链接:GitHub - huiling-y/EventGraph 0 摘要 事件抽取涉及到事件类型检测、…

【Scala】集合

目录 类型 不可变集合 可变集合 数组 不可变 可变数组 不可变数组与可变数组的转换 多维数组 List list运算符 可变 ListBuffer Set 集合 不可变 Set 可变 mutable.Set Map 集合 可变 Map 元组 操作 通用操作 衍生集合操作 计算函数 排序 sorted sortB…

java springboot VUE 健康食谱管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE 健康食谱管理系统是一套完善的完整信息管理类型系统,结合springboot框架和VUE完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开 发),系统具有完整的源代码…

PHP快速入门08-JSON与XML处理

文章目录 前言一、使用介绍1.1 JSON处理1.2 XML处理 二、常见用法20例2.1 将数组转换为JSON格式:2.2 将JSON字符串转换回PHP数组:2.3 读取XML文件:2.4 将XML字符串转换成PHP对象:2.5 从URL获取JSON数据:2.6 写入JSON文…

SpringBoot集成Disruptor

Disruptor介绍 1.Disruptor 是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于 Disruptor 开发的系统单线程能支撑每秒 600 万订单,2010 年…

为什么APP也需要SSL证书?

通常我们会想到对网站使用SSL证书,来加密数据传输过程,确保信息不被篡改、泄露。对APP这类应用程序则选择软件签名证书,来进行数字签名和防止代码被恶意篡改。然而APP很容易获取到个人敏感信息,为了防止这些信息在传输过程中被有心…

JUC并发编程之读写锁

1 ReentrantReadWriteLock 当读操作远远高于写操作,这时候使用 读写锁 让 读-读 可以并发,提高性能,类似于数据库中的 select … from … lock in share mode 测试阻塞 提供一个 数据容器类 内部分别使用读锁保护数据的 read() 方法&#…

NAT-HCIA阶段综合实验

拓扑结构: 要求 1、ISP路由器只能配置IP地址,之后不得进行其他配置 2、内部整个网络基于192.168.1.0/24进行地址规划 3、R1、R2之间启动OSPF协议,单区域 4、PC1~PC4自动获取IP地址 5、PC1不能telnetR1,PC1外的其他内网PC可以t…