Skip to content
KitploitKITPLOIT
StrumentiBlog
Log in
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.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Strumenti/GitHubGitHub/gbuyssens/cve-2026-28695-craft-rce-bypass
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPost-ExploitPenetration TestingRed TeamingStrumento di Accesso RemotoSviluppo Payload
GitHubgbuyssens/cve-2026-28695-craft-rce-bypass

CVE-2026-28695-craft-rce-bypass

Esecuzione di codice remoto autenticata e **blind** in Craft CMS. Correzione per CVE-2026-28695

Vedi Repository
15 giorni 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

Bypass della patch CVE-2026-28695 — RCE autenticata su Craft CMS ≤ 5.9.8 (element-search)

CVSS 3.x : 8.8 HIGH   (approssimativo — verificare)
CWE      : CWE-502 (Unsafe Object Instantiation) + CWE-1336 (origine SSTI)
Base     : CVE-2026-28695  (SSTI tramite create() + Symfony Process)
Fix      : fix advisory e31e508 (limita create() a BaseObject) — BYPASSATO qui
Interessa: Craft CMS ≤ 5.9.8 con il fix CVE-2026-28695 applicato

Esecuzione remota di codice autenticata e blind in Craft CMS. Il fix ufficiale per CVE-2026-28695 limita create() solo alle sottoclassi di yii\base\BaseObject. Il gadget yii\behaviors\AttributeTypecastBehavior è un BaseObject ma raggiunge comunque un sink call_user_func(), quindi sopravvive al filtro. Veicolato attraverso l'azione non-Twig admin/actions/element-search/search, aggira anche CRAFT_ENABLE_TWIG_SANDBOX. È sufficiente un account Content Editor.


Indice

  • Riepilogo della vulnerabilità
  • Perché il PoC di CVE-2026-28695 è morto su 5.9.8
  • Il bypass (catena di gadget)
  • Il vincolo di escapeshellcmd
  • Catena di attacco
  • Versioni interessate
  • Questo repository
  • Utilizzo
  • Remediation
  • Riferimenti

Riepilogo della vulnerabilità

Il controller element-search di Craft deserializza JSON controllato dall'attaccante in oggetti PHP vivi tramite la macchina Craft::createObject() / Instance di Yii. Allegando un AttributeTypecastBehavior il cui attributeTypes mappa un attributo al callable [Psy\Readline\Hoa\ConsoleProcessus, execute] e attivando l'evento beforeSave, il typecast diventa:

call_user_func([Psy\Readline\Hoa\ConsoleProcessus, "execute"], "<CMD>")

L'endpoint risponde sempre con HTTP 500 e non restituisce alcun output del comando — l'esecuzione è blind.


Perché il PoC di CVE-2026-28695 è morto su 5.9.8

  • CVE-2026-28695 = SSTI tramite create() + Symfony Process, raggiunto da un sink Twig (tipicamente Entry Types → Title Format).
  • Su 5.9.8 il commit di fix e31e508 limita create() alle sottoclassi di BaseObject, e il target gira anche con CRAFT_ALLOW_ADMIN_CHANGES=false (settings → 403) e CRAFT_ENABLE_TWIG_SANDBOX=true. Il vettore documentato è triplamente chiuso.
  • Lezione: confrontare la versione esatta con il commit di fix, non scatenarsi sul nome della CVE. Qui il fix è più vecchio della build distribuita → cercare un bypass del filtro, non il PoC grezzo.

Il bypass (catena di gadget)

yii\behaviors\AttributeTypecastBehavior  ->  Psy\Readline\Hoa\ConsoleProcessus::execute

Doppio bypass, per costruzione:

  1. Sandbox — element-search è un percorso di oggetti PHP, non un render Twig. CRAFT_ENABLE_TWIG_SANDBOX controlla solo il motore di template, quindi non si applica mai.
  2. Patch — il fix limita create() a BaseObject. AttributeTypecastBehavior → yii\base\Behavior → yii\base\BaseObject, quindi soddisfa il nuovo vincolo pur offrendo comunque un sink di esecuzione. Il fix chiude una famiglia di classi, non la classe BaseObject.

