freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

JWT 原理与漏洞深度解析及攻防实战
LYL 2025-03-04 09:41:15 133061
所属地 广东省

一、JWT 原理详解

1. JWT 结构

JWT 由三部分组成,以 .分隔:

  • Header:声明算法(alg)和类型(typ),例如:

    {
      "alg": "HS256",
      "typ": "JWT",
      "kid": "default"  // 可选参数,用于指定密钥 ID
    }
  • Payload:存储用户身份和权限信息,例如:

    {
      "sub": "user123",
      "exp": 1720000000,  // 过期时间
      "admin": true
    }
  • Signature:对 Header 和 Payload 的签名,防止篡改。
    签名生成逻辑(以 HS256 为例):

    signature = HMACSHA256(
      base64UrlEncode(header) + "." + base64UrlEncode(payload),
      secret_key
    )

最终 Token 格式:base64(Header).base64(Payload).base64(Signature)

2. JWT 工作流程

  1. 用户登录:客户端发送凭证(如用户名/密码)。

  2. 服务端生成 JWT:验证成功后返回签名的 Token。

  3. 客户端存储:通常存储在 Cookie 或 LocalStorage。

  4. 后续请求:客户端携带 Token,服务端验证签名和有效期。

二、JWT 漏洞场景深度剖析

1. 敏感信息泄露

  • 漏洞原理
    JWT 的 Payload 仅通过 Base64 编码,未加密。若开发者将敏感数据(如密码、密钥、手机号)存入 Payload,攻击者可轻易解码获取信息。

  • 实际案例
    某电商平台将用户地址和手机号明文存入 JWT,攻击者通过解码 Token 获取用户隐私数据。

  • 代码示例(错误 vs 正确)

    # 错误:明文存储手机号
    payload = {"user": "admin", "phone": "13800138000"}
    
    # 正确:仅存储必要标识
    payload = {"user_id": "a3f8b", "role": "user"}  # 使用无意义 UUID 替代敏感字段
  • 利用方式
    使用浏览器开发者工具或在线解码工具(如 jwt.io)直接读取 Payload:

    echo "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwaG9uZSI6IjEzODAwMTM4MDAwIn0" | base64 -d
    # 输出:{"phone":"13800138000"}
  • 防御方案

    • 最小化 Payload 内容,避免存储敏感数据。

    • 对必要敏感字段加密(如 AES)后再存入 Payload。

2. 接受任意签名(alg: none攻击)

  • 漏洞原理
    当服务端未强制校验签名算法时,攻击者可篡改 Header 的 alg为 none,绕过签名验证。

  • 攻击步骤

    1. 截获合法 Token:header.payload.signature

    2. 修改 Header 为 {"alg": "none", "typ": "JWT"}

    3. 删除 Signature,构造新 Token:malicious_header.payload.

    4. 发送给服务端,若验证通过则攻击成功。

  • 代码示例(服务端漏洞代码)

    # 错误:未限制算法类型
    def decode_token(token):
        return jwt.decode(token, key="secret", algorithms=None)  # 允许所有算法
  • 利用工具
    使用 Burp Suite 的 Repeater模块修改请求头,或手动生成 Token:

    import base64
    header = base64.urlsafe_b64encode(b'{"alg":"none","typ":"JWT"}').decode().strip("=")
    payload = base64.urlsafe_b64encode(b'{"user":"admin"}').decode().strip("=")
    fake_token = f"{header}.{payload}."
可试读前30%内容
¥ 19.9 全文查看
9.9元开通FVIP会员
畅读付费文章
最低0.3元/天
# 渗透测试 # web安全 # JWT
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 LYL 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
LYL LV.4
这家伙太懒了,还未填写个人描述!
  • 22 文章数
  • 12 关注者
Java代码审计中的SSRF漏洞深度解析
2025-03-14
企业云安全中的Kubernetes攻击手法及防御策略
2025-03-06
XSS 漏洞深度解析:攻防对抗与高阶利用
2025-03-05
文章目录