freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

经验分享 | 一文学会jwt劫持
0x1eeA 2024-08-07 10:41:02 104570

jwt是什么

JWT全称是JSON Web Token,如果从字面上理解感觉是基于JSON格式用于网络传输的令牌。实际上,JWT是一种紧凑的Claims声明格式,旨在用于空间受限的环境进行传输,常见的场景如HTTP授权请求头参数和URI查询参数。JWT会把Claims转换成JSON格式,而这个JSON内容将会应用为JWS结构的有效载荷或者应用为JWE结构的(加密处理后的)原始字符串,通过消息认证码(Message Authentication Code或者简称MAC)和/或者加密操作对Claims进行数字签名或者完整性保护。

看不懂没关系,简单理解: 鉴权方式

环境搭建

# OWASP Juice Shop靶场

配置: kali docker

# 拉取Owasp juice shop容器
docker pull bkimminich/juice-shop

# 启动容器
docker run -d -p 3000:3000 bkimminich/juice-shop

搭建好访问 ip:3000

创建一个账号 leea@163.com / 123456

1722996438_66b2d6d6a32bbc5ce2999.png!small

1722996451_66b2d6e3dffc1f33ab679.png!small

jwt三部分

jwt组成的三部分:头部,载荷,签名

头部(HEADER)

一个json字符串,包含当前令牌名称,以及加密算法

{"typ":"JWT","alg":"HS256"}

使用base64加密后

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

载荷(PAYLOAD)

一个json字符创,包含一些自定义的信息

{"sub":"1234567890","name":"John Doe","admin":true}

使用base64加密

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

签名(VERIFY SIGNATURE)

由头部信息使用base64加密之后,拼接上载荷使用base64加密之后的部分,在加上当前的密钥,进行头部中的加密算法进行加密

header (base64后的)

payload (base64后的)

secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

将这三部分用.连接成一个完整的字符串,构成了最终的jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

原理

弄清楚jwt的组成部分后我们知道了

1.加密方法是base64编码后的,我们可见,可操作
2.载荷数据是base64编码后的,也可以操作
3.签名是密钥加密的,我们不知道密钥,无法操作

ok,问题很明确了,目前卡住我们的只有签名,有什么办法能绕过签名?

答案很明确: 让签名为空即可,首先我们已知签名的形成依赖于头部的加密算法,密钥,以及载荷的数据而形成的,而因为密钥我们无从得知,导致无法进行加密,载荷内容就算可以修改也不被后面的签名承认,所以密钥以及载荷的数据都不是入手点,那要怎样修改加密算法才能让签名为空? 答案是,当不存在加密算法,也就是加密方式为 None

jwt劫持复现

1.抓取登录包

我们用刚注册的账号登录,抓包,不断放包,找到有Authorization头的请求包

可试读前30%内容
¥ 19.9 全文查看
9.9元开通FVIP会员
畅读付费文章
最低0.3元/天
# 渗透测试 # 网络安全 # web安全 # 数据安全 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 0x1eeA 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
0x1eeA LV.3
一只热衷于通用漏洞挖掘和技术分享的web狗,任何个人文章问题请私信。
  • 10 文章数
  • 37 关注者
js逆向 | AES加密下的SQL注入
2025-03-06
python分享 | 写出自己的第一个exp
2025-01-03
攻防演练 | JS泄露到主机失陷
2024-12-09
文章目录