ssti模板注入学习

ssti模板注入原理

ssti模板注入是一种基于服务器的模板引擎的特性和漏洞产生的一种漏洞,通过将而已代码注入模板中实现的服务器的攻击

模板引擎

为什么要有模板引擎

在web开发中,为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。在不同的技术领域下有很多模板引擎,比如php和c等等都有各自的模板引擎

模板定义

模板是一种包含占位符和静态内容的文本文件,占位符用于表示在运行时将被动态替换的数据或执行的逻辑。例如,在一个 HTML 模板中,可能会有{{ name }}这样的占位符,用于表示用户的姓名。

模板的渲染和替换

当应用程序需要生成最终的页面或文档时,模板引擎会读取模板文件,并根据提供的数据将占位符替换为实际的值。同时,模板引擎还会执行模板中定义的各种逻辑,如循环、条件判断等,最终生成完整的 HTML 或其他格式的文档发送给客户端。以{{name}}为例在模板引擎渲染的过程中,name这个字符串就可能被动态数据内容替换,或者在进行一定逻辑运算之后产生新的字符串,例如在HTML文档中,如果提供了名为name且值为 “张三” 的数据,那么渲染之后的效果就是{{张三}}

原理

模板引擎有很多种类型,例如最简单的置换型,从名称上我们也可以大致推断他的用处,还有复杂一点的解释型、编译型等等模板引擎。不同的模板引擎可以应用于不同的场景。

使用场景

模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这就大大提升了开发效率,良好的设计也使得代码重用变得更加容易。还能实现其他类的功能。

ssti模板注入产生的原因

程序可能在没有经过完善的验证和过滤的情况下,将用户的输入直接嵌入到模板中或者作为参数嵌入到模板引擎中,如果用户输入包含恶意代码,可能造成意想不到的代码执行效果。

用大白话举个例子:网站程序可能给你提供了向网站输入数据的途径,但是对于你的输入,网站对他的处理不是很到位,导致你的输入可能经过模板引擎渲染之后执行了,产生了一些效果,或者是你的输入直接破坏了模板,导致之后没达到渲染效果或者是敏感信息泄露、getshell等等问题。

所以在了解完产生原因之后我们肯定也知道了,对于不同的模板,他的逻辑可能不一样,表达的字符串也可能不一样,各种方面都可能不一样;所以对于不同的模板,注入的代码可能也不一样,注入的形式可能也不一样……

ssti一般的注入过程

注入前

了解注入网站程序的模板信息、编程语言等等;在之后注入时构造payload时要根据这两个方面进行。

了解一些模板引擎的特点和性质等等,比如python的jinja2,php的Smarty、Twig和Blade,java的Thymeleaf 和Velocity 等等,后面用的flask框架用的就是python的jinja2

注入

根据搜集到的信息构造payload,例如,在 Jinja2 中,可以使用{{ }}来包裹表达式,使用{% %}来包裹控制语句。{{ config['SECRET_KEY'] }}可以用于获取 Flask 应用程序的密钥。                   {{ __import__('os').system('ls -la') }}可以在服务器上执行ls -la命令,列出当前目录下的文件和目录信息。

找到注入点,可能是登录注册的输入栏,也可能时评论的输入栏等等,如果有源码,可以进行代码审计找到注入点,或者通过其他办法找到注入点。

Flask

定义

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。

由于塔容易上手,我们使用这个来尝试一下ssti漏洞。

这是一个简单的py代码,调用了flask库

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():return '你好'
if __name__ == '__main__':app.run()

代码的用途可以去了解一下,我们运行这个代码,在本地网址5000端口可以看到回显

我们尝试搭建一个用来测试ssti模板注入的网站

