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
SessionReaper-CVE-2025-54236 — PoC Magento Session Reaper - CVE-2025-54236 | Kitploit
Strumenti/GitHubGitHub/alexb616/sessionreaper-cve-2025-54236
Analisi delle VulnerabilitàAnalisi del CodiceExploitSfruttamento di Applicazioni WebPenetration TestingRed TeamingSviluppo Payload
GitHubalexb616/sessionreaper-cve-2025-54236

SessionReaper-CVE-2025-54236

PoC Magento Session Reaper - CVE-2025-54236

Vedi Repository
1122 mesi 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

SessionReaper — CVE-2025-54236

PoC unificato per CVE-2025-54236 ("SessionReaper"), una RCE critica non autenticata in Magento 2 / Adobe Commerce tramite deserializzazione annidata nella REST API.

  • CVSS: 9,1 (Critico)
  • Causa principale: Validazione input impropria (CWE-20) in ServiceInputProcessor; la primitiva di exploit è deserializzazione non sicura (CWE-502)
  • Ricercatore originale: Daniel "Blaklis" Le Gall (divulgazione responsabile tramite HackerOne)
  • Nome coniato da: Sansec
  • Corretto in: Adobe APSB25-88 (patch di emergenza, 2025-09-09)

Solo per test di sicurezza autorizzati. Utilizzare esclusivamente contro sistemi di propria proprietà o per i quali si dispone di esplicita autorizzazione scritta.


Cosa fa

