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
创建一个账号 [email protected] / 123456
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头的请求包
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)