记一次JWT伪造的实战漏洞挖掘( 审核大大,本篇文章全程打码,并无敏感信息)

 审核大大,本篇文章全程打码,并无敏感信息

目录

前言

1.JWT的原理

1.1 什么是JWT

1.2 JWT的详细构成

1.3 Base64Url编码详解

2. 举例(JWT完整流程)

1. 用户登录

2. 生成JWT

2.1 第一部分 Header

2.2 第二部分:Payload

2.3 第三部分:Signature

3. 返回JWT

4. 携带JWT进行请求

5. 服务器验证JWT

6. 响应请求

3. JWT三种常见的攻击方式

 4. 实战场景

4.1 JWT学生用户未授权添加teacherh和student用户

未授权添加学生用户

未授权添加老师用户

4.2 未授权遍历删除teacher和student用户

删除学生用户

删除teacher用户

5. 修复建议


                                审核大大,本篇文章全程打码,并无敏感信息

前言

        又是摸鱼的一天,闲的没事,找之前挖到漏洞的一个站玩玩,因为本次漏洞发现的过多写起博文来过长,因此本次单独将JWT这部分找出来进行记录,开局一个框,漏洞全靠扫,哦不对,全靠找.当然全文主要是对利用姿势做个总结,只有思路,没有详细利用,问就是报告写起来太费时间了,下面所有的利用流程图,通过打开新页面放大可以清晰查看,可自行下载用.

免责声明

        博文中涉及的方法可能带有危害性,仅供安全研究与教学之用,读者将其方法用作做其他用途,由读者承担全部法律及连带责任,文章作者不负任何责任.

1.JWT的原理

首先先对JWT做一个介绍和记录,不想看的师傅可以直接看实战部分

1.1 什么是JWT

        JWT(JSON Web Token)是一种轻量级的身份验证和信息交换标准,它允许服务之间以JSON对象的形式安全地传输信息。这种信息传输方式之所以安全,是因为JWT通过数字签名来确保信息在传输过程中的完整性和真实性。

1.2 JWT的详细构成

JWT由三个部分组成,每部分之间用点号(.)分隔:

  1. Header(头部):定义了用于签名的算法和令牌的类型。通常,头部的JSON对象经过Base64Url编码后,形成JWT的第一个部分。例如:

    {
      "alg": "HS256", // 签名算法为HMAC SHA-256
      "typ": "JWT"    // 令牌类型为JWT
    }
  2. Payload(负载):包含了所谓的声明(claims),这些声明可以是用户的身份信息、发行者、过期时间等。声明分为三类:

    • Registered claims(注册声明):标准化的声明,如exp(过期时间)、iat(签发时间)等。
    • Public claims(公共声明):社区定义的声明,但不是注册声明,如nonce
    • Private claims(私有声明):自定义声明,用于特定应用的需要。 例如:
    {
      "sub": "12345612334", // 用户ID
      "name": "hello",   // 用户名
      "iat": 1516239213     // 签发时间
    }
  3. 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解码得到

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XError_xiaoyu

你的支持,使我更好的创作

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值