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

Как учить пентест веб-приложений: месяц на пет-проектах vs месяц на лабах курса

Как учить пентест веб-приложений: месяц на пет-проектах vs месяц на лабах курса
Время чтения: 11 мин.

За месяц самостоятельной возни с DVWA и Juice Shop я отработал 4 класса уязвимостей из OWASP Top 10 (рейтинг десяти самых критичных рисков веб-приложений — обновляется раз в несколько лет). За следующий месяц на структурированных лабах курса WAPT (Web Application Penetration Testing — тестирование на проникновение веб-приложений) прошёл 11 классов, включая business logic и race condition, до которых сам бы добирался ещё полгода. Ниже — цифры, инструменты и разбор того, что сработало в каждом подходе. Не агитация за курсы и не романтизация самообучения: оба пути дали результат, но в разных плоскостях.

Пет-проекты для пентестера: что и зачем я развернул

По данным Verizon DBIR 2025, 26% подтверждённых утечек приходится на веб-атаки. Мотивация учить именно веб-пентест очевидна — самая массовая точка входа. Я взял три уязвимых приложения и поставил цель: за 30 дней пройти максимум классов уязвимостей при 2–3 часах работы в день.

Стенд: DVWA, Juice Shop и bWAPP

DVWA (Damn Vulnerable Web Application) — классический PHP-стенд с десятком модулей: SQL injection (внедрение SQL-кода в запрос к базе данных), XSS (Cross-Site Scripting — выполнение вредоносного JavaScript в браузере жертвы), CSRF (Cross-Site Request Forgery — подделка межсайтовых запросов), file upload и другие. Три уровня сложности: low, medium, high. Поднимается через Docker одной командой.

OWASP Juice Shop — современное приложение на Node.js со 100+ задачами-уязвимостями, которые напоминают реальные баги. Тут есть REST API (архитектура, где ресурсы доступны по URL-адресам и управляются HTTP-методами), JWT-токены (JSON Web Token — строка авторизации в заголовке запроса для подтверждения личности пользователя) и немного бизнес-логики. По ощущениям — ближе всего к настоящему интернет-магазину из всех учебных стендов.

bWAPP (Buggy Web Application) — ещё один PHP-стенд со 100+ уязвимостями, включая SSRF (Server-Side Request Forgery — атака, при которой сервер выполняет запрос к внутреннему ресурсу по указке атакующего) и XXE (XML External Entity — уязвимость обработки XML, позволяющая читать файлы на сервере).

Инструменты: Burp Suite Community (перехватывающий прокси для анализа HTTP-трафика между браузером и сервером), sqlmap (автоматизация обнаружения и эксплуатации SQL-инъекций), ffuf (фаззер для перебора директорий и параметров), Nmap (сканер портов и сервисов в сети). Всё запускалось на Kali Linux в виртуальной машине.

План на месяц — и где он сломался

Я выписал категории OWASP Top 10 для отработки: от A01:2021 Broken Access Control (нарушение контроля доступа — первое место в рейтинге: по данным OWASP, 94% протестированных приложений содержали эту проблему) до A10:2021 SSRF. Десять категорий, 30 дней, три стенда — казалось реальным.

За 30 дней реально закрыл четыре: A03 (инъекции), A07 (аутентификация), частично A01 (только базовый IDOR — Insecure Direct Object Reference, доступ к чужим данным через подмену идентификатора в запросе) и кусочек A05 (мисконфигурации). Остальное — либо не дошли руки, либо застрял и не понимал, куда двигаться.

Главная проблема самостоятельного изучения пентеста — отсутствие маршрута. Три вечера подряд я ковырял SQL-инъекцию в DVWA на уровне high и не продвигался, потому что не понимал, как именно фильтруются кавычки в конкретной реализации addslashes() на PHP. bWAPP и Juice Shop стояли нетронутыми — не хватало ни плана, ни дисциплины переключиться на другой класс уязвимостей. Знакомая ситуация?

Лабы по пентесту: как устроен месяц на курсе WAPT

Формат лабораторных работ

