Перейти к содержимому

Поиск по платформе

ReDoS: catastrophic backtracking в URL-валидаторе профиля

Express SecureShop валидирует адрес персонального сайта пользователя через регулярное выражение с вложенными квантификаторами в последней метке хоста. Тщательно подобранная строка вызывает catastrophic backtracking движка V8: event loop блокируется на секунды, инцидент фиксируется в журнале и admin-эндпоинт выдаёт флаг.

Автор: Hack & Fix
Освоишь: без catastrophic backtrackingre2 движокinput length cap
Сложно+90 XP ~65 мин nodejs
CWE-1333 · A05:2021 Pro
Обложка: ReDoS: catastrophic backtracking в URL-валидаторе профиля Обложка: ReDoS: catastrophic backtracking в URL-валидаторе профиля
Задача
# ReDoS (Регулярное выражение в валидаторе URL) ## Сценарий «КрепМаркет» — магазин крепежа и инструмента с профилем покупателя. В профиле можно указать ссылку на личный сайт или блог: маркетинг показывает её на странице продавца-консультанта. Перед сохранением сервер проверяет URL «на корректность» одним регулярным выражением. Ночью мониторинг дважды поднимал алерт «воркер не отвечает», и оба раза последним действием в логах была смена поля «сайт» в профиле. Вас, дежурного инженера по безопасности, просят воспроизвести инцидент и объяснить его механизм. ## Цель 1. Авторизуйтесь и найдите в профиле проверку персональной ссылки. 2. Подберите значение, при котором валидация блокирует поток событий сервера на секунды, и добейтесь фиксации инцидента. 3. Заберите флаг из отчёта об инциденте доступности. ## Теория Движок регулярных выражений в V8 — NFA с перебором откатов: при неудаче он возвращается и пробует другие способы сопоставить пройденные символы. Если в шаблоне повторяющаяся группа символов сама покрыта повторением, одна и та же последовательность допускает множество разбиений, и их число растёт экспоненциально с длиной входа. Пока совпадение находится, ответ быстрый; вход, который почти подходит и лишь в конце ломает совпадение, заставляет движок перебрать все варианты. В ECMAScript у регулярного выражения нет инструментов ограничить этот перебор — проверка синхронна и непрерываема, а поток событий в Node.js один: пока движок считает, сервер не отвечает никому. Это Regular Expression Denial of Service. **Уязвимый паттерн:** ```js // Валидация персональной ссылки регулярным выражением: const ok = URL_RE.test(userInput); ``` Механика словами: проверяющее выражение разбирает хост из повторяющихся меток, и каждая метка допускает несколько разбиений. Вход, вызывающий экспоненциальный перебор откатов, выглядит как длинная цепочка однородных меток, за которой стоит символ, не вписывающийся в шаблон, — каждое разбиение оказывается неудачным, и движок проверяет их все. ## Точка входа атаки `POST /api/profile/website` — JSON-эндпоинт обновления ссылки: поле `website`; при успешной проверке значение сохраняется в профиле, в ответе — время проверки в миллисекундах (поле `duration_ms`). `GET /admin/dos-incident` — отчёт о первом зафиксированном инциденте доступности: при наличии инцидента возвращает поле с флагом. * **Тестовая учётная запись:** `demo` / `demo`

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: ReDoS: catastrophic backtracking в проверке email профиля Обложка лабы: ReDoS: catastrophic backtracking в проверке email профиля
ReDoS

ReDoS: catastrophic backtracking в проверке email профиля

Сервис ProfileGuard валидирует email пользователя на стороне сервера через регулярное выражение с вложенными квантификаторами. Тщательно подобранная входная строка вызывает экспоненциальный backtracking движка V8, поток событий блокируется на десятки секунд, инцидент фиксируется в логе администратора — и вместе с ним выдаётся флаг.

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: Command Injection: Обход Blacklist-фильтра в Node.js Обложка лабы: Command Injection: Обход Blacklist-фильтра в Node.js
CMD Injection

Command Injection: Обход Blacklist-фильтра в Node.js

Функция ping в админ-панели защищена blacklist-фильтром, блокирующим пробелы и ключевые слова cat/flag/tail/less/more. Фильтр обходится через ;id, ;env и другие конструкции без пробелов.

+90 XP
Node.js Pro
Exploit Fix
Обложка лабы: Code Injection: eval() в Node.js калькуляторе Обложка лабы: Code Injection: eval() в Node.js калькуляторе
CMD Injection

Code Injection: eval() в Node.js калькуляторе

Веб-калькулятор вычисляет пользовательские выражения через eval(). Это даёт атакующему полный RCE: доступ к process.env, child_process и любым модулям Node.js.

+90 XP
Node.js Pro
Exploit Fix
Обложка лабы: CSRF: SameSite=Lax обходится через GET (Express) Обложка лабы: CSRF: SameSite=Lax обходится через GET (Express)
CSRF

CSRF: SameSite=Lax обходится через GET (Express)

Эндпоинт смены email реализован через GET. SameSite=Lax не защищает top-level navigation — измени email админа через CSRF и забери флаг из /api/admin/email.

+90 XP
Node.js Pro
Exploit Fix