ssti初步

2024-08-27 02:36
文章标签 初步 ssti

本文主要是介绍ssti初步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,简介。

SSTI(Server-Side Template Injection)中文是服务器端模板注入。eg:python中的flask、php的thinkphp、java的spring等框架(MVC),用户输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。

二.flask原理基础

1.什么是flask?

一个用python编写的轻量级web应用框架。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎

特点:良好的文档、丰富的插件、包含开发服务器和调试器、集成支持单元测试、RESTful请求调度、支持安全cookies、基于Unicode,python可以用flask直接启动一个web服务页面

2.flask框架示例(在kali中python的venv中运行)

(1)环境配置

在上述示例中。如果使用相对路径则为物理环境的py,如果是绝对路径就是虚拟环境的py。

Vim编辑器

Vim是一个功能强大的文本编辑器,但相对于nano来说,它的学习曲线较陡峭。不过,一旦掌握了Vim的基本操作,你会发现它非常高效。

  • 进入插入模式:在Vim中,默认情况下处于普通模式(Normal Mode),你不能直接输入文本。要进入插入模式(Insert Mode)以编写文本,你可以按i键(表示“insert”)。
  • 保存文件:在插入模式下编写完文件后,你需要回到普通模式来保存文件。按Esc键可以退出插入模式,回到普通模式。然后,输入:wq(表示“write and quit”)并按下Enter键来保存文件并退出Vim。如果只想保存文件而不退出Vim,可以输入:w并按下Enter键。

(2) flask框架

1.用vim编辑器在一定路径下按flask框架编辑一个py文件,然后运行,在结尾处可以看到一个地址,在kali中访问它,得到我们kali文件所要得的结果。

注意:此时只能在本机访问,就是虚拟机内,因为给出的地址是本机地址

2. 基本框架为

3. 可以通过不同的路由来对不同的页面进行访问。

 

4.进行外部访问

通过修改run后面的host为(0.0.0.0)即监听所有的,此时就会监听到我们的物理接口,可以在外部访问。

from flask import Flask

app = Flask(__name__)

@app.route('/')

def   hello():

        return "passion"

@app.route('/')

def   ok():

        return "freedom"

if __name__=='__main__':

        app.run(host='0.0.0.0')

 修改的代码和外部访问

我们运行之后。可以看到出现了一个新的地址

也可以修改端口

3.flask变量规则 

1.通过向规则参数添加变量部分,可以动态构建url。

这里面是类似于传参的过程,用格式化字符串的方式从url将所需传到内容之中。url为:127.0.0.1:5000/hello/动态变量(作为关键字参数传递给与规则相关的函数)

from flask import Flask

app = Flask(__name__)

@app.route('/hello/<name>')   //url提交

def   hello(name):                     //提交后通过这个方法获取内容

        return "hello %s" % name     //将得到的内容放在这里。%s是格式化字符串。%d接受整数,%f接受浮点值

 

if __name__=='__main__':

        app.run(debug=True)

允许添加不同类型的变量

from flask import Flask

app = Flask(__name__)

@app.route('/blog/<int:postID>')        //此处为添加整数型

def   show_blog(postID):                   

        return "Blog Number %d" % postID

@app.route('/rev/<float:revNO>')   //添加浮点数型

def   revision(revNO):                   

        return "Revision Number %f" % revNO

 

if __name__=='__main__':

        app.run(debug=True)

 

 整数型实验结果

 浮点数型结果

2. Flask HTTP方法

简介:http协议是万维网中数据通信的基础,该协议中定义了从指定url检索数据的不同方法

GET:以未加密的形式将数据发送到服务器,是最常见的方法。

HEAD:和GET相同,但是没有响应体。

POST:用于将HTML表单数据发送到服务器,post方法接收的数据不由服务器缓存。

PUT:用上传的内容替换目标资源的所有当前表示。

DELETE:删除由URL给出的目标资源的所有当前表示。

 示例:在数据交互的时候,需要用到哪种方式要提前规定好,避免发生错误

 @app.route('/login',methods = ['POST', 'GET'])                                           可以POST提交  
def login():                                                                                                   也可以GET提交    
if request.method == 'POST':. print(1)
user = request.form['ben']
return redirect(url_for('success',name = user))                                               redirect重定向  
else:    print(2)                                                                                                 /success/user    
user = request.args.get('ben')
return redirect(url_for('success',name =user))

4.flask模版介绍

(1)视图函数

主要作用是:生成请求的响应,包括处理业务逻辑和返回响应内容(把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本),因此我们使用flask模版。

注::渲染:使用真实值替换变量,再返回最终得到的字符串(flask常用jinja2(模版引擎)来渲染)

 在分开以后

视图函数只负责业务逻辑和数据处理;模版取到视图函数的结果来进行展示。

(2)flask模版函数

  • render_template():加载html文件,默认文件路径在templates目录下。
  • render_template_string():用于渲染字符串,直接定义内容。

5.flask的渲染方法

有render_template和render_template_string两种。

render_template()是用来渲染一个指定的文件的。return render_template(‘index.html’)
render_template_string则是用来渲染一个字符串的。SSTI与这个方法密不可分。

html = '<h1>This is index page</h1>'
return render_template_string(html)

flask是使用Jinja2来作为渲染引擎的。

不正确的使用flask中的render_template_string方法会引发SSTI。

三,模版注入漏洞介绍

1.flask漏洞

危害:可能造成任意文件读取和RCE远程控制后台系统
漏洞成因:渲染模板时,没有严格控制对用户的输入;使用了危险的模板,导致用户可以和flask程序进行交互。flask是基于python开发的一种web服务器,那么也就意味着如果用户可以和flask进行交互的话,就可以执行python的代码,比如eval,system,file等等等等之类的函数。

