1.什么是JWT
JWT=JSON+WEB+TOKEN,它并不是一个具体的技术实现,而更像是一种标准。
JWT规定了数据传输的结构,一串完整的JWT由三段落组成,每个段落用英文句号连接(.)连接;
他们分别是:Header、Payload、Signature,所以,常规的JWT内容格式是这样的:AAA.BBB.CCC,并且,这一串内容会base64加密;也就是说base64解码就可以看到实际传输的内容。
解码网站: https://jwt.io/
2.JWT结构组成
JWT由三部分组成,header(头部)、payload(荷载)、signature(签证)。
2.1 header
记录了整个令牌的类型和签名算法,格式为json,如下:
{
"alg":"HS256",
"typ":"JWT"
}
2.2 payload
部分是jwt的主体信息,它仍然是一个JSON对象,它可以包含以下内容:
{
"ss":"发行者",
"iat":"发布时间",
"exp":"到期时间",
"sub":"主题",
"aud":"听众",
"nbf":"在此之前不可用",
"jti":"JWT ID"
}
2.3 signature
这一部分是jwt的签名,正是它的存在,保证了整个jwt不被篡改
这部分的生成,是对前面两个部分的编码结果,按照头部指定的方式进行加密
3.使用JWT的会话流程
1、用户端登录,用户名和密码在请求中被发往服务器
2、(确认登录信息正确后)服务器生成JSON头部和声明,将登录信息写入JSON的声明中(通常不应写入密码,因为JWT是不加密的),并用secret用指定算法进行加密,生成该用户的JWT。此时,服务器并没有保存登录状态信息。
3、服务器将JWT(通过响应)返回给客户端
4、用户下次会话时,客户端会自动将JWT写在HTTP请求头部的Authorization字段中
5、服务器对JWT进行验证,若验证成功,则确认此用户的登录状态
6、服务器返回响应
4.JWT安全性问题
1.修改算法为none
2.修改算法从RS256到HS256
3.信息泄漏 密钥泄漏
4.爆破密钥
5.存在的漏洞
Alg:无攻击
密钥混淆攻击
密钥注入攻击 其他已知攻击
JWKS 欺骗
注射
跨服务中继攻击
弱密钥
6.环境搭建
这里使用一个国外的Java靶场,WebGoat是由OWASP(Open Web Application Security Project)负责维护的一个漏洞百出的J2EE Web应用程序,这些漏洞并非程序中的Bug,而是故意设计用来讲授Web应用程序安全课程的。
WebGaot:https://github.com/WebGoat/WebGoat/releases/tag/v8.2.2
由于WebToken需要jdk17来启动,有些小伙伴可能不想去再安装一个Java,我们可以去Oracle官网下载JDK17。
https://www.oracle.com/java/technologies/downloads/#jdk17-windows
将WebGoat放到bin文件下,使用./java -jar webgoat-server-8.2.2.jar来启动
7.题目复现
一、JWTtokes第三题
我们直接将代码复制到我上面说的网站解码,就看到用户。
直接user提交即可。
二、JWTtokes第五题
任务:尝试更改您收到的令牌并通过更改令牌成为管理员用户,一旦您成为管理员重置投票 。
我们将用户切换为Tom
点击重置进行抓包
抓包发送,显示只有admin才有重置权限。
我们队token进行解码,将admin后边的false改为true,将签名算法HS512改为none,因为签名算法为空,我们可以直接舍弃第三部分签名。
我们base64加密,构造新的JWT
ew0KICAiYWxnIjogIm5vbmUiDQp9.ew0KICAiaWF0IjogMTY3Njc5NDYzMiwNCiAgImFkbWluIjogInRydWUiLA0KICAidXNlciI6ICJUb20iDQp9.
成功重置
三、JWTtokes第十题
这道题目需要冒充tom来支付,我们点击checkout来抓包,进行重放。
提示我们Not a valid JWT token, please try again,在127.0.0.1:8080/WebGoat/images/logs.txt,发现一个过期的token。
我们继续去解码一下,看看有没有用到的信息。
虽然我们不知道密钥,但是可以通过直接把算法改成None,去掉密钥。
再修改一下exp(token过期时间,单位毫秒),把光标放在exp或iat的值上会自动显示时间。
我们去生成一个新的时间戳(要比当前时间晚),因为签名算法为空,我们可以直接舍弃第三部分签名。
eyJhbGciOiJOb25lIn0.eyJpYXQiOjE1MjYxMzE0MTEsImV4cCI6MTY3NjAxNDQxMywiYWRtaW4iOiJmYWxzZSIsInVzZXIiOiJUb20ifQ.
我们添加为Authorization字段的值
成功!!!
借鉴:
https://blog.csdn.net/weixin_44736637/article/details/124005231
https://www.jianshu.com/p/576dbf44b2ae
https://blog.csdn.net/qq_45557476/article/details/123171281
https://blog.csdn.net/XenonL/article/details/104645445
觉得可以的话,麻烦转发+关注走一波
不然.......别怪我
原文始发于微信公众号(白虎实验室):浅谈JWT越权原理与利用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论