JWT越权访问漏洞
文章目录
- JWT越权访问漏洞
- 原文参考 :[xiu](http://www.xiusafe.com/2023/02/08/JWT/)
- 1 靶场搭建:
- 2 JWT的头部组成
- 2.1 头部
- 2.1.1 alg:
- 2.1.2 type:
- 2.2 payload
- 2.3 签名
- 3 漏洞复现
- 3.1 攻击点token(第三关)
- 3.2 对token值base64的加密码方式进行解析加密编码,只能看。
- 3.3 修改解密后的json,在加密成base64
- 3.3.1 base64加密方式解密网
- 3.3.2 将获取修改后的base64,放入解读加密方式
- 3.3.3 最后组成base64,后面的点一定有,后台是根据点分隔取值
- 3.4 使用bp抓包,将加密后的base64替换token值,send发送
- 4 第四关
- 5 第五关
- 6 第7关
原文参考 :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 密码字典