На курсе WAPT структура жёсткая: каждая тема привязана к конкретной технике из OWASP WSTG (Web Security Testing Guide — бесплатное методологическое руководство OWASP для тестирования безопасности веб-приложений). Сначала теоретический блок: зачем техника существует, в каких реальных сценариях встречается, какие инструменты применяются. Потом — лаба.

Лаба — не тот же DVWA. Стенд спроектирован под конкретный сценарий: например, API с GraphQL (альтернативный способ работы с API, где клиент сам описывает запрашиваемые данные), где контроль доступа реализован частично и нужно найти обход. Или веб-приложение с race condition (состояние гонки — два параллельных запроса обходят проверку, которая работает для последовательных) в промо-механизме. Задачи ближе к реальным багбаунти-программам (программам поиска уязвимостей за вознаграждение), чем к учебным стендам.

За месяц я прошёл модули по 11 классам уязвимостей. Не потому что стал умнее — а потому что не тратил время на поиск направления. Маршрут был готов.

Обратная связь и ментор

Два дня бился с XXE в одном из модулей. Отправлял XML-пейлоад (данные, которые атакующий передаёт серверу для эксплуатации уязвимости), получал ошибку парсера и не мог понять: блокирует WAF (Web Application Firewall — межсетевой экран уровня приложений) или проблема в кодировке. При самостоятельном обучении пентесту я бы застрял на неделю, перечитывая Stack Overflow и пробуя наугад.

Написал ментору. Ответ пришёл в тот же день: «Сервер принимает только Content-Type: application/xml, а ты отправляешь text/xml. Смени заголовок.» Двадцать минут — XXE отработала.

Ментор не решает задачу за тебя. Он указывает направление, когда ты застрял на техническом нюансе, а не на концептуальном непонимании. На DVWA я три дня ковырял SQL-инъекцию и думал, что проблема в логике запроса, а на деле просто не знал, что addslashes() экранирует обратные слэши иначе, чем mysql_real_escape_string(). Ментор показал бы эту разницу за минуту.

Обучение пентесту веб-приложений: сравнение прогресса за 30 дней

Покрытие классов уязвимостей OWASP

Что реально отработано (нашёл, эксплуатировал, понял механизм защиты) за 30 дней каждого подхода:

Класс уязвимости Пет-проекты Лабы WAPT
A01 Broken Access Control Частично (базовый IDOR) Да (IDOR, BOLA, вертикальная эскалация)
A02 Cryptographic Failures Нет Да
A03 Injection (SQL, OS Command) Да Да
A04 Insecure Design (business logic) Нет Да
A05 Security Misconfiguration Частично Да
A06 Outdated Components Нет Да
A07 Authentication Failures Да Да
A08 Integrity Failures Нет Да
A10 SSRF Нет Да
Race condition Нет Да
File upload bypass Да (базовый) Да (с обходом WAF)
Directory / Path traversal Нет Да

На пет-проектах я проверял подмену числового id в GET-запросе (GET — HTTP-метод для получения данных) и считал, что «закрыл» контроль доступа. Наивно. На лабах курса пришлось разбираться с BOLA (Broken Object Level Authorization — по сути IDOR, но в контексте API), вертикальной эскалацией (получение прав администратора, имея учётку обычного пользователя) и обходом проверок через альтернативные HTTP-методы (PUT, DELETE, PATCH вместо GET).

Время на один класс уязвимости

Тайм-трекер за оба месяца:

Метрика Пет-проекты Лабы WAPT
Среднее время на класс ~12 часов ~5 часов
Время «в ступоре» (не знаю, что делать дальше) ~40% от общего ~10%
Время на настройку/отладку стенда ~4 часа за месяц ~0 (стенд готов)
Классы, которые бросил не закончив 3 0

Разница в 2.5 раза по времени на класс — не потому что лабы проще. Они сложнее: стенды ближе к реальным приложениям, «школьные» трюки типа ' OR 1=1 -- там не работают. Просто ты не тратишь время на поиск направления — теория перед лабой объясняет, что искать и какой инструмент использовать. А ступор на пет-проектах — это когда сидишь перед ответом 403 Forbidden (HTTP-код «доступ запрещён») и не знаешь: пробовать другой метод, другой параметр или переключаться на другую уязвимость целиком.

