SSTI模版注入

1、概念

SSTI是一种常见的Web安全漏洞,它允许攻击者通过注入恶意模板代码,使服务器在渲染模板时执行非预期的操作。

(1)渲染模版

至于什么是渲染模版:服务器端渲染模板是一种Web开发技术,它允许在服务器端动态生成HTML页面或其他格式的输出内容,而不是在客户端(浏览器)生成。这种技术的核心是模板引擎,它允许开发者将动态内容嵌入静态模板中,从而生成最终的页面

<1>模版引擎的作用

模版引擎的主要作用是将模板(一种包含占位符的静态文件)与数据(动态内容)结合生成最终的输出内容。

<2>模版引擎的功能:

变量替换:将模板中的占位符替换为实际的数据。

条件语句:根据条件动态生成内容。

循环语句:根据数据集合生成重复的内容。

模版继承:允许一个模板继承另一个模板的结构。

而常见的模版引擎有:Django、jinja2、Twig、EJS

<3>服务器端渲染模版的工作原理

假设有一个Web应用,用户访问某个页面时,服务器需要动态生成HTML内容。

服务器端渲染模板的基本工作流程为:

用户请求页面:用户通过浏览器发送HTTP请求,请求某个页面。

服务器接收请求:服务器接收到请求后,解析请求参数。

加载模版文件:服务器加载预定义的模板文件,模板文件中包含占位符。

数据绑定:服务器将动态数据绑定到模板中的占位符

生成最终内容:模板引擎将模板和数据结合,生成最终的HTML内容。

返回响应:服务器将生成的HTML内容返回给浏览器,浏览器渲染并显示页面。

<4>示例 (使用Python的Jinja2模板引擎)

假设此刻有一个简单的web应用,使用Flask框架和Jinja2模板引擎来动态生成HTML页面。

