审核大大,本篇文章全程打码,并无敏感信息
目录
4.1 JWT学生用户未授权添加teacherh和student用户
审核大大,本篇文章全程打码,并无敏感信息
前言
又是摸鱼的一天,闲的没事,找之前挖到漏洞的一个站玩玩,因为本次漏洞发现的过多写起博文来过长,因此本次单独将JWT这部分找出来进行记录,开局一个框,漏洞全靠扫,哦不对,全靠找.当然全文主要是对利用姿势做个总结,只有思路,没有详细利用,问就是报告写起来太费时间了,下面所有的利用流程图,通过打开新页面放大可以清晰查看,可自行下载食用.
免责声明
博文中涉及的方法可能带有危害性,仅供安全研究与教学之用,读者将其方法用作做其他用途,由读者承担全部法律及连带责任,文章作者不负任何责任.
1.JWT的原理
首先先对JWT做一个介绍和记录,不想看的师傅可以直接看实战部分
1.1 什么是JWT
JWT(JSON Web Token)是一种轻量级的身份验证和信息交换标准,它允许服务之间以JSON对象的形式安全地传输信息。这种信息传输方式之所以安全,是因为JWT通过数字签名来确保信息在传输过程中的完整性和真实性。
1.2 JWT的详细构成
JWT由三个部分组成,每部分之间用点号(.
)分隔:
-
Header(头部):定义了用于签名的算法和令牌的类型。通常,头部的JSON对象经过Base64Url编码后,形成JWT的第一个部分。例如:
{ "alg": "HS256", // 签名算法为HMAC SHA-256 "typ": "JWT" // 令牌类型为JWT }
-
Payload(负载):包含了所谓的声明(claims),这些声明可以是用户的身份信息、发行者、过期时间等。声明分为三类:
- Registered claims(注册声明):标准化的声明,如
exp
(过期时间)、iat
(签发时间)等。 - Public claims(公共声明):社区定义的声明,但不是注册声明,如
nonce
。 - Private claims(私有声明):自定义声明,用于特定应用的需要。 例如:
{ "sub": "12345612334", // 用户ID "name": "hello", // 用户名 "iat": 1516239213 // 签发时间 }
- Registered claims(注册声明):标准化的声明,如
-
Signature(签名):用于验证JWT的完整性和真实性。签名的生成依赖于Header中指定的算法、编码后的Header、编码后的Payload以及一个保密的密钥。例如,使用HMAC SHA-256算法的签名过程如下:
import hmac, hashlib, base64 header_payload = base64.urlsafe_b64encode(b"{Header}." + b"{Payload}").decode() secret = "your-256-bit-secret" signature = hmac.new(secret.encode(), header_payload.encode(), hashlib.sha256).digest() signature_base64 = base64.urlsafe_b64encode(signature).decode().strip()
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
1.3 Base64Url编码详解
Base64Url编码是Base64编码的URL安全版本,它在JWT中用于编码Header、Payload和生成的Signature,以确保它们可以安全地通过URL传输。Base64Url编码与标准Base64编码的主要区别在于:
- 使用
-
代替+
和使用_
代替/
,以避免URL解析错误。 - 省略了填充字符
=
,以避免URL长度问题。
2. 举例(JWT完整流程)
因为本次实战是没有发现JWT有做加密的所以还是无法用来当这个举例的案例的,我就伪造一个来展示一下这个完整的流程
1. 用户登录
假如本次用户在登录页面输入账号密码,然后进行登录。服务器接收到登录请求并验证用户的凭证。
2. 生成JWT
如果用户的凭证(账号密码)正确,服务器将生成一个JWT。假如服务器将生成的JWT为:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImhlbGxvIiwiaWF0IjoxNTE2MjEyMzQ1fQ.5NMJiA55CcTjy1O4fY1dGPFXRKFsANj-O4kv-kZIu-w
2.1 第一部分 Header
详细分解这个JWT的生成过程,一共三个部分,每个部分被点号(.)截断
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
用JSON Web Tokens - jwt.io进行base64url解码得到