JWT 算法混淆攻击

JWT 算法混淆攻击

一、前言

JWT 算法混淆漏洞成因

该漏洞本质是服务端验证逻辑的两个失误:

  1. 信任 alg 字段:服务端未强制固定验签算法,而是听从 JWT Header 中的 alg 声明。
  2. 密钥上下文混淆:当算法被改为 HS256(对称加密)时,服务端错误地复用 RSA 公钥 作为 HMAC 的 密钥

正常情况下,公钥仅用于验签 RS256 签名。但在 HS256 模式下,公钥变成了“对称密钥”。因为公钥是公开的,攻击者即可用它伪造签名,通过服务端验证。

二、靶场测试

靶场地址(需注册账号):https://portswigger.net/web-security/jwt/algorithm-confusion/lab-jwt-authentication-bypass-via-algorithm-confusion

1. 进入靶场

进入靶场,点击My account进入登录页面,输入账号密码登录:

wiener
peter

image

进入admin界面,显示只有administrator用户才能使用:

image

2. 获取公钥

访问jwks.json获取服务器的RSA公钥

{"kty":"RSA","e":"AQAB","use":"sig","kid":"4c7c90f0-f586-4caf-916f-cb261365751e","alg":"RS256","n":"tmF7ZxEtKCB042bKRwSfCEs1brWUpfDnVyIORK-APdxTa8IUdVef3duwnmzbOjVdPM5jKmEYWfG8GEiqebrZ2Vd__1rXa0nluSUe-FWkEN2Z7oLn8RYOa6Qa2CRpCxwvJ4aVN3ogDbCHXDsZnnneIVk47dj8JFu9xta8xFo7S1UYaTMmvTCeAMPj67X5FyVyyAR2vl4UN3ISM9-8NxyL-BL5O0x-Pa70j17_KZkQEJMG_CZpUn-JNx9SmTwCKzAxX_vs_aW3ytiJBSOYK1M0RWdiskz9LbZnHNxRaggbhVKQnN2kkIMdI5xUDqSr-XCjS901PddwoEkaZWOCA9aISw"}

image

使用在线网站一键转换为PEM格式公钥(也可以自己编写Python脚本或者使用Burp的JWT Editor)

地址:https://atools.live/zh-cn/tools/pem-jwk-toolkit

image

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtmF7ZxEtKCB042bKRwSf
CEs1brWUpfDnVyIORK+APdxTa8IUdVef3duwnmzbOjVdPM5jKmEYWfG8GEiqebrZ
2Vd//1rXa0nluSUe+FWkEN2Z7oLn8RYOa6Qa2CRpCxwvJ4aVN3ogDbCHXDsZnnne
IVk47dj8JFu9xta8xFo7S1UYaTMmvTCeAMPj67X5FyVyyAR2vl4UN3ISM9+8NxyL
+BL5O0x+Pa70j17/KZkQEJMG/CZpUn+JNx9SmTwCKzAxX/vs/aW3ytiJBSOYK1M0
RWdiskz9LbZnHNxRaggbhVKQnN2kkIMdI5xUDqSr+XCjS901PddwoEkaZWOCA9aI
SwIDAQAB
-----END PUBLIC KEY-----

在jwt.io用该公钥对自己的JWT验签,可以看到验签成功

image

3. 构造JWT

由于在jwt.io直接粘贴公钥构造签名会出错,经过检查发现是0d0a换行的问题,所以这里用CyberChef转换一下,替换0d0a为0a,然后编码成URL safe的Base64:

LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0bUY3WnhFdEtDQjA0MmJLUndTZgpDRXMxYnJXVXBmRG5WeUlPUksrQVBkeFRhOElVZFZlZjNkdXdubXpiT2pWZFBNNWpLbUVZV2ZHOEdFaXFlYnJaCjJWZC8vMXJYYTBubHVTVWUrRldrRU4yWjdvTG44UllPYTZRYTJDUnBDeHd2SjRhVk4zb2dEYkNIWERzWm5ubmUKSVZrNDdkajhKRnU5eHRhOHhGbzdTMVVZYVRNbXZUQ2VBTVBqNjdYNUZ5Vnl5QVIydmw0VU4zSVNNOSs4Tnh5TAorQkw1TzB4K1BhNzBqMTcvS1prUUVKTUcvQ1pwVW4rSk54OVNtVHdDS3pBeFgvdnMvYVczeXRpSkJTT1lLMU0wClJXZGlza3o5TGJabkhOeFJhZ2diaFZLUW5OMmtrSU1kSTV4VURxU3IrWENqUzkwMVBkZHdvRWthWldPQ0E5YUkKU3dJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg

image

进入Encoder界面,Header的RS256(带有SHA-256的 RSA 签名)改为HS256(带有 SHA-256 的HMAC),Payload的sub改为administrator,Secret填入刚才的Base64编码后的PEM公钥

image

eyJraWQiOiI0YzdjOTBmMC1mNTg2LTRjYWYtOTE2Zi1jYjI2MTM2NTc1MWUiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTc3MzUwNTAzNiwic3ViIjoiYWRtaW5pc3RyYXRvciJ9.s2UHOkkOGGiazE4JgW8E2SoLLNkGbBcbCrBRSHHIrG4

4.验证

访问my-account接口,Cookie换成构造的JWT,显示当前用户为administrator

image

可以访问admin接口了

image

这里抓包替换查看更直观一点:

image

点击Delete,抓包替换一下JWT,删除用户成功,通关成功

image


本文作者CVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
先知社区:https://xz.aliyun.com/users/136909
微信公众号:Lemon安全

posted @ 2026-03-15 17:30  CVE-柠檬i  阅读(1)  评论(0)    收藏  举报