Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-75431_PowerJob_jwt_key_predictable — Démontre une vulnérabilité critique de prédictibilité de la clé de signature JWT dans PowerJob Server, permettant la dérivation hors ligne de la clé et la contrefaçon de jetons pour la prise de contrôle administrateur et le contournement de l'authentification OpenAPI. | Kitploit
Outils/GitHubGitHub/unpredictable21/cve-2026-75431_powerjob_jwt_key_predictable
Analyse des VulnérabilitésExploitationSécurité WebTests d'IntrusionAuthentification
GitHubunpredictable21/cve-2026-75431_powerjob_jwt_key_predictable

CVE-2026-75431_PowerJob_jwt_key_predictable

Démontre une vulnérabilité critique de prédictibilité de la clé de signature JWT dans PowerJob Server, permettant la dérivation hors ligne de la clé et la contrefaçon de jetons pour la prise de contrôle administrateur et le contournement de l'authentification OpenAPI.

Voir le dépôt
7il y a 1 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Clé de signature JWT PowerJob Prédictible (Clé Dérivée de l'URL JDBC par Défaut) → Contrefaçon de Jeton

1. Résumé

La clé de signature JWT (HS256) du serveur PowerJob est dérivée en décodant en BASE64 une constante codée en dur concaténée avec le MD5 de l'URL JDBC par défaut (DefaultSecretProvider / JwtServiceImpl). L'URL JDBC est publique dans le déploiement par défaut (docker-compose / application-daily.properties), donc un attaquant peut dériver la clé entièrement hors ligne et forger un JWT valide pour n'importe quel utilisateur (y compris l'administrateur) ; le jeton d'application OpenAPI peut également être forgé pour contourner l'authentification OpenAPI.

2. Produit Affecté

  • Produit : Serveur PowerJob (console web 7700 + OpenAPI)
  • Versions affectées : 5.1.2
  • Déploiement par défaut : application-daily.properties expose en clair
jdbc:mysql://powerjob-mysql:3306/powerjob-daily?...

3. Emplacement de la Vulnérabilité

  • 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 : constante BASE_SECURITY codée en dur ; genSecretKey(secret) = Decoders.BASE64.decode(BASE_SECURITY.concat(secret)) → Keys.hmacShaKeyFor
  • La clé partage le dépôt/la base de données avec les données métier ; l'URL JDBC est en clair dans la configuration/docker-compose.

4. Cause Racine

  • Une clé prédictible / dérivable est utilisée au lieu d'une clé aléatoire et persistante : la clé ne dépend que d'une constante publique + du MD5 de l'URL par défaut publique.
  • La charge utile JWT (username/encryptedToken) dispose d'un contrôle secondaire pour les comptes PWJB (DigestUtils.rePassword(password, username)), mais :
    • avec le mot de passe par défaut, cette valeur est calculable hors ligne → prise de contrôle totale de l'administrateur ;
    • le jeton d'application OpenAPI (revendications appId/password/encryptType) peut être forgé directement pour contourner l'authentification (OpenApiSecurityServiceImpl:87-105) ;
    • d'autres comptes de connexion tiers peuvent ne pas avoir de contrôle secondaire.

5. Reproduction (vérifiée — de bout en bout complète)

Environnement : serveur PowerJob local (127.0.0.1:7700, URL JDBC jdbc:mysql://127.0.0.1:3307/powerjob_daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true). L'attaquant dérive tout hors ligne à partir d'informations publiques uniquement :

root@kitploit:~
# ① Dériver encryptedToken (= rePassword(password, username)) ; calculable avec le mot de passe par défaut
rePassword("powerjob_admin", "ADMIN")
   = ADMIN_b82a450701f6a71723fb99931fe35e18_b      # identique octet par octet à user_info.token_login_verify_info de la base de données ✅

# ② Dériver la clé de signature HS256 = BASE64(BASE_SECURITY + MD5(JDBC_URL))
secret = BASE_SECURITY + md5(jdbc_url)             # clé de 101 octets

# ③ Forger un JWT web ADMIN (revendications : username=PWJB_ADMIN, encryptedToken=résultat de ①, sub=PowerJob)

Résultat réel (le jeton forgé passe l'authentification) :

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

[*] /namespace/list JWT forgé :
{"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}

→ le jeton forgé s'authentifie en tant qu'administrateur et renvoie des données réelles (la référence est rejetée avec UserNotLoggedIn).

Points clés :

  • L'encryptedToken dérivé hors ligne correspond à la valeur stockée en base de données octet par octet (ADMIN_b82a450701f6a71723fb99931fe35e18_b).
  • La clé est entièrement déterminée par la constante publique BASE_SECURITY + MD5 de l'URL JDBC par défaut publique → dérivable hors ligne sans aucune information d'identification.
  • L'encryptedToken PWJB est recalculable hors ligne avec le mot de passe par défaut (powerjob_admin, constat PJ-02) → prise de contrôle totale de l'administrateur.
  • Si l'administrateur a changé le mot de passe, la contrefaçon d'un jeton web est bloquée par la non-concordance de l'encryptedToken, mais le chemin du jeton d'application OpenAPI (revendications appId/password/encryptType, OpenApiSecurityServiceImpl:87-105) peut toujours être forgé indépendamment pour contourner l'authentification OpenAPI.

Même si le mot de passe par défaut est modifié, la vulnérabilité persiste par d'autres vecteurs d'attaque :

  • Un attaquant qui obtient l'encryptedToken valide de n'importe quel utilisateur par d'autres moyens (par exemple, injection SQL, exposition de sauvegarde de base de données, fuite de journaux ou divulgation d'informations par d'autres points de terminaison) peut combiner ce jeton avec la clé de signature prédictible pour forger un JWT pour cet utilisateur spécifique.
  • Cela contourne entièrement le problème de non-concordance de l'encryptedToken, car le jeton forgé contient désormais un encryptedToken légitime dérivé de l'enregistrement réel de la base de données.
  • Par conséquent, l'attaquant n'a pas du tout besoin de connaître le mot de passe en clair de l'utilisateur, et le JWT forgé reste valide même après que l'utilisateur a changé son mot de passe (jusqu'à l'expiration du jeton).

PoC : powerjob_jwt_key.py 192.168.49.128:7700

image
image

6. Impact

  • Contournement d'authentification / contrefaçon de jeton pour n'importe quel utilisateur → surfaces d'administration de la console web / OpenAPI.

7. Correctif Suggéré

  • Générer la clé aléatoirement et la persister (fichier/environnement), ne jamais la dériver de l'URL JDBC ou d'une constante.
  • Utiliser une clé distincte pour les jetons d'application OpenAPI par rapport aux JWT web.
  • Appliquer le contrôle secondaire encryptedToken pour tous les comptes.

8. CWE / CVSS

  • CWE : CWE-321 (Utilisation d'une clé cryptographique codée en dur) / CWE-798
  • CVSS : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N = 9.1 Critique (combiné avec le mot de passe par défaut / OpenAPI)
Télécharger l’outil