Классы уязвимостей приложений
Уязвимость приложения — это редко волшебный эксплойт; чаще это предсказуемое следствие доверия к вводу, которому доверять нельзя. Вся область укладывается в несколько повторяющихся форм поломок. Инъекция — недоверенные данные попадают в интерпретатор и разбираются как код. Клиентские уязвимости злоупотребляют доверием, которое браузер оказывает вашему origin. Нарушение контроля доступа — сервер выполняет запрос, не проверив, что вызывающему это позволено. Серверные уязвимости — сервер обрабатывает запрос так, как направляет его автор. Освойте форму — и вы классифицируете баг, с которым по имени ещё не встречались.
Эта тема даёт модель мышления для каждого класса: что уязвимость есть, почему возникает, как обнаружить её в собственной телеметрии и какая защита действительно её закрывает, а не защита из фольклора. Именно в последнем и живёт собеседование: назвать работающую защиту — значит отделить инженера, понимающего механизм, от того, кто пересказывает «поставьте WAF».
Карта темы
- Инъекции — данные, переходящие в интерпретатор; почему параметризованные запросы сильнее экранирования и WAF; NoSQL, команды, LDAP, шаблоны и второпорядковая инъекция; иерархия защиты.
- Клиентские уязвимости — три вида XSS, контекстное экранирование и CSP, CSRF против XSS, cookie с SameSite/HttpOnly, CORS как ослабление same-origin policy, кликджекинг и проверка origin в postMessage.
- Нарушение контроля доступа — аутентификация против авторизации, IDOR/BOLA и серверные проверки владения, почему спрятать элемент UI — не защита, mass assignment, RBAC против ABAC и запрет по умолчанию.
- Серверные уязвимости — SSRF и облачные метаданные, небезопасная десериализация, XXE, обход каталога, request smuggling и гонки TOCTOU, объединённые идеей безопасных умолчаний.
Каждый класс здесь сводится к границе, которую приложение не удержало: между данными и кодом, между origin'ами, между вызывающими или между проверкой и использованием. Удержите границу — и класс исчезает.