模版文件(template.html

<!DOCTYPE html>
<html>
<head><title>{{ title }}</title>
</head>
<body><h1>{{ heading }}</h1><p>{{ content }}</p>
</body>
</html>

这个模板文件中包含了三个占位符:{{title}}、{{heading}} 和 {{content}}。

假如在Jinja2模版中,我们用Python代码这样来渲染文件(app.py):

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():# 动态数据data = {'title': 'My Page','heading': 'Welcome to My Page','content': 'This is a dynamic content.'}# 使用render_template渲染模板return render_template('template.html', **data)if __name__ == '__main__':app.run(debug=True)

在这个代码中:

1、render_template 函数 将模板文件  template.html  和动态数据 data 结合起来。

2、模板引擎会将 {{title} 替换为 "My Page",  {{"heading"}}  替换为 'Welcome to My Page' , {{'content'}}   替换为 'This is a dynamic content'

3、最终生成的HTML内容会发送给浏览器。

然后当我们访问这个Web应用时,浏览器会收到以下HTML内容:

<!DOCTYPE html>
<html>
<head><title>My Page</title>
</head>
<body><h1>Welcome to My Page</h1><p>This is a dynamic content.</p>
</body>
</html>

这个过程就是服务器端渲染模板。 

(2)非预期操作

而非预期操作又指的是什么呢:别看这些词这么高大尚,其实通俗的讲就是指在软件或系统中执行的、未被设计或预期的操作。(非预期操作)在Web安全领域,非预期操作通常是指攻击者通过漏洞或缺陷,使应用程序执行了开发者未预期的操作.

<1>非预期操作的类型

信息泄露:攻击者通过漏洞获取服务器上的敏感信息,如配置文件内容、环境变量等。

代码执行:攻击者通过漏洞执行任意代码,从而控制服务器。

权限提升:攻击者通过漏洞提升系统权限,进一步控制服务器。

拒绝服务攻击(Dos):攻击者通过漏洞使服务器无法正常提供服务。

输入验证不足、错误逻辑实现、配置错误都是非预期操作的成因。

<2>示例(还是使用Python的Jinja2模板引擎)

同样假设我们有一个简单的Web应用,允许用户输入一些内容,然后将这些内容显示在页面上。但是,我们没有对用户输入进行过滤。

模版文件(template.html)

给一个html模版:

<!DOCTYPE html>
<html>
<head><title>User Input</title>
</head>
<body><p>You entered: {{ user_input }}</p>
</body>
</html>

Python代码(app.py):

from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/')
def index():# 获取用户输入user_input = request.args.get('input', '')# 渲染模板并显示用户输入return render_template('template.html', user_input=user_input)if __name__ == '__main__':app.run(debug=True)

两种情况:

1、正常情况

如果用户通过URL  /?input=Hello  访问页面,页面会显示:

<!DOCTYPE html>
<html>
<head><title>User Input</title>
</head>
<body><p>You entered: Hello</p>
</body>
</html>

2、非预期操作

如果用户通过URL  /?inpput={{5+3}}   访问页面,Jinja2模板引擎会执行 5+3 ,页面会显示:

<!DOCTYPE html>
<html>
<head><title>User Input</title>
</head>
<body><p>You entered: 8</p>
</body>
</html>

这是开发者未预期的操作,因为用户输入的模板代码被模板引擎执行了,所以叫非预期操作。

那么要是再严重一点:

如果用户通过URL  /?input={{config.items}}  访问页面,Jinja2模板引擎会执行  config.items() ,可能会返回应用程序的配置信息,导致信息泄露。

2、SSTi的原理

之前说模板引擎允许开发者将动态内容嵌入到静态模板中,以便生成最终的HTML页面或其他格式的输出。but,如果没有对用户输入进行严格的验证和过滤,攻击者可以注入恶意的模板代码,从而在服务器端执行一系列操作(非预期,不可知)。

3、SSTI的危害

所以总的来说还是有三个危害:

信息泄露

代码执行

权限提升

4、分类

SSTI 漏洞主要分为两类:简单的模板注入复杂的模板注入

(1)简单模版注入

攻击者直接注入模板代码,使服务器在渲染模板时执行恶意操作

(2)复杂模版注入

攻击者通过构造复杂的模板代码,绕过应用程序的输入验证和过滤机制。

5、例题

NSSCTF

【HDCTF 2023】SearchMeaster

启动

你可以使用POST请求给我发送DATA

也不知道发送什么,注意到题目search,用dirsearch扫描一下目录

结果扫了一下又没扫出来

那就还是用nikto扫一下ip

可以看到Target IP 为1.14.71.254

结果还是没连上

后面在端口前面加冒号:就连上了(我也纳闷,在kali里有时候接端口是空格,冒号不行,有时候又得冒号,但物理机url包是冒号的)

可以看到有一个composer.json可用

访问一下

直接得到提示是smart模版

说明存在ssti模版注入

 返回原页面传  data={  ,报错,证明存在RCE漏洞(报错表明模板引擎尝试解析执行了我传递的模板代码。)因为之前说过RCE漏洞是应用调用代码执行函数系统命令执行函数,导致远程代码执行系统命令执行 ,这里典型的是尝试执行命令然后无果

这样一来就可以利用SSTI模版注入结合RCE漏洞执行命令来达到目的了

想确认smart模版的话试试{4*4}是否能回显16

可以看到有16,无疑存在smart模版 (没被骗haha)

那直接构造payload就可以了

data={if system('ls /f*')}{/if}

smart模版引擎的条件语法

{if} {/if} 标签

{if}:开始条件判断;

{/if}:结束条件判断

在该模版引擎中执行 system函数 system()不用说了

'ls /f*':要执行的系统命令,用于列出  /f* (f字符开头,用于提高查找flag的效率)目录下的文件

 执行后得到flag路径

继续替换system命令即可

data={if system('cat /flag_13_searchmaster')}{/if}

get flag

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

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

相关文章

关于点胶机的精度

一、精度&#xff1a; 1:X/y轴定位精度常通在5个丝左右&#xff0c;Z轴在3个丝左右&#xff0c; 如果采用伺服电机丝杆配置&#xff0c;可提升至于个2丝左右。 2&#xff1a;胶水控制精度&#xff1a;通过喷阀驱动器&#xff0c;气压等参数&#xff0c;实现胶量控制&#xf…

gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master

问题描述&#xff1a; gitee推送更新时&#xff0c;提示&#xff1a; 解决方法&#xff1a; 登录Gitee&#xff0c;进入【个人主页】 点击【个人设置】 更改邮箱的配置&#xff0c;如下&#xff1a; 更改“禁止命令行推送暴露个人邮箱”&#xff0c;将其关闭&#xff1a;

Java如何获取电脑分辨率?

以下是一个 Java 程序示例&#xff0c;用于获取电脑的主屏幕分辨率&#xff1a; import java.awt.*; public class ScreenResolutionExample { public static void main(String[] args) { // 获取默认的屏幕设备 GraphicsDevice device GraphicsEnvironm…

WPF 3D图形编程核心技术解析

一、三维坐标系系统 WPF采用右手坐标系系统&#xff0c;空间定位遵循&#xff1a; X 轴 → 右 Y 轴 → 上 Z 轴 → 观察方向 X轴 \rightarrow 右\quad Y轴 \rightarrow 上\quad Z轴 \rightarrow 观察方向 X轴→右Y轴→上Z轴→观察方向 三维坐标值表示为 ( x , y , z ) (x, y,…

【库(Library)、包(Package)和模块(Module)解析】

在Python中&#xff0c;**库&#xff08;Library&#xff09;、包&#xff08;Package&#xff09;和模块&#xff08;Module&#xff09;**是代码组织的不同层级&#xff0c;而import语句的导入行为与它们密切相关。以下是详细对比和解释&#xff1a; &#x1f4e6; 1. 核心概…

裸机上的 printf:在无操作系统环境下构建 C 标准库

在嵌入式开发和底层系统编程领域&#xff0c;裸机开发是一项极具挑战性但又至关重要的任务。想象一下&#xff0c;在没有操作系统支持的情况下&#xff0c;让 C 语言的标准库函数&#xff0c;如printf正常工作&#xff0c;这听起来是不是很有趣又充满挑战&#xff1f;今天&…

基于STM32F103的智能机械臂识别与控制项目(课件PPT+源代码)

以下是基于 STM32F103 的智能机械臂识别与控制项目的详细介绍&#xff1a; 项目概述 该项目以 STM32F103 为核心控制器&#xff0c;结合多种传感器和技术&#xff0c;实现了机械臂的智能识别与控制功能&#xff0c;可完成仓库货物的识别、搬运等任务&#xff0c;并支持多种控…

Codeforces Round 1023 (Div. 2)

Dashboard - Codeforces Round 1023 (Div. 2) - Codeforces 一个构造问题&#xff0c;我把最大的数放在一个数组&#xff0c;其余数放在另一个数组&#xff0c;就能保证gcd不同 来看代码&#xff1a; #include <bits/stdc.h> using namespace std;int main() {int t;ci…

6.01 Python中打开usb相机并进行显示

本案例介绍如何打开USB相机并每隔100ms进行刷新的代码,效果如下: 一、主要思路: 1. 打开视频流、读取帧 self.cam_cap = cv2.VideoCapture(0) #打开 视频流 cam_ret, cam_frame = self.cam_cap.read() //读取帧。 2.使用定时器,每隔100ms读取帧 3.显示到Qt的QLabel…

JVM——即时编译

分层编译模式&#xff1a;动态平衡启动速度与执行效率 分层编译是现代JVM&#xff08;如HotSpot、GraalVM&#xff09;实现高性能的核心策略之一&#xff0c;其核心思想是根据代码的执行热度动态选择不同的编译层次&#xff0c;实现启动速度与运行效率的最佳平衡。以HotSpot虚…

Auto DOP:让并行执行实现智能调优 | OceanBase 实践

随着数据量的迅速增长&#xff0c;企业数据库往往面临着一个困局&#xff1a;复杂的分析查询需要充分的资源来保证性能&#xff0c;但过多增加并行执行又会造成资源竞争&#xff0c;影响系统稳定性。传统基于DBA人工干预的并行度调节机制&#xff0c;既低效又难以适应动态变化的…

【区块链】Uniswap之滑点(Slippage)

一、滑点是什么&#xff1f; 滑点&#xff08;Slippage&#xff09;是指你下单预期价格和最终成交价格之间的差距。 在 DEX 中&#xff0c;你的交易会影响池子的价格&#xff08;AMM机制&#xff09;&#xff0c;所以&#xff1a; 下单越大&#xff0c;滑点越大&#xff1b;…

[前端]Javascript获取元素宽度

元素宽度属性对比示意图 ---------------------------------- | 外边距&#xff08;margin&#xff09; | -------------------------------- | | 边框&#xff08;border&#xff09; | | | -------------------------- | | | …

数字人驱动/动画方向最新顶会期刊论文收集整理 | AAAI 2025

会议官方论文列表&#xff1a;https://ojs.aaai.org/index.php/AAAI/issue/view/624 以下论文部分会开源代码&#xff0c;若开源&#xff0c;会在论文原文的摘要下方给出链接。 语音驱动头部动画/其他 EchoMimic: Lifelike Audio-Driven Portrait Animations through Editabl…

Windows系统下【Celery任务队列】python使用celery 详解(一)

Celery 是一个基于 Python 的分布式任务队列框架&#xff0c;它允许你在不同的进程甚至不同的服务器上异步执行任务。 特点 简单&#xff1a;易于使用和配置&#xff0c;提供了简洁的 API。高可用&#xff1a;支持任务的可靠交付&#xff0c;即使在出现故障时也能保证任务不丢…

移动设备常用电子屏幕类型对比

概述 LCD 家族 &#xff08;TN、STN、TFT、IPS、VA&#xff09;依赖背光&#xff0c;性能差异主要来自液晶排列和驱动方式。OLED 以自发光为核心优势&#xff0c;但成本与寿命限制其普及。E-Paper 专为低功耗静态显示设计&#xff0c;与传统屏幕技术差异显著。 参数LCD&#…

Vue3.5 企业级管理系统实战(十八):用户管理

本篇主要探讨用户管理功能&#xff0c;接口部分依然是使用 Apifox mock 模拟。 1 用户 api 在 src/api/user.ts 中添加用户相关 CRUD 接口&#xff0c;代码如下&#xff1a; //src/api/user.ts import request from "/api/config/request"; // 从 "./type&q…

【C】初阶数据结构14 -- 归并排序

本篇文章主要是讲解经典的排序算法 -- 归并排序 目录 1 递归版本的归并排序 1&#xff09; 算法思想 2&#xff09; 代码 3&#xff09; 时间复杂度与空间复杂度分析 &#xff08;1&#xff09; 时间复杂度 &#xff08;2&#xff09; 空间复杂度 2 迭代版本的归并…

【相机标定】OpenCV 相机标定中的重投影误差与角点三维坐标计算详解

摘要&#xff1a; 本文将从以下几个方面展开&#xff0c;结合典型代码深入解析 OpenCV 中的相机标定过程&#xff0c;重点阐述重投影误差的计算方法与实际意义&#xff0c;并通过一个 calcBoardCornerPositions() 函数详细讲解棋盘格角点三维坐标的构建逻辑。 在计算机视觉领域…

RabbitMQ-运维

文章目录 前言运维-集群介绍多机多节点单机多节点 多机多节点下载配置hosts⽂件配置Erlang Cookie启动节点构建集群查看集群状态 单机多节点安装启动两个节点再启动两个节点验证RabbitMQ启动成功搭建集群把rabbit2, rabbit3添加到集群 宕机演示仲裁队列介绍raft算法协议 raft基…