Безопасность веба и API
Чтение JavaScript с ИИ для поиска endpoints
Фронтенд на JavaScript перечисляет API, с которым говорит приложение. Модель ИИ читает бандлы и выносит endpoints и параметры, а вы проверяете каждый.
Что такое OWASP Top 10, что означает каждая категория издания 2025 года, как от неё защищаться и как сопоставить с ней задания Juice Shop.
OWASP Top 10 — короткий список из десяти категорий риска, самых важных для веб-приложений. OWASP (Open Worldwide Application Security Project) — некоммерческая организация, которая публикует бесплатные материалы по безопасности. Текущее издание вышло в 2025 году и стало восьмым в серии.
Top 10 нужен для осведомлённости. В нём названы сбои, которые раз за разом встречаются в настоящих приложениях, и разработчики, тестировщики и менеджеры могут обсуждать их одними и теми же словами. Тестом, сертификацией или готовым чек-листом он служить не может.
Издание 2025 года опирается на два вида данных. Первый вид — результаты тестирования: тринадцать названных организаций и несколько анонимных участников прислали данные более чем по 2.8 миллиона приложений, и в них посчитано, сколько приложений содержали хотя бы один случай каждой слабости. Второй вид — данные об уязвимостях: около 220,000 записей CVE из американской National Vulnerability Database, сопоставленных с 643 CWE. Автоматические тесты видят не всё, поэтому две категории из десяти взяты из опроса сообщества.
Каждая категория объединяет родственные CWE из каталога Common Weakness Enumeration, который ведёт MITRE. По данным OWASP, список 2025 года охватывает 248 CWE.
Большинство проблем с безопасностью веб-приложений вырастает из нескольких повторяющихся решений. Приложение доверяет значению, которое прислал браузер. Маршрут проверяет, что пользователь вошёл, но не проверяет, принадлежит ли ему запись. Пароль хранится так, что после утечки базы защиты у него не остаётся. Top 10 даёт таким решениям имена.
На практике имена помогают. На ревью архитектуры можно спросить, где принимается решение о доступе. На ревью кода можно отметить пропущенную проверку владельца и сослаться на A01. В отчёте об инциденте можно описать первопричину вместо симптома.
Порядок взят из издания 2025 года. Он задаёт последовательность чтения и не говорит, что исправлять первым в вашем приложении. В каждом разделе есть простой пример, главная защита, CWE, которые OWASP относит к категории, и шпаргалка.
Контроль доступа определяет, что разрешено аутентифицированному пользователю. Сюда входят проверки, которых нет, которые работают неверно или выполняются только в браузере. По данным OWASP, та или иная форма этого изъяна нашлась в каждом протестированном приложении.
Пример: страница заказа открывается по адресу /orders/1041. Если заменить номер на /orders/1042, откроется заказ другого клиента, потому что сервер не проверяет владельца.
Главная защита: запрещайте всё по умолчанию и проверяйте владельца и права на сервере при каждом запросе, в общем коде, чтобы проверка не зависела от отдельного обработчика.
CWE: CWE-284 Improper Access Control, CWE-639 Authorization Bypass Through User-Controlled Key, CWE-862 Missing Authorization, CWE-918 Server-Side Request Forgery (SSRF), всего 40 сопоставленных записей.
Шпаргалка: Authorization Cheat Sheet.
Система защищена ровно настолько, насколько защищена её конфигурация. Сюда входят оставленные учётные записи по умолчанию, включённые отладочные функции, подробные сообщения об ошибках, отсутствующие заголовки безопасности и облачные хранилища с неверными правами.
Пример: стейджинг-сервер работает с паролем админа по умолчанию из инструкции по установке и показывает полные стек-трейсы любому посетителю.
Главная защита: заведите воспроизводимый процесс харденинга. Настраивайте разработку, QA и продакшен одинаково, с разными учётными данными в каждой среде, и удаляйте функции и примеры, которыми не пользуетесь.
CWE: CWE-16 Configuration, CWE-260 Password in Configuration File, CWE-15 External Control of System or Configuration Setting, всего 16 сопоставленных записей.
Справка: глава V13 Configuration в ASVS. Шпаргалки для этой категории в OWASP нет.
В вашем приложении работает код, написанный не вами. Эта категория описывает путь программы от исходников до продакшена: зависимости, инструменты сборки, реестры и каналы обновлений. В OWASP отмечают, что категория вышла за пределы компонентов с известными уязвимостями и заняла первое место в опросе сообщества.
Пример: небольшой служебный пакет в дереве зависимостей подменили версией с вредоносным кодом, и следующая сборка его установила.
Главная защита: знайте, что вы поставляете. Формируйте перечень компонентов (SBOM), отслеживайте транзитивные зависимости, удаляйте неиспользуемые пакеты и держите реестр компонентов актуальным.
CWE: CWE-1104 Use of Unmaintained Third Party Components, CWE-1395 Dependency on Vulnerable Third-Party Component и ещё четыре сопоставленные записи.
Шпаргалки: Vulnerable Dependency Management Cheat Sheet и Dependency Graph SBOM Cheat Sheet.
Сюда относятся отсутствие криптографии, слабые алгоритмы, небрежная работа с ключами и пропущенные проверки сертификатов. Часто алгоритм вполне исправен, а ошибка в том, что решение вообще никто не принял: данные идут по обычному HTTP или лежат в хранилище, которое никто не проверял.
Пример: форма входа передаёт пароли по обычному HTTP или хранит их с быстрым хешем без соли.
Главная защита: сначала классифицируйте данные, затем решите, что нужно шифровать при передаче и при хранении. Берите проверенные реализации стандартных алгоритмов и не храните чувствительные данные, которые вам не нужны.
CWE: CWE-261 Weak Encoding for Password, CWE-319 Cleartext Transmission of Sensitive Information, CWE-321 Use of Hard-coded Cryptographic Key, всего 32 сопоставленные записи.
Шпаргалки: Transport Layer Protection Cheat Sheet и Password Storage Cheat Sheet.
Инъекция возникает, когда недоверенный ввод попадает в интерпретатор (движок SQL, оболочку операционной системы, браузер) и тот выполняет часть ввода как инструкции. Среди распространённых форм OWASP называет инъекции в SQL, NoSQL, команды ОС, ORM, LDAP и языки выражений. В издании 2025 года сюда же входит межсайтовый скриптинг (XSS).
Пример: обработчик поиска подставляет текст пользователя в строку SQL. Кавычка в этом тексте меняет смысл запроса.
Главная защита: используйте безопасный API, который разделяет данные и команды, например параметризованные запросы или ORM. Проверяйте ввод на сервере по списку разрешённых значений. Там, где без динамического вывода не обойтись, применяйте правила экранирования целевого интерпретатора. Имена таблиц и столбцов так не экранируются, поэтому вообще не берите их из пользовательского ввода.
CWE: CWE-20 Improper Input Validation, CWE-74 Injection, CWE-78 OS Command Injection, CWE-79 Cross-site Scripting, всего 37 сопоставленных записей.
Шпаргалки: Injection Prevention Cheat Sheet и SQL Injection Prevention Cheat Sheet.
Никакая реализация не исправит архитектуру, в которой защиту не предусмотрели. В этой категории меры контроля, которые никто не планировал: бизнес-логика, которой можно злоупотребить, восстановление доступа по угадываемым ответам, привилегии, выданные по умолчанию.
Пример: эндпоинт скидок раз за разом принимает один и тот же купон, потому что повторное использование никто не рассматривал как угрозу.
Главная защита: моделируйте угрозы для критичных сценариев, таких как аутентификация, контроль доступа и платежи, ещё до разработки. В статье о моделировании угроз показан один из способов задать эти вопросы. Повторно используйте проверенные шаблоны безопасной архитектуры и не придумывайте новый для каждой функции.
CWE: CWE-269 Improper Privilege Management, CWE-256 Unprotected Storage of Credentials, CWE-73 External Control of File Name or Path, всего 39 сопоставленных записей.
Шпаргалка: Secure Product Design Cheat Sheet.
Из-за этих сбоев внутрь попадает посторонний либо атакующий может пробовать, пока одна из попыток не сработает. Сюда входят credential stuffing, password spraying, слабое восстановление аккаунта, отсутствие многофакторной аутентификации (MFA) и сессии, которые остаются действительными после выхода.
Пример: у входа для админа нет ни лимита запросов, ни MFA. Атакующий перебирает пары логинов и паролей из прошлых утечек, пока одна не подойдёт.
Главная защита: требуйте MFA везде, где можете, блокируйте автоматические попытки, удаляйте учётные записи по умолчанию и проверяйте новые пароли по списку распространённых. OWASP предлагает брать 10,000 худших паролей.
CWE: CWE-287 Improper Authentication, CWE-259 Use of Hard-coded Password, CWE-290 Authentication Bypass by Spoofing, всего 36 сопоставленных записей.
Шпаргалка: Authentication Cheat Sheet.
Целостность означает, что код или данные соответствуют ожиданиям и не менялись по пути. Эта категория описывает автообновления без проверки подписи, скрипты с CDN без проверки целостности, пайплайны CI/CD, которые берут артефакты из непроверенных мест, и десериализацию недоверенных объектов.
Пример: страница загружает файл JavaScript со стороннего CDN без атрибута integrity. Если файл изменят, изменённый код выполнится у каждого посетителя.
Главная защита: подписывайте то, что поставляете, и проверяйте подпись перед использованием. Ограничьте менеджеры пакетов доверенными репозиториями и требуйте ревью изменений в пайплайне и конфигурации.
CWE: CWE-345 Insufficient Verification of Data Authenticity, CWE-494 Download of Code Without Integrity Check, CWE-502 Deserialization of Untrusted Data, всего 14 сопоставленных записей.
Шпаргалка: Software Supply Chain Security Cheat Sheet.
Без логов и алертов взлом может месяцами оставаться незамеченным. Сюда относятся отсутствие записей о входах и сбоях контроля доступа, логи, которые хранятся только на машине, которую могут скомпрометировать, алерты, которые никто не читает, и логи, из которых утекают секреты.
Пример: неудачные входы в аккаунт админа не записываются, а в строке лога о сбросе пароля виден новый пароль.
Главная защита: логируйте сбои аутентификации и контроля доступа с контекстом, достаточным для расследования, кодируйте данные перед записью в лог, не пишите туда секреты и отправляйте логи туда, где хост приложения не сможет их переписать.
CWE: CWE-778 Insufficient Logging, CWE-532 Insertion of Sensitive Information into Log File, CWE-117 Improper Output Neutralization for Logs, всего 5 сопоставленных записей.
Шпаргалки: Logging Cheat Sheet и Application Logging Vocabulary Cheat Sheet.
Программы ломаются. Эта категория о том, как именно: падение с утечкой данных, проверка, пропущенная из-за ошибки вызова, многошаговая операция, которая продолжается после сбоя на одном из шагов.
Пример: вызов платёжного сервиса завершается по таймауту, код считает таймаут успехом, и заказ уезжает неоплаченным.
Главная защита: перехватывайте ошибки там, где они возникают, и обрабатывайте их осознанно. Добавьте глобальный обработчик исключений как страховку. Если многошаговая операция сорвалась на полпути, откатите её и завершите с отказом (fail closed).
CWE: CWE-209 Generation of Error Message Containing Sensitive Information, CWE-252 Unchecked Return Value, CWE-248 Uncaught Exception, всего 24 сопоставленные записи.
Шпаргалка: Error Handling Cheat Sheet.
Полным стандартом он не считается. Десять категорий не опишут все требования к защищённому приложению, и многие риски лежат за пределами списка. Успешная проверка по Top 10 не делает приложение защищённым.
Закрыть его как чек-лист тоже нельзя. Категории описывают причины, поэтому одна функция может затрагивать несколько категорий, а одна категория охватывает множество разных багов. Команды, которые просто ставят галочки, часто исправляют примеры и оставляют шаблон, который их породил.
Требований в нём тоже нет. Для них в OWASP есть Application Security Verification Standard (ASVS), набор требований безопасности для проектирования, разработки и тестирования веб-приложений и сервисов. Текущая версия 5.0.0 опубликована 30 мая 2025 года. Top 10 подходит, чтобы объяснить риск и решить, куда смотреть в первую очередь. Когда нужны требования, по которым можно разрабатывать и проверять, берите ASVS.
Вы запустите на своей машине OWASP Juice Shop, намеренно уязвимое веб-приложение, прочитаете его скорборд и сопоставите три категории заданий с пунктами Top 10. Ничего эксплуатировать не нужно. Читайте описания заданий, не заглядывая в решения, и держите приложение привязанным к localhost.
Понадобится Docker. Вывод ниже получен в Docker 29.8.2 на Windows 11 с Git Bash. Команды работают в любой оболочке POSIX.
docker --version
docker info --format '{{.ServerVersion}}'Полученный вывод:
Docker version 29.8.2, build 7fc2dff
29.8.2docker run -d -p 127.0.0.1:3000:3000 bkimminich/juice-shopПрефикс 127.0.0.1: публикует порт только на интерфейсе loopback, поэтому другие машины до него не достанут. На машине, где я выполнял эти шаги, контейнер из того же образа уже работал под именем juice-local, так что второй я не запускал. Проверьте, что запущено:
docker ps --format '{{.Names}} {{.Image}} {{.Ports}}'Строка Juice Shop из полученного вывода:
juice-local bkimminich/juice-shop 127.0.0.1:3000->3000/tcpcurl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3000/
curl -s http://127.0.0.1:3000/rest/admin/application-versionПолученный вывод:
200
{"version":"20.3.0"}Ваша версия может отличаться. Запишите её, потому что названия и категории заданий меняются от релиза к релизу.
curl -s http://127.0.0.1:3000/api/Challenges/ -o challenges.json
python -c "import json,collections; d=json.load(open('challenges.json'))['data']; print(len(d)); [print(v,k) for k,v in sorted(collections.Counter(x['category'] for x in d).items())]"Полученный вывод:
116
12 Broken Access Control
4 Broken Anti Automation
9 Broken Authentication
5 Cryptographic Issues
12 Improper Input Validation
14 Injection
3 Insecure Deserialization
6 Miscellaneous
4 Observability Failures
5 Security Misconfiguration
3 Security through Obscurity
17 Sensitive Data Exposure
2 Unvalidated Redirects
9 Vulnerable Components
9 XSS
2 XXEОткройте в браузере http://127.0.0.1:3000/#/score-board и сравните категории с числами выше. Если они расходятся, запишите свою версию Juice Shop.
Ниже один из разумных вариантов. Ваш может отличаться, если вы способны обосновать его одной фразой.
| Категория Juice Shop | Заданий в категории | Пример задания (сложность от 1 до 6) | Описание на скорборде | Пункт Top 10:2025 |
|---|---|---|---|---|
| Broken Access Control | 12 | Admin Section (2) | Access the administration section of the store. | A01 Broken Access Control |
| Injection | 14 | Login Admin (2) | Log in with the administrator's user account. | A05 Injection |
| Security Misconfiguration | 5 | Error Handling (1) | Provoke an error that is neither very gracefully nor consistently handled. | A02 Security Misconfiguration |
Почему подходит каждая строка:
Названия категорий в Juice Shop придуманы самим проектом. Например, его категория XSS в списке 2025 года соответствует A05. Сопоставляйте по первопричине и указывайте CWE.
docker ps --format '{{.Names}} {{.Image}}'
docker stop <container-name>
docker rm <container-name>Замените <container-name> именем из первой команды. Контейнер запущен с -d и без --rm, поэтому после остановки он останется на диске, пока вы его не удалите.
0.0.0.0 или на облачном хосте выводит в интернет намеренно уязвимое приложение.Безопасность веба и API
Фронтенд на JavaScript перечисляет API, с которым говорит приложение. Модель ИИ читает бандлы и выносит endpoints и параметры, а вы проверяете каждый.
Безопасность веба и API
Методика для IDOR, XSS, SSRF и сломанной аутентификации: модель ИИ как читатель и второе мнение, плюс как проверить находку и избежать ложных срабатываний.
Безопасность веба и API
API описывают свою форму через OpenAPI и introspection в GraphQL. Модель ИИ читает схему и планирует тесты авторизации, которые вы проверяете.