本文主要是介绍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初步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!