Endpoint:

POST /index.php?p=admin/actions/element-search/search
X-CSRF-Token: <dashboard csrf>
X-Requested-With: XMLHttpRequest
Accept: application/json

Il vincolo di escapeshellcmd

Hoa\ConsoleProcessus::execute() esegue il comando attraverso escapeshellcmd():

  • Neutralizzati: | && ; > < $() ' " → niente concatenazione, niente pipe, niente redirezione, niente classica reverse shell bash.
  • Passano: : , /
  • Risultato: un binario + argomenti, nessun metacarattere di shell.

Ecco perché il payload è una singola bind shell socat TCP-LISTEN,fork EXEC (argomenti in : / , / /) invece di una reverse shell.


Catena di attacco

   Attacker (Content Editor)                Craft CMS 5.9.8
        |                                        |
        |  GET /admin/login  (scrape CSRF)       |
        |--------------------------------------->|
        |  POST users/login (jenny:******)       |
        |--------------------------------------->|
        |  GET /admin/dashboard (JS csrf)        |
        |<---------------------------------------|
        |  POST element-search/search            |
        |    AttributeTypecastBehavior gadget    |
        |    typecastBeforeSave = "<CMD>"        |
        |--------------------------------------->|  call_user_func(
        |  HTTP 500  (blind, no output)          |    [ConsoleProcessus,execute], CMD)
        |<---------------------------------------|  -> escapeshellcmd(CMD) -> exec
        |                                        |
        |  oracle: "sleep 5" -> +~5s latency     |
        |  shell:  socat TCP-LISTEN:4445 bind     |

Versioni interessate

StatoVersioni
VulnerabileCraft CMS ≤ 5.9.8 con il fix CVE-2026-28695
NotaIl gadget richiede una sessione CP autenticata

Questo repository

FileRuolo
exploit.pyPoC: login → verifica timing-oracle → singolo cmd → bind shell
README.mdQuesto file

Utilizzo

Richiede requests (pip install requests).

# 1. Prove code execution (timing oracle: sleep 5 must add ~5s)
python3 exploit.py http://example.lab --check

# 2. Fire a single blind command (one binary + args, no metachars)
python3 exploit.py http://example.lab "sleep 5"

# 3. Plant a persistent bind shell as the web user, then connect
python3 exploit.py http://example.lab --bind 4445
nc IP or exemple.lab 4445

# custom creds
python3 exploit.py http://exemple.lab -u User -p 'SecureP4$$!' --bind

Cosa succede:

  1. Si recupera il CSRF di login, ci si autentica al CP, si estrae il CSRF dell'azione dashboard.
  2. Si invia il gadget AttributeTypecastBehavior a element-search.
  3. --check dimostra l'esecuzione blind tramite latenza iniettata; --bind avvia un listener socat.

Remediation

  1. Aggiornare Craft CMS a una release che vincoli l'istanziazione di oggetti su tutti i percorsi di input deserializzati (non solo create()), e verificare la gestione delle condizioni di element-search.
  2. Mantenere CRAFT_ALLOW_ADMIN_CHANGES=false e minimizzare i privilegi dei Content Editor — l'autenticazione è l'unico prerequisito qui.
  3. Rimuovere/aggiornare la dipendenza psy/psysh (Hoa) inclusa dove un gadget ConsoleProcessus::execute è raggiungibile.
  4. WAF/telemetria: allertare su corpi element-search/search contenenti __class, as rce, o AttributeTypecastBehavior; segnalare raffiche di HTTP 500 da quell'azione.

Riferimenti

  • NVD — CVE-2026-28695 (SSTI di base)
  • Commit di fix di Craft CMS e31e508 (restrizione create() → BaseObject)
  • Documentazione Yii AttributeTypecastBehavior / yii\base\Security

Disclaimer

Questo progetto è solo per test di sicurezza autorizzati, formazione e ricerca difensiva. Sei responsabile del rispetto delle leggi applicabili e delle regole di ingaggio del tuo laboratorio o cliente.

Scarica lo strumento