from flask import Flask, request, render_template_string
app = Flask(__name__)@app.route('/safe')
def safe():name = request.args.get('name', 'World')if any(char in name for char in ['{', '}', '%', '#']):name = '非法输入'template = '<h1>安全页面:你好,{{ name }}!</h1>'return render_template_string(template, name=name)@app.route('/unsafe')
def unsafe():name = request.args.get('name', 'World')template = f'<h1>不安全页面:你好,{name}!</h1>'return render_template_string(template)@app.route('/danger')
def danger():expr = request.args.get('expr', '2+2')try:result = eval(expr)except Exception as e:result = f"错误: {str(e)}"template = f'<h1>表达式结果: {result}</h1>'return render_template_string(template)if __name__ == '__main__':app.run(host='0.0.0.0', port=8080, debug=True)

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

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

相关文章

NVMe简介2

共分2部分&#xff0c;这里是第2部分。 NVMe数据结构 NVMe协议中规定每个提交命令的大小为64字节&#xff0c;完成命令大小为16字节&#xff0c;NVMe命令分为Admin和IO两类&#xff0c;NVMe的数据块组织方式有PRP和SGL两种。提交命令的格式如图5所示。 图5 提交命令数据格 N…

高压启动电路--学习记录

常见反激的启动电路 优点&#xff1a;电路设计简单&#xff0c;价格便宜 缺点&#xff1a;损坏大&#xff0c;输入宽范围的时候&#xff0c;为了保证低压能正常启动&#xff0c;启动电阻阻值需要选小&#xff0c;那么高压时损耗会非常大&#xff0c;设计的不好很容易在高压时损…

VS打印printf、cout或者Qt的qDebug等传出的打印信息

在vs中打印printf、cout或者Qt的qDebug等常见的打印信息有时也是必要的&#xff0c;简单的叙述一下过程&#xff1a; 1、在vs中打开你的解决方案。 2、鼠标移动到你的项目名称上&#xff0c;点击鼠标右键&#xff0c;再点击属性&#xff0c;此刻会此项目的属性页。 3、在配置…

苍穹外卖--新增菜品

1.需求分析和设计 产品原型 业务规则&#xff1a; 菜品名称必须是唯一的 菜品必须属于某个分类下&#xff0c;不能单独存在 新增菜品时可以根据情况选择菜品的口味 每个菜品必须对应一张图片 接口设计&#xff1a; 根据类型查询分类(已完成) 文件上传 新增菜品 根据类型…

如何高效集成MySQL数据到金蝶云星空

MySQL数据集成到金蝶云星空&#xff1a;SC采购入库-深圳天一-OK案例分享 在企业信息化建设中&#xff0c;数据的高效流转和准确对接是实现业务流程自动化的关键。本文将聚焦于一个具体的系统对接集成案例——“SC采购入库-深圳天一-OK”&#xff0c;详细探讨如何通过轻易云数据…

【springcloud学习(dalston.sr1)】使用Feign实现接口调用(八)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; &#xff08;一&#xff09;Feign的理解 前面文章【springcloud学习(dalston.sr1)】服务消费者通过restTemplat…

SpringbBoot nginx代理获取用户真实IP

为了演示多级代理场景&#xff0c;我们分配了以下服务器资源&#xff1a; 10.1.9.98&#xff1a;充当客户端10.0.3.137&#xff1a;一级代理10.0.4.105&#xff1a;二级代理10.0.4.129&#xff1a;三级代理10.0.4.120&#xff1a;服务器端 各级代理配置 以下是各级代理的基本配…

实验九视图索引

设计性实验 1. 创建视图V_A包括学号&#xff0c;姓名&#xff0c;性别&#xff0c;课程号&#xff0c;课程名、成绩&#xff1b; 一个语句把学号103 课程号3-105 的姓名改为陆君茹1&#xff0c;性别为女 &#xff0c;然后查看学生表的信息变化&#xff0c;再把上述数据改为原…

typeof运算符和深拷贝

typeof运算符 识别所有值类型识别函数判断是否是引用类型&#xff08;不可再细分&#xff09; //判断所有值类型 let a; typeof a //undefined const strabc; typeof str //string const n100; typeof n //number const …

NAT/代理服务器/内网穿透

目录 一 NAT技术 二 内网穿透/内网打洞 三 代理服务器 一 NAT技术 跨网络传输的时候&#xff0c;私网不能直接访问公网&#xff0c;就引入了NAT能讲私网转换为公网进行访问&#xff0c;主要解决IPv4(2^32)地址不足的问题。 1. NAT原理 当某个内网想访问公网&#xff0c;就必…

