描述:
本项目是一个开源项目,任何用户都能获取到该项目中的硬编码的JWT Secret。同时,使用JWT Secret默认值启动项目时并没有任何警告提示,所以大多数用户可能不会修改此JWT Secret默认值,这可能导致攻击者伪造任意用户的权限令牌,从而绕过认证与授权机制,访问受保护接口。
密钥位置:
|
SigningKey = "XnEsT0S@" # Secret key |
|
SigningKey string `default:"XnEsT0S@"` // secret key |
漏洞类型:
| 类型 |
说明 |
| Hardcoded Secret |
硬编码密钥 |
| JWT Secret Disclosure |
JWT 密钥泄露 |
| JWT Forgery |
JWT 伪造 |
| Authentication Bypass |
身份认证绕过 |
| Authorization Bypass |
授权绕过 |
| User Impersonation |
用户冒充 |
| Privilege Escalation |
权限提升 |
| Broken Access Control |
访问控制失效 |
| CWE-798 |
Use of Hard-coded Credentials |
| CWE-321 |
Use of Hard-coded Cryptographic Key |
风险等级:
高危
可利用分析:
该项目的 JWT Secret 可从配置文件和代码结构体默认值中静态获取:
| 来源 |
位置 |
说明 |
| 配置文件 |
configs/dev/middleware.toml |
定义 JWT Secret 默认配置 |
| 代码默认值 |
internal/config/middleware.go |
在中间件配置结构体中定义默认 JWT Secret |
该密钥经配置加载流程进入 JWT Token 的签发与校验逻辑:
| 流程 |
位置 |
说明 |
| Token 签发 |
jwt.go:108 |
使用 SignedString 生成 JWT |
| Token 校验 |
jwt.go:128 |
使用 ParseWithClaims 解析并验证 JWT |
请求 Token 校验链路中,ParseSubject 会对 JWT 进行签名验证,并通过 store.Check 检查 Token 是否位于黑名单中,即是否已登出。该机制属于半状态 Token 校验模型:服务端会检查黑名单状态,但不会校验 Token 是否由服务端真实签发,也不会绑定不可伪造的服务端会话状态。
JWT Payload 仅包含 StandardClaims,其中 Subject 表示 userID。Token 中不包含角色或权限字段。
| 字段 |
含义 |
安全分析 |
Subject |
用户 ID,即 userID |
持久化身份标识,攻击者可枚举、猜测或通过注册获取 |
| 标准时间字段 |
如过期时间等 |
攻击者在伪造 Token 时可自行设置 |
校验通过后,业务代码会根据 Subject 中的 userID 从数据库查询用户状态和角色,并基于查询结果进行 Casbin 权限校验。也就是说,JWT Payload 中的 userID 会直接影响后续身份识别和访问控制决策。
攻击者一旦获取该硬编码 JWT Secret,即可构造包含任意 userID 的 JWT。由于伪造 Token 不在黑名单中,store.Check 会返回未登出状态,从而通过校验。随后服务端会根据伪造 Token 中的 userID 查询数据库,并将攻击者识别为对应用户。
如果攻击者指定的是已激活用户或高权限用户的 userID,即可获得该用户的角色和权限,进而访问受保护接口,造成身份冒充、认证绕过和越权访问。
影响:
- 攻击者可伪造任意用户的 JWT
- 可冒充管理员或高权限账号访问敏感接口
- 用户身份认证机制失效
- 可能导致数据泄露、越权操作或账户接管
修复建议:
可以将JWT Secret放入系统环境变量中或者禁止使用默认值启动项目。
描述:
本项目是一个开源项目,任何用户都能获取到该项目中的硬编码的JWT Secret。同时,使用JWT Secret默认值启动项目时并没有任何警告提示,所以大多数用户可能不会修改此JWT Secret默认值,这可能导致攻击者伪造任意用户的权限令牌,从而绕过认证与授权机制,访问受保护接口。
密钥位置:
gin-admin/configs/dev/middleware.toml
Line 31 in 2287d87
gin-admin/internal/config/middleware.go
Line 39 in 2287d87
漏洞类型:
风险等级:
高危
可利用分析:
该项目的 JWT Secret 可从配置文件和代码结构体默认值中静态获取:
configs/dev/middleware.tomlinternal/config/middleware.go该密钥经配置加载流程进入 JWT Token 的签发与校验逻辑:
jwt.go:108SignedString生成 JWTjwt.go:128ParseWithClaims解析并验证 JWT请求 Token 校验链路中,
ParseSubject会对 JWT 进行签名验证,并通过store.Check检查 Token 是否位于黑名单中,即是否已登出。该机制属于半状态 Token 校验模型:服务端会检查黑名单状态,但不会校验 Token 是否由服务端真实签发,也不会绑定不可伪造的服务端会话状态。JWT Payload 仅包含
StandardClaims,其中Subject表示userID。Token 中不包含角色或权限字段。SubjectuserID校验通过后,业务代码会根据
Subject中的userID从数据库查询用户状态和角色,并基于查询结果进行 Casbin 权限校验。也就是说,JWT Payload 中的userID会直接影响后续身份识别和访问控制决策。攻击者一旦获取该硬编码 JWT Secret,即可构造包含任意
userID的 JWT。由于伪造 Token 不在黑名单中,store.Check会返回未登出状态,从而通过校验。随后服务端会根据伪造 Token 中的userID查询数据库,并将攻击者识别为对应用户。如果攻击者指定的是已激活用户或高权限用户的
userID,即可获得该用户的角色和权限,进而访问受保护接口,造成身份冒充、认证绕过和越权访问。影响:
修复建议:
可以将JWT Secret放入系统环境变量中或者禁止使用默认值启动项目。