Lo strumento concatena tre fasi comuni a ogni vettore, più un trigger:

  1. Generazione gadget — phpggc -se -a Guzzle/FW1 <remote_path> <payload.php> costruisce un oggetto serializzato che scrive payload.php su <remote_path> quando viene deserializzato.
  • Caricamento sessione falsa — POST /customer/address_file/upload memorizza il blob serializzato come sess_<SESSID>. Magento distribuisce i file di indirizzo caricati in base ai primi caratteri del nome file, quindi finisce in media/customer_address/s/e/sess_<SESSID> (da qui s/e/ in --save-path).
  • Redirezione save_path — un payload REST annidato costruisce Session\Config e, tramite setSavePath() → setOption() → ini_set('session.save_path', ...) (un effetto collaterale globale di processo), punta il gestore di sessione PHP al blob caricato.
  • Trigger — una richiesta con Cookie: PHPSESSID=<SESSID> forza session_start() a leggere e unserialize() il file avvelenato, attivando il gadget e scrivendo il payload.

  • Vettori

    Tutti e tre i vettori raggiungono lo stesso sink (context → urlBuilder → session → sessionConfig → savePath). Differiscono solo per endpoint, verbo HTTP e modulo Magento coinvolto — utile quando un WAF o un modulo disabilitato blocca un endpoint ma non un altro.

    MetodoEndpointVerboPunto di ingresso nella catena
    order/rest/<store>/V1/guest-carts/abc/orderPUTpaymentMethod → paymentData → Payment\Helper\Data
    checkmo/rest/<store>/V1/guest-carts/abc/set-payment-informationPOSTpaymentMethod → paymentData → Payment\Helper\Data
    address/rest/<store>/V1/guest-carts/abc/estimate-shipping-methodsPOSTaddress → addressConfig → addressHelper → Customer\Helper\Address

    Nessun carrello reale è richiesto per alcun vettore. ServiceInputProcessor deserializza i parametri del metodo durante la risoluzione dell'input — prima che il servizio invochi qualsiasi ricerca del carrello — quindi un cartId fittizio di abc raggiunge il sink in tutti e tre. Il successivo errore "carrello non trovato" (404/500) è previsto e conferma che l'effetto collaterale della deserializzazione è già scattato.

    Un flag --sku è disponibile se si desidera che lo strumento crei un carrello ospite reale e aggiunga un prodotto prima del trigger (verificato tramite GraphQL). Questo è opzionale e non necessario per lo sfruttamento — esiste solo per ambienti in cui si preferisce un flusso di checkout completamente realistico. Omettendolo, lo strumento utilizza il carrello fittizio abc.


    Prerequisiti

    • Archiviazione sessione basata su file (var/session/). Le sessioni basate su Redis e database non sono influenzate da questa specifica catena RCE. Non è enumerabile da remoto, quindi deve essere tentata alla cieca.
    • /customer/address_file/upload raggiungibile senza autenticazione.
    • Target non patchato (pre-APSB25-88 / pre-hotfix 2.4.x).

    Requisiti

    • Python 3.8+ con requests
    • phpggc — rilevato automaticamente in PATH, percorsi di installazione comuni, o scaricato come immagine Docker ambionics/phpggc come fallback
    • payload.php nella stessa directory dello script (deve iniziare con <?php)
    root@kitploit:~
    pip install requests
    git clone https://github.com/ambionics/phpggc /opt/phpggc   # or: docker pull ambionics/phpggc
    

    Utilizzo

    root@kitploit:~
    # order (vettore originale) — nessun carrello, nessuna credenziale
    python3 session_reaper.py --host https://target.com --method order
    
    # checkmo — endpoint pagamenti, ambito store spagnolo per la REST API
    python3 session_reaper.py --host https://target.com --method checkmo --api-store es
    
    # address — endpoint spedizione
    python3 session_reaper.py --host https://target.com --method address --api-store all
    
    # opzionale: esegue un flusso di carrello reale con uno SKU noto (non richiesto)
    python3 session_reaper.py --host https://target.com --method address --sku PROD-001
    

    Opzioni

    FlagPredefinitoDescrizione
    --host(obbligatorio)URL di base del target
    --method(obbligatorio)address | checkmo | order
    --storedefaultCodice store per la richiesta trigger (e carrello, se --sku è usato)
    --api-storedefaultCodice store nell'URL dell'endpoint di deserializzazione (all | es | default | custom)
    --sku(nessuno)Opzionale. Se impostato, crea un carrello ospite reale con questo SKU. Non richiesto.
    --payload-inpayload.phpPayload PHP da scrivere sul target
    --payload-out/var/www/html/pub/errors/404.phpPercorso di scrittura remota (deve essere una posizione eseguibile dal web — vedere nota sotto)
    --save-pathmedia/customer_address/s/e/savePath iniettato nella catena del gadget
    --phpggc(auto)Percorso esplicito al binario phpggc
    --proxyhttp://127.0.0.1:8081Proxy HTTP (es. Burp)
    --no-proxyoffDisabilita il proxy
    --username / --password(nessuno)Credenziali cliente opzionali per un token Bearer

    Ambiti store

    Lo strumento utilizza due codici store indipendenti:

    • --api-store — l'ambito nell'URL della richiesta di deserializzazione (/rest/<api-store>/V1/guest-carts/...), dove viene eseguito ServiceInputProcessor.
    • --store — l'ambito per la richiesta trigger (GET /<store>/) e, se --sku è usato, per le richieste del carrello.

    I codici delle viste store sono definiti dall'amministratore; non dare per scontato es/fr. Enumera prima le viste store attive — una richiesta contro un ambito inesistente fallisce semplicemente.


    Target del payload — perché pub/errors/404.php

    La configurazione Nginx predefinita di Magento passa solo sette file PHP a fastcgi_backend:

    root@kitploit:~
    index.php, get.php, static.php,
    errors/report.php, errors/404.php, errors/503.php, health_check.php
    

    Qualsiasi altro .php (incluso qualsiasi cosa lasciata in pub/media/) viene negato e non verrà mai eseguito. Quindi il payload deve sovrascrivere uno di questi sette file whitelistati piuttosto che crearne uno nuovo. pub/errors/404.php è il predefinito perché Magento lo rende internamente su qualsiasi pagina mancante, quindi viene attivato spesso su un negozio in produzione.

    OPSEC: sovrascrivere 404.php direttamente è rumoroso (viene eseguito su ogni 404). In un vero engagement, è meglio backdoorare un file whitelistato in modo sottile invece di sovrascriverlo.


    Note

    • Lo strumento opera come ospite per impostazione predefinita. --username/--password sono necessari solo se si desidera un token Bearer per una configurazione specifica.
    • Aspettati un 404/500 sulla richiesta di deserializzazione — è normale e non significa fallimento.
    • Pulizia: il file temporaneo /tmp/sess_<SESSID> viene rimosso all'uscita.

    Riferimenti

    • Adobe Advisory APSB25-88
    • Sansec — divulgazione SessionReaper
    • Searchlight Cyber (Assetnote) — PoC RCE originale
    • Pentest-Tools.com — write-up sviluppo exploit
    • NVD — CVE-2025-54236

    Disclaimer

    Fornito solo per ricerca e test di sicurezza autorizzati. L'autore non si assume alcuna responsabilità per un uso improprio. Non eseguire contro sistemi senza esplicita autorizzazione.

    Scarica lo strumento