Git的安装和配置(idea中配置Git)

一、Git的下载和安装 前提条件&#xff1a;IntelliJ IDEA 版本是2023.3 &#xff0c;那么配置 Git 时推荐使用 Git 2.40.x 或更高版本 下载地址&#xff1a;CNPM Binaries Mirror 操作&#xff1a;打开链接 → 滚动到页面底部 → 选择2.40.x或更高版本的 .exe 文件&#xf…

【教程】Docker更换存储位置

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景说明 更换教程 1. 停止 Docker 服务 2. 创建新的存储目录 3. 编辑 Docker 配置文件 4. 迁移已有数据到新位置 5. 启动 Docker 服务 6…

PostgreSQL 配置设置函数

PostgreSQL 配置设置函数 PostgreSQL 提供了一组配置设置函数&#xff08;Configuration Settings Functions&#xff09;&#xff0c;用于查询和修改数据库服务器的运行时配置参数。这些函数为数据库管理员提供了动态管理数据库配置的能力&#xff0c;无需重启数据库服务。 …

sql server 2019 将单用户状态修改为多用户状态

记录两种将单用户状态修改为多用户状态&#xff0c;我曾经成功过的方法&#xff0c;供参考 第一种方法 USE master; GO -- 终止所有活动连接 DECLARE kill_connections NVARCHAR(MAX) ; SELECT kill_connections KILL CAST(session_id AS NVARCHAR(10)) ; FROM sys.dm_ex…

主机A向主机B发送一个长度为L字节的文件,假设TCP的MSS为1460字节,则在TCP的序号不重复使用的前提下,L的最大值是多少?

&#x1f4d8;题干回顾&#xff1a; 主机A向主机B发送一个长度为L字节的文件&#xff0c;假设TCP的MSS为1460字节&#xff0c;则在TCP的序号不重复使用的前提下&#xff0c;L的最大值是多少&#xff1f; 这个问题关键在于“TCP序号不重复使用”。 ✅ 正确答案是&#xff1a;D.…

一次因校时服务器异常引起的性能差异分析

一次因校时服务器异常引起的性能差异分析 一.背景知识1. **TSC 频率**:硬件级高精度计时2. **gettimeofday**:用户态时间接口3. **adjtimex**:系统时钟的软件校准4. **`clock_adjtime(CLOCK_REALTIME, {modes=ADJ_TICK})`**: 用于修改系统时钟中断间隔(`tick` 值)。5. 关系…

acwing 4275. Dijkstra序列

题目背景 输入 输出 完整代码 #include<bits/stdc.h> using namespace std; int n,m,k,a[1010],dist[1010],g[1010][1010],st[1010];int dij(int u){memset(st,0,sizeof st);memset(dist,0x3f,sizeof dist);dist[u]0;for(int i0;i<n;i){int ta[i];for(int j1;j<n;…

[思维模式-37]:什么是事?什么是物?什么事物?如何通过数学的方法阐述事物?

一、基本概念 1、事&#xff08;Event) “事”通常指的是人类在社会生活中的各种活动、行为、事件或情况&#xff0c;具有动态性和过程性&#xff0c;强调的是一种变化、发展或相互作用的流程。 特点 动态性&#xff1a;“事”往往涉及一系列的动作、变化和发展过程。例如&a…

Linux常用命令40——alias设置命令别名

在使用Linux或macOS日常开发中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;alias命令来自英文单词alias&#xff0c;中文译为“别名”&#xff0c;其功能是设置命令别名信息。我们可以使用alias将一些较长的命令进行简写&#xff0c;往往几十个字符的命令会变…

310. 最小高度树

题目 树是一个无向图&#xff0c;其中任何两个顶点只通过一条路径连接。 换句话说&#xff0c;任何一个没有简单环路的连通图都是一棵树。 给你一棵包含 n 个节点的树&#xff0c;标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表&#xff08;每一个边都…