0x00 什么是客户端session
顾名思义,其实就是把session加密后存到cookie中。一般session会被保存到服务端中(服务端cookie),但是也有许多Web框架并不这样做,比如Flask就是采用客户端session的方式来储存,将session经过签名处理,来防止修改。
0x01 Flask的session格式
base64加密的Session数据(经过了json、zlib压缩处理的字符串) . 时间戳 . 签名
时间戳用来告诉服务端数据最后一次更新的时间,超过31天的会话,将会过期,变为无效会话;签名是利用Hmac
算法,将session数据和时间戳加上secret_key
加密而成的,用来保证数据没有被修改。
0x02 Flask的session伪造
由上文所述的session格式可知,要修改并伪造一个session的必要条件就是知道加密所采用的secret_key
,一旦获取到secret_key
, 我们就可以轻松的构造签名,从而实现客户端的session的伪造。
这里采用Github
上的工具noraj/flask-session-cookie-manager来实现Flask中session的伪造。
安装可以参考: 语雀
如果里面的venv有问题,可以参考Flaskの初识
Usage:python3[2] flask_session_cookie_manager3[2].py encode -t "{'username': 'admin', 'id': '1'}" -s "mySec_key"
根据实际情况,要注意python2还是python3,而且最好用双引号。
0x03 Flask的session解密
上文说了,其实就是个base64而已,但是因为python有类似这种b‘xxxx’
这种,且数据经过了json、zlib的处理,所以最好还是借助一下脚本
ps:不用脚本,也是可以的哦
脚本:见 客户端 session 导致的安全问题 | 离别歌 (leavesongs.com)
Usage:python3 decryption.py "xxxxxxx.xx.xxx"
0x04 参考
客户端 session 导致的安全问题 | 离别歌 (leavesongs.com)
noraj/flask-session-cookie-manager: Flask Session Cookie Decoder/Encoder (github.com)
flask-session-cookie-manager · 语雀 (yuque.com)