ssti模板注入学习

news2025/5/15 10:59:30

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.coloradmin.cn/o/2376039.html

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

相关文章

填涂颜色(bfs)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝 含泪播种的人一定能含笑收获! 题目描述 由数字 0 0 0 组成的方阵中,有一任意形状的由数字 1 1 1 构成的闭合圈。现…

ros1+docker环境快速搭建

快速使用python 解析ros1的bag消息ros这个东西可以说安装起来非常麻烦的&#xff0c;费时费力&#xff0c;很可能还安装不成功&#xff0c;特别是我的环境是ubuntu22.04 &#xff0c;官方都不支持安装ros1。因此一个可行且快速的方法是使用别人配置好的ros的docker环境 一、下…

GpuGeek全栈AI开发实战:从零构建企业级大模型生产管线(附完整案例)

目录 背景一、算力困境&#xff1a;AI开发者的「三重诅咒」1.1 硬件成本黑洞‌1.2 资源调度失衡‌1.3 环境部署陷阱‌ 二、三大核心技术突破GpuGeek的破局方案2.1 ‌分时切片调度引擎&#xff08;Time-Slicing Scheduler&#xff09;‌2.2 ‌异构计算融合架构2.3 ‌AI资产自动化…

DataX从Mysql导数据到Hive分区表案例

0、下载DataX并解压到对应目录 DataX安装包&#xff0c;开箱即用&#xff0c;无需配置。 https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz 相关参考文档 https://github.com/alibaba/DataX/blob/master/hdfswriter/doc/hdfswriter.md 1、Hive分区…

vulnhub靶场——secarmy

靶机&#xff1a;secarmy靶机&#xff0c;IP地址为192.168.230.18 攻击&#xff1a;kali&#xff0c;IP地址为192.168.230.134 靶机和攻击机都采用VMware虚拟机&#xff0c;都采用NAT模式 端口扫描&#xff1a; nmap 192.168.230.18 -O -A -p- --reason -sV 21/tcp (ftp): 开…

labview硬件采集

(1)硬件的描述 &#xff08;2&#xff09;实验步骤1&#xff1a; &#xff08;3&#xff09;实验步骤2 库名/路径的选择要使用32位的开发资料 &#xff08;4&#xff09;实验步骤3 &#xff08;5&#xff09;实验步骤4 找到DoSetV12() 设置返回类型 设置chan 设置state labv…

openfeign与dubbo调用下载excel实践

一、前言 openfeign和dubbo均是rpc框架 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架 是一种允许程序像调用本地方法一样调用远程服务器上函数的技术。它隐藏了底层网络通信的复杂性&#xff0c;让开发者可以专注于业务逻辑&#xff0c;实现…

ISP有感自发

一、黑电平 由于传感器&#xff0c;即便在无光的情况下&#xff0c;依然会产生微小的暗电流&#xff0c;这些暗电流可能是噪点会影响后期的调试。因此&#xff0c;我们便将这些电流处理为0&#xff0c;成为纯黑的颜色。可以在源头消除这些误差。 如何矫正黑电平&#xff1a; …

web 自动化之 PO 设计模式详解

文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构&#xff1f;1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…

NVMe简介1

它分为两部分&#xff0c;这里是第一部分。 NVM Express&#xff08;NVMe&#xff09;是一种高性能、可扩展的接口协议&#xff0c;用于通过PCI express&#xff08;PCIe&#xff09;总线&#xff0c;实现主机软件与NVM设备之间的通信。目前&#xff0c;由于NVMe SSD相比于SATA…

【python机器学习】Day 25 异常处理

知识点&#xff1a; 异常处理机制debug过程中的各类报错try-except机制try-except-else-finally机制 在即将进入深度学习专题学习前&#xff0c;我们最后差缺补漏&#xff0c;把一些常见且重要的知识点给他们补上&#xff0c;加深对代码和流程的理解。 借助ai写代码的时候&…

数学建模初等模型应用

一、目的 掌握初等模型的建模方法,对简单的初等模型能借助Matlab工具软件进行辅助建模、求解和检验。 二、实验内容与设计思想&#xff08;设计思路、主要代码分析&#xff09; 1、预测鱼的质量 &#xff08;1&#xff09;设计思路&#xff1a;使用线性回归模型预测鱼的质量…

【MCP教程系列】SpringBoot 搭建基于 Spring AI 的 SSE 模式 MCP 服务

原文地址&#xff1a;https://developer.aliyun.com/article/1662946 在当今快速发展的AI技术背景下&#xff0c;如何高效地集成模型能力成为开发者关注的重点。本文将手把手教你如何基于 Spring AI 搭建支持 SSE&#xff08;Server-Sent Events&#xff09;模式的 MCP 服务 相…

利用散点图探索宇航员特征与太空任务之间的关系

利用散点图探索宇航员特征与太空任务之间的关系 import matplotlib.pyplot as plt import numpy as np import pandas as pdfrom flexitext import flexitext from matplotlib.patches import FancyArrowPatchplt.rcParams.update({"font.family": "Corbel&quo…

Qwen集成clickhouse实现RAG

一、RAG概要 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合了信息检索技术与语言生成模型的人工智能技术。旨在通过检索相关文档来增强大模型的生成能力&#xff0c;从而提高预测的质量和准确性。RAG模型在生成文本或回答…

Excel分组计算求和的两种实现方案

文章目录 背景样例数据方案一、函数求和实现步骤缺点 方案二、数据透视表实现步骤优点 背景 在Excel文档中&#xff0c;经常会进行数据的求和计算&#xff0c;可使用不同的方式实现&#xff0c;记录下来&#xff0c;方便备查。 样例数据 已有商品销量信息&#xff0c;包含销…

LLM定制新路径:微调与上下文学习的博弈与融合

在当今人工智能的浪潮中&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已成为推动行业进步的关键力量。无论是自然语言处理、文本生成还是多模态应用&#xff0c;LLMs都在展现着它们的强大能力。然而&#xff0c;当我们将这些强大的模型应用于特定的下游任务时&#xf…

嵌入式中深入理解C语言中的指针:类型、区别及应用

在嵌入式开发中,C语言是一种基础且极为重要的编程语言,其中指针作为一个非常强大且灵活的工具,广泛应用于内存管理、动态数据结构的实现以及函数参数的传递等方面。然而,尽管指针的使用极为常见,很多开发者在掌握其基本使用后,往往对指针的深入理解还不够。本文将深入分析…

香港维尔利健康科技集团成都区域运营中心投入使用,西南市场战略全面提速

近日&#xff0c;香港维尔利健康科技集团正式宣布&#xff0c;其位于四川成都的西南区域运营中心已全面建成并投入使用。该中心将集设备调配、技术支持、客户服务、运营管理及数字健康平台维护于一体&#xff0c;成为集团在中国内地智慧医疗战略版图中的关键枢纽&#xff0c;对…

STM32CubeMX HAL库 串口的使用

1.配置 2.开启中断后&#xff0c;生成代码 3.串口的接收 1&#xff09;.开启空闲中断接收 __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); // 关键步骤&#xff1a;启用空闲中断 2&#xff09;. 启动接收 调用 HAL_UARTEx_ReceiveToIdle_IT 启动异步接收&#xff0c;可以使用…