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

За месяц самостоятельной возни с 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.
