flask session伪造
工具准备
flask-session-cookie-manager
kali中下载命令:
git clone https://github.com/noraj/flask-session-cookie-manager
基本命令:
解密:
python3 flask_session_cookie_manager3.py decode -c ciphertext -s secret_key
加密:
python3 flask_session_cookie_manager3.py encode -t plaintext -s secret_key
flask-unsign
下载命令:
pip3 install flask-unsign
基本命令:
解密:
flask-unsign --decode --cookie ciphertext
flask sesion格式
eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ(数据).ZnRL2A(时间戳).fJHOBVUj0kkWf8-RpzPhm_VvYSs(签名)
时间戳:用来告诉服务端数据最后一次更新的时间,超过31天的会话,将会过期,变为无效会话。
签名:是利用Hmac
算法,将session数据和时间戳加上secret_key
加密而成的,用来保证数据没有被修改。
只需要知道secret_key便可以轻松地伪造session。所以在做此类题时要去找secret_key。
例题
[NSSRound#13 Basic]flask?jwt?
进去随便注册一个账号登录
发现拿flag需要admin。
看看session
flask-unsign解密得到:
猜测admin的_user_id为1,
接下来是找secret_key,
在忘记密码页面的源代码中发现secret_key。
加密:
抓包,在/getFlag下传session,得到flag。
[CISCN 2019华东南]Web4
进去点击readsomething
发现跳转百度
可以SSRF,发现file伪协议无法使用,查了一下,发现可以用local_file://,读取/app/app.py,得到
secret_key的构造
uuid..getnode()用来得到mac地址,路径为/sys/class/net/eth0/address,local_file://读取文件,得到mac地址02:42:ac:02:9e:a1
编写脚本
import random random.seed(0x0242ac029ea1) a=str(random.random()*233)
在python2下运行得到secret_key
将www-data改为fuck并加密
抓包在/flag下发送session得到flag