from flask import Flask,request,render_template_string                                         导入函数  
app = Flask(__name__)
def index():    @app.route('/',methods =['GET'])                            GET方式获取ben的值,    
str_= request.args.get('ben')                                                                                    赋值给str  
html_str= "'                                                            str值通过render_template_string    
<html>                                                                                            加载到body中间    
<head></head>
<body>{{str}}</body>                                    str是被{}}包括起来的,会被预先渲染转义,    
</html>                                                                            然后才输出,不会被渲染执行;    
return render_template_string(html_str,str=str) if ___name__== '__main___': app.debug = True
app.run('127.0.0.1','8080')

__class__  返回类型所属的对象
__mro__    返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__   返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的

__subclasses__   每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__  类的初始化方法
__globals__  对包含函数全局变量的字典的引用

四,函数

1.config:

{{config}}可以获取当前设置,
如果题目类似app.config [‘FLAG’] =(‘FLAG’),那可以直接访问{{config[‘FLAG’]}}或者{{config.FLAG}}得到flag

2.self

{{self.dict._TemplateReference__context.config}} ⇒ 同样可以找到config

(一)继承关系

1.父类和子类:子类可以调用父类下的其他子类。

原因:python flask不能直接执行python指令

object是父子关系的顶端,所有的数据类型最终的父类都是object。

这篇关于ssti初步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

初步学习Android的感想

之前在学习java语言的时候就经常听说过Android这门语言,那时候感觉Android有些神秘感,再加上Android是用来开发移动设备的一门语言,所以一直对Android抱有一种兴奋的心情。 在我开始接触 Android之后,感觉超好玩,因为可以在自己的手机设备上开发一些我喜欢的小应用,再想想之前说学习Android应该会很难,但是如果你真的接触了,而且有JAVA的功底,我想学习Androi

初步了解VTK装配体

VTK还不太了解,根据资料, vtk.vtkAssembly 是 VTK库中的一个重要类,允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。 import vtkimport mathfrom vtk.util.colors import *filenames = ["cylinder.stl","sphere.stl","torus.stl"]dt = 1.0renW

Weka的初步介绍

Weka无疑是数据挖掘入门的最好工具,初学者可以直接使用图形界面了解数据挖掘的相关算法(如何使用网上有很多教程,可以参考 http://download.csdn.net/detail/u013422712/8649239)。     进阶阶段就必须学会使用和了解Weka的源码,这会在接下去的文章中写道。

Maven的初步使用以及命令行工具

在写本文的时候先来说明一下maven依赖的各种范围的意思 compile(编译范围) compile 是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath 中可用,同时它们也会被打包。 provided(已提供范围)provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web 应用,你可能在编译cl

基于LangChain+LLM的相关技术研究及初步实践

01 概述 大模型概述 大模型是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能,能够处理更加复杂的任务和数据。大模型在各种领域都有广泛的应用,包括自然语言处理、计算机视觉、语音识别和推荐系统等。大模型通过训练海量数据来学习复杂的模式和特征,具有更强大的泛化能力,可以对未见过的数据

Mybaites初步认知

Mybaties中映射语句是最强大的地方。ResultMap是其中最重要,最强大的元素。 一个Mybaties以一个SqlSessionFactory实例为中心,通过配置类SqlSessionFactoryBuilder创建SqlSessionFactory. SqlSessionFactory作用域为application,在整个应用程序中始终存在,获取sqlsession实例。(SqlSe

2024数学建模国赛选题建议及初步思路来啦!

大家好呀,全国大学生数学建模竞赛今天下午开赛啦,在这里先带来初步的选题建议及思路。 目前团队正在写B题和C题完整论文,后续还会持续更新哈,大家三连关注一下防止迷路。 精力有限,以下只是简略的图文版初步思路,更详细的视频版完整讲解请移步: 2024数学建模国赛选题建议及A、B、C题思路_哔哩哔哩_bilibili 首先是主基调: 本次国赛推荐大家选择B或C题目。A题目只建议数理基础很扎

2024高教社杯数学建模国赛ABCDE题选题建议+初步分析

提示:DS C君认为的难度:C<B<A,开放度:A<C<B 。 D、E题推荐选E题,后续会直接更新E论文和思路,不在这里进行选题分析,以下为A、B、C题选题建议及初步分析 A题:“板凳龙” 闹元宵 A题是数模类赛事很常见的物理类赛题,需要学习不少相关知识。此题涉及对一个动态系统的建模,模拟一支舞龙队伍在螺旋路径中的行进,并求解队伍的整体动态行为。包括队伍的每秒位置、速度、碰撞检测、路径优化等

面向对象的简单初步认识

首先我们从一道经典的面向对象题目理解:一头母牛一年生一头小牛,一头小牛过四年也每年生一头小牛,照此推算,20年后一共有多少头牛? 牛:为一个具体对象。 牛:属性:年龄 按照题意可知:这头牛的年龄只要达到4岁就能开始生小牛 那首先我们先写一个小牛类:没过一年生一头小牛,这里面应该有个方法记录小牛的年龄,和新增的小牛 ​public void cow(){private int age;

scala界面GUI编程实战初步了解

示例代码: import scala.swing._//SimpleSwingApplication继承自SwingApplication类(此类中有main方法,因此可以运行显示界面)object Hello_GUI extends SimpleSwingApplication {def top = new MainFrame{ //顶级容器title = "Hello GUI"co