目录
1.什么是JWT?
JSON Web Token (JWT) 是一种开放标准(RFC 7519),主要用于在各方之间安全地传输信息。JWT本质上是一个经过数字签名的JSON对象,它可以被编码成一个紧凑的、URL安全的字符串,便于在网络中传输。
JWT的主要组成部分包括三部分,它们之间用点(`.`)分隔:
1. 头部(Header):包含关于JWT元数据的JSON对象,例如加密算法的类型(通常是HS256、RS256等)。
```json
{
"alg": "HS256",
"typ": "JWT"
}
```
2. 载荷(Payload):包含了实际要传输的数据,这些数据可以是公开的(任何人都可以读取)或私有的(只有持有密钥的人才能读取)。载荷部分可以包含诸如用户ID、用户名、过期时间(exp)、发行时间(iat)以及其他自定义声明(claims)等信息。sub
主要是用于标识和追踪用户的身份。name
用于存储和展示用户的姓名信息。这两个字段都可以用于在服务端和客户端之间无状态地传递用户相关信息。
```json
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242022
}
```
3. 签名(Signature):通过对前两部分进行编码并使用头部中指定的密钥和算法进行计算得出。这确保了JWT的内容没有被篡改,并且可以确认发送者的身份。
```
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
```
当一个JWT被生成时,头部、载荷会被Base64 URL安全编码,并与签名一起组成完整的JWT字符串,如 `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyNDIwMjJ9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ`
JWT常见使用场景包括:
- 认证和授权:服务器可以在用户成功登录后生成一个包含用户信息和过期时间的JWT,客户端在后续请求中携带此JWT,服务器仅需验证JWT的有效性即可确定用户身份及权限,无需持久化会话信息。
- 单点登录(Single Sign-On, SSO):多个子系统可以共享同一个JWT,实现一次登录在整个系统中的应用。
- 安全数据交换:JWT可以封装敏感信息,并通过加密签名保证数据的完整性和来源可信度。
2.JWT认证漏洞原理介绍
由于其工作方式和使用环境的特点,实践中可能出现一些安全漏洞。以下是几个常见的JWT认证漏洞原理:
-
缺乏密钥管理:
- 如果用于签署JWT的密钥泄露,攻击者就可能伪造合法的JWT,从而假冒任何用户的身份。
- 不恰当的密钥轮换机制也可能导致旧密钥仍在使用期间被破解,造成安全隐患。
-
未验证签发者(Issuer,iss):
- 如果服务端没有验证JWT的签发者字段,攻击者可以创建或篡改JWT,将其指向一个受信任的iss,从而欺骗服务端接受伪造的令牌。
-
未验证受众(Audience,aud):
- JWT的受众字段用于标识预期的接收者,如果服务端不验证aud字段,攻击者可能利用适用于其他服务的JWT获得权限。
-
宽松的过期时间(Expiration Time,exp)和刷新时间(Not Before,nbf)验证:
- 如果JWT的有效期检查不严格,攻击者可能会重放过期但尚未清除的令牌,或者提前使用未来才生效的令牌。
-
令牌劫持(Token Hijacking / Session Riding):
- 当客户端在HTTP连接中明文传输JWT时,攻击者可通过中间人攻击(MITM)截取并重新使用令牌。
-
缺少黑名单机制:
- 一旦JWT被盗,如果不立即添加到黑名单中,即使其后续失效也无法阻止攻击者短时间内继续使用。
-
恶意令牌注入:
- 如果服务端在处理JWT时,没有正确处理JWT的边界情况,攻击者可能通过注入额外的信息或修改现有的JWT部分来逃避授权逻辑。
-
Header注入(如kid注入):
- 在JWT的头部可能存在注入漏洞,例如通过“kid”(key ID)字段可能导致服务器使用错误的密钥进行验证。
3.JWT漏洞利用工具
-
c-jwt-cracker
- 地址:GiHub - lmammino/jwt-cracker: Simple HS256, S384 & HS512 JWT token brute fore cracker
- 功能:c-jwt-cracker是一个针对HS256算法的JWT令牌破解工具,特别适用于当密钥强度不足时的暴力破解。
-
其他在线工具和库
- JWT Token在线解析解码 - ToolTT在线工具箱
- JSON Web Tokens - jwt.io
- 网站提供了一个在线JWT解码器和验证器,虽然本身不是一个漏洞利用工具,但它可以辅助分析JWT结构和验证签名,有助于发现潜在问题。
- 社区里还有其他一些脚本和工具,如自定义编写的脚本,可以针对特定JWT实现中存在的弱点进行测试,如改变alg属性为None以绕过签名验证等。
4.jwt绕过
-
未验证签名:
- 攻击方式:如果服务器不验证JWT的签名(Signature),攻击者可以随意修改Payload数据。
- 防御措施:始终在接收JWT时对其进行严格的签名验证。确保使用安全的密钥对JWT进行签名,并且客户端和服务端都要验证签名。
-
固定密钥泄露:
- 攻击方式:如果用于签署JWT的密钥被泄露,攻击者可以用它来创建有效的JWT。
- 防御措施:定期更换密钥,不要在公开场合暴露密钥。使用HS256、RS256等算法保证密钥的安全性,并采取必要的密钥管理策略。
-
失效令牌重放:
- 攻击方式:即使JWT设置了过期时间(exp claim),攻击者仍可能在有效期内截获并重复使用一个有效的JWT。
- 防御措施:除了检查过期时间外,还可以设置JWT的“不可重复使用”标志(如jti claim),并在服务器端记录已使用的JWT ID,防止重放攻击。
-
令牌刷新机制漏洞:
- 攻击方式:如果刷新令牌(Refresh Token)处理不当,可能会被利用来进行持久访问。
- 防御措施:限制刷新令牌的有效范围和生命周期,当用户登出时立即废止所有相关令牌。
-
JWT长度攻击:
- 攻击方式:某些库可能没有正确处理JWT的长度,导致溢出或缓冲区错误,从而触发安全问题。
- 防御措施:使用安全且经过充分测试的JWT解析库,并确保它们能够妥善处理异常情况。
5.CTF例题
https://blog.51cto.com/u_14178266/8499283#_2021jwt1_11
总结:
1.权限绕过
截取到jwt,然后修改其中的id或者name等字段,进行权限绕过
2.密钥破解
主要利用工具对jwt的密钥进行暴力枚举破解
3.算法修改
截取到jwt,对alg字段修改为none,然后删除签名部分即可
4.密钥泄露
利用:攻击者可以伪造有效的JWT令牌,冒充合法用户获取授权访问服务、修改用户信息,甚至执行特权操作。
危害:影响用户隐私、破坏授权系统,引发数据泄露、业务逻辑漏洞等问题。
有待更新中...