描述:
本项目是一个开源项目,任何用户都能获取到该项目中的硬编码的JWT Secret。同时,使用JWT Secret默认值启动项目时并没有任何警告提示,所以大多数用户可能不会修改此JWT Secret默认值,这可能导致攻击者伪造任意用户的权限令牌,从而绕过认证与授权机制,访问受保护接口。
密钥位置:
|
SECRET_KEY = '$@naaul9f4zi*3s%bze)5cq)q5ufwi!gj5do=area84pimi9p*' |
严重程度:
Critical
漏洞类型:
- CWE-798:Use of Hard-coded Credentials
- CWE-321:Use of Hard-coded Cryptographic Key
可利用分析:
1. 硬编码密钥
该项目在 settings.py:25 中硬编码了 SECRET_KEY,该值非空且可静态确定,攻击者可通过公开源码直接获取。
同时,SECRET_KEY 被配置为 SIMPLE_JWT['SIGNING_KEY'],位于 settings.py:197,因此该硬编码密钥会被用于 JWT 的签名校验流程。
| 项目 |
说明 |
| 密钥来源 |
settings.py:25 中的 SECRET_KEY |
| JWT 签名配置 |
settings.py:197 中的 SIMPLE_JWT['SIGNING_KEY'] |
| 密钥属性 |
非空、固定、可静态确定 |
| 安全风险 |
攻击者可获取密钥并伪造可通过验签的 JWT |
2. JWT Payload 分析
生产 Token 的 payload 包含多个用户身份和权限相关字段:
| 字段类型 |
字段 |
安全属性 |
| 用户身份字段 |
username、first_name、last_name、email、id、user_id |
持久化身份标识,攻击者可伪造 |
| 状态字段 |
is_active |
账号状态字段,攻击者可伪造 |
| 权限字段 |
is_staff、is_superuser |
权限相关字段,攻击者可伪造为高权限状态 |
其中,is_superuser、is_staff、is_active、id、user_id 等字段会影响后续身份识别和权限判断。由于这些字段均位于 JWT payload 中,攻击者在持有硬编码密钥后可自行构造对应字段值。
3. Token 校验链路
请求 Token 进入 JWTAuthentication.authenticate 后,服务端主要执行以下校验:
- 使用
SIMPLE_JWT['SIGNING_KEY'] 对 JWT 进行签名校验;
- 校验 Token 是否过期;
- 校验通过后,将 Token payload 中的字段映射到
request.user。
该校验链路未对 Access Token 执行额外的服务端状态校验:
- 未校验 Access Token 黑名单;
- 未校验 Access Token 白名单;
- 未校验服务端 Session 状态;
- 未校验
jti、nonce 或其他随机高熵字段;
- 未校验 Token 是否与真实登录状态绑定。
因此,Access Token 属于无状态 Token。服务端只依赖签名和过期时间进行校验,一旦攻击者掌握硬编码 SECRET_KEY,即可伪造能够通过校验的 Token。
4. 身份认证与授权影响
校验通过后,服务端会将 JWT payload 中的字段映射到 request.user。业务权限类 IsAuthenticated 和 CustomModelPerm 会依赖 request.user 上的属性进行鉴权决策,包括:
| 属性 |
影响 |
is_superuser |
影响管理员权限判断 |
is_active |
影响用户是否为有效账号 |
user.id / id / user_id |
影响用户身份识别和数据归属判断 |
由于这些属性均可由攻击者在伪造 JWT payload 时控制,攻击者可构造包含 is_superuser=true、is_active=true 以及任意用户 ID 的 Token。服务端验签通过后,会将其映射为具有相应权限的 request.user,从而绕过认证与授权机制。
5. 攻击路径
攻击者可按以下路径利用该漏洞:
- 从公开源码中获取硬编码
SECRET_KEY;
- 使用相同密钥和算法构造 JWT;
- 在 payload 中设置
is_superuser=true、is_active=true、任意 user_id 以及其他自定义 claims;
- 设置有效的过期时间;
- 携带伪造 Token 请求受保护接口;
- 服务端完成签名校验和过期时间检查;
- Token payload 被映射为
request.user;
- 权限类基于伪造的
request.user 属性进行鉴权,导致权限绕过。
影响:
- 攻击者可伪造任意用户的 JWT
- 可冒充管理员或高权限账号访问敏感接口
- 用户身份认证机制失效
- 可能导致数据泄露、越权操作或账户接管
修复建议:
可以将JWT Secret放入系统环境变量中或者禁止使用默认值启动项目。
描述:
本项目是一个开源项目,任何用户都能获取到该项目中的硬编码的JWT Secret。同时,使用JWT Secret默认值启动项目时并没有任何警告提示,所以大多数用户可能不会修改此JWT Secret默认值,这可能导致攻击者伪造任意用户的权限令牌,从而绕过认证与授权机制,访问受保护接口。
密钥位置:
webterminal/webterminal/settings.py
Line 25 in 637ff33
严重程度:
Critical
漏洞类型:
可利用分析:
1. 硬编码密钥
该项目在
settings.py:25中硬编码了SECRET_KEY,该值非空且可静态确定,攻击者可通过公开源码直接获取。同时,
SECRET_KEY被配置为SIMPLE_JWT['SIGNING_KEY'],位于settings.py:197,因此该硬编码密钥会被用于 JWT 的签名校验流程。settings.py:25中的SECRET_KEYsettings.py:197中的SIMPLE_JWT['SIGNING_KEY']2. JWT Payload 分析
生产 Token 的 payload 包含多个用户身份和权限相关字段:
username、first_name、last_name、email、id、user_idis_activeis_staff、is_superuser其中,
is_superuser、is_staff、is_active、id、user_id等字段会影响后续身份识别和权限判断。由于这些字段均位于 JWT payload 中,攻击者在持有硬编码密钥后可自行构造对应字段值。3. Token 校验链路
请求 Token 进入
JWTAuthentication.authenticate后,服务端主要执行以下校验:SIMPLE_JWT['SIGNING_KEY']对 JWT 进行签名校验;request.user。该校验链路未对 Access Token 执行额外的服务端状态校验:
jti、nonce或其他随机高熵字段;因此,Access Token 属于无状态 Token。服务端只依赖签名和过期时间进行校验,一旦攻击者掌握硬编码
SECRET_KEY,即可伪造能够通过校验的 Token。4. 身份认证与授权影响
校验通过后,服务端会将 JWT payload 中的字段映射到
request.user。业务权限类IsAuthenticated和CustomModelPerm会依赖request.user上的属性进行鉴权决策,包括:is_superuseris_activeuser.id/id/user_id由于这些属性均可由攻击者在伪造 JWT payload 时控制,攻击者可构造包含
is_superuser=true、is_active=true以及任意用户 ID 的 Token。服务端验签通过后,会将其映射为具有相应权限的request.user,从而绕过认证与授权机制。5. 攻击路径
攻击者可按以下路径利用该漏洞:
SECRET_KEY;is_superuser=true、is_active=true、任意user_id以及其他自定义 claims;request.user;request.user属性进行鉴权,导致权限绕过。影响:
修复建议:
可以将JWT Secret放入系统环境变量中或者禁止使用默认值启动项目。