Самостоятельное изучение пентеста — где оно выигрывает

Было бы нечестно сказать, что пет-проекты бесполезны. Вот что дал именно самостоятельный подход.

Навык «развернуть с нуля». На курсе стенд готов. В реальной работе пентестера никто не даст готовую среду. Разворачивание DVWA через Docker, настройка сети, проброс портов, конфигурация Burp Suite как прокси — навыки, нужные при подготовке к пентесту реальной инфраструктуры. Это часть рекогносцировки. В терминологии MITRE ATT&CK (открытая база тактик и техник атак; каждая техника имеет T-код, например T1595) это Active Scanning (T1595, тактика Reconnaissance — разведка). Курсы эту часть обычно пропускают, потому что стенд уже развёрнут.

Нестандартные связки атак. Juice Shop позволяет экспериментировать свободно: я комбинировал XSS с перехватом JWT-токена через JavaScript — такой цепочки в модулях курса не было, потому что она специфична для конкретного стека. На пет-проекте можно строить attack chains, которые выходят за рамки учебного плана. И именно такие цепочки потом находишь на реальных проектах.

Привычка к документации. Когда нет ментора — читаешь документацию инструментов напрямую. У sqlmap десятки параметров: --tamper для обхода WAF-фильтров, --technique для выбора типа инъекции, --risk и --level для глубины тестирования. На курсе показывают основные флаги; в самостоятельной работе приходится разбираться со всем спектром. Навык, без которого на реальном проекте не обойтись.

Ближе к реальной архитектуре. Juice Shop имитирует поведение настоящего интернет-магазина — REST API, аутентификация через токены, Node.js-бэкенд. Пентест Juice Shop — почти легальный мини-багбаунти. DVWA устарела архитектурно, но Juice Shop с его 100+ задачами покрывает современные паттерны веб-приложений.

Методика изучения пентеста: гибридный трек на практике

Оптимальный подход — гибридный. Ниже — пошаговый алгоритм, который я выработал после обоих месяцев. Рассчитан на career switcher — человека, переходящего в ИБ из разработки, системного администрирования или другой IT-роли.

Делай раз — разверни стенд за 20 минут

Предпосылки: Docker установлен, Kali Linux или любая Linux-система с Burp Suite Community.

Разверни DVWA и Juice Shop одновременно:

docker run -d -p 80:80 vulnerables/web-dvwa
docker run -d -p 3000:3000 bkimminich/juice-shop

Первая команда поднимает DVWA на порту 80, вторая — Juice Shop на порту 3000. Открой http://localhost в браузере — появится страница входа DVWA (логин: admin, пароль: password). Juice Shop доступен по http://localhost:3000 без авторизации. Если обе страницы открылись — стенд работает, можно атаковать.

Зачем два стенда: DVWA покрывает классику (SQL injection, XSS), Juice Shop — современные паттерны (API, JWT, бизнес-логику). Вместе они дают покрытие, близкое к реальному веб-приложению.

Делай два — атакуй с чек-листом OWASP WSTG

Скачай OWASP WSTG — бесплатное руководство с конкретными тест-кейсами для каждого класса уязвимостей. Не пытайся пройти всё за вечер. Возьми одну категорию — например, WSTG-INPV (Input Validation), которая покрывает SQL injection и XSS — и пройди её тест-кейсы на своём стенде.

Для перебора директорий и поиска скрытых эндпоинтов (URL-путей, не видных в интерфейсе) используй ffuf. В контексте MITRE ATT&CK это техника Exploit Public-Facing Application (T1190, тактика Initial Access — первоначальный доступ): ты ищешь поверхность атаки во внешнем приложении.

ffuf -u http://localhost:3000/FUZZ -w /usr/share/wordlists/dirb/common.txt -mc 200,301,403

Флаг -u задаёт URL с маской FUZZ, которую ffuf заменит каждым словом из словаря. Флаг -mc 200,301,403 оставит ответы с этими HTTP-кодами. Код 403 — «эндпоинт существует, но доступ запрещён». Стоит проверить, нельзя ли обойти запрет через другой HTTP-метод или с другими заголовками. Именно такие 403 часто оказываются самыми интересными находками.

Ожидаемый результат: список из 20–50 путей. Пути с кодом 200 — доступны, 301 — редиректы (проверь, куда ведут), 403 — потенциально интересны для обхода авторизации. Если видишь пути вида /api/, /admin/, /backup/ — это точки для дальнейшего ручного анализа в Burp Suite.

Если нашёл параметр, подозрительный на SQL injection, проверь через sqlmap:

sqlmap -u "http://localhost/vulnerabilities/sqli/?id=1&Submit=Submit" \
  --cookie="PHPSESSID=your_session; security=low" --batch

Флаг --cookie передаёт сессионную куку (DVWA требует авторизации для доступа к модулям). Флаг --batch запускает sqlmap без интерактивных вопросов — инструмент сам выберет оптимальную технику. Ожидаемый результат: sqlmap сообщит тип инъекции (union-based, boolean-based, time-based) и предложит дампить данные из базы. Строка Parameter 'id' is vulnerable — инъекция найдена, можно переходить к эксплуатации.

Делай три — фиксируй в трекере и возвращайся к теории

Заведи таблицу (Google Sheets, Notion — формат не важен) с колонками:

Дата Стенд Класс OWASP Действия Результат Время Застревание
01.10 Juice Shop A03 Injection Тестировал поиск на SQLi Union-based через параметр q 1.5ч Нет
02.10 Juice Shop A01 BAC Подмена id в /api/orders/{id} 403 на все ID. Обход не найден 2ч Да

Столбец «Застревание» — ключевой. Два «Да» подряд по одному классу — сигнал: нужна теория. Модуль курса, writeup или хотя бы видеоразбор аналогичной задачи. Самостоятельное обучение работает, пока есть прогресс. Когда прогресс останавливается — нужна структура. Нет смысла тратить ещё три вечера на тупик, если ментор или модуль курса покажет решение за двадцать минут.

Через две недели трекер покажет паттерн: на каких классах ты уверенно находишь уязвимости, а на каких буксуешь. Мой трекер за первый месяц показал провал в A04:2021 Insecure Design — уязвимости бизнес-логики, которые невозможно найти сканером и сложно заметить без понимания контекста приложения. Именно этот класс лучше всего закрывается на структурированных лабах по пентесту, где сценарий моделирует реальный бизнес-процесс: оплата, промокоды, многоступенчатые корзины.

По данным отчёта Terra Security, 73% утечек данных происходит через уязвимости веб-приложений. Большинство — не экзотические zero-day, а стандартные классы из OWASP Top 10: инъекции, сломанный контроль доступа, мисконфигурации. Закрыть эти классы можно за 2–3 месяца гибридного обучения — если не повторять мою ошибку и не тратить первый месяц исключительно на DVWA без маршрута.

Споры «курс vs самообучение» в ИБ — ложная дилемма. На практике пет-проекты и структурированные лабы решают разные задачи. Пет-проекты тренируют самостоятельность: развернуть стенд, прочитать документацию, выстроить цепочку атаки без подсказок. Лабы дают скорость и покрытие: за то же время проходишь втрое больше классов уязвимостей и не теряешь недели на тупики.

Career switcher обычно начинает с самообучения — и застревает. Не потому что глуп, а потому что пентест веб-приложений — это десяток связанных навыков: от понимания HTTP-протокола до чтения исходного кода на трёх языках. Без карты этих навыков учишь их в случайном порядке и тратишь 80% времени на 20% результата. Я прошёл оба пути. Если бы начинал заново — первый месяц отдал бы лабам, чтобы получить структуру и покрытие. Со второго параллельно разворачивал бы собственные стенды, чтобы тренировать самостоятельность и строить нестандартные цепочки. Соотношение 60% лабы / 40% своё — то, что даёт прогресс и не сжигает мотивацию на тупиках. На WAPT эту пропорцию проходят в два модуля, и каждый заканчивается лабой, а не тестом.

Эту тему и смежные навыки разбирают на практике в курсе «Тестирование веб-приложений на проникновение (WAPT)» Codeby Academy.