SQL-инъекция и XSS: атаки на веб-приложения
Проверено экспертной редакцией SecRadar · по первоисточникам ФСТЭК / ФСБ / Банка России
SQL-инъекция (SQLi) и межсайтовый скриптинг (XSS) — две старейшие и до сих пор массовые атаки на веб-приложения, обе входят в категорию Injection рейтинга OWASP Top 10. Обе эксплуатируют одну и ту же слабость — недостаточную проверку пользовательского ввода, — но бьют по разным целям: SQLi атакует базу данных на сервере, XSS выполняется в браузере другого пользователя.
Материал разбирает механику, виды и защиту обеих атак, с основным фокусом на SQL-инъекции.
Кратко
- SQL-инъекция
- Внедрение SQL-кода через поле ввода, которое приложение не проверяет, — цель атаки: база данных на сервере.
- Виды SQLi
- Классическая (in-band) — ответ виден сразу; слепая (blind) — по признакам true/false или задержке; out-of-band — по отдельному каналу (DNS, HTTP).
- XSS
- Внедрение JavaScript-кода, который выполняется в браузере жертвы, — цель атаки: сессия и данные пользователя, не сервер.
- Виды XSS
- Отражённый (reflected) — через ссылку с полезной нагрузкой; хранимый (stored) — скрипт сохранён на сервере; DOM-based — уязвимость целиком в клиентском коде.
- Категория OWASP
- Обе относятся к категории Injection (A05 в редакции OWASP Top 10 2025, ранее A03:2021) — атакам через недостаточно проверенный пользовательский ввод.
- Основная защита
- Для SQLi — параметризованные запросы (prepared statements); для XSS — экранирование вывода и Content Security Policy; в обоих случаях WAF — дополнительный, не основной рубеж.
Что такое SQL-инъекция
SQL-инъекция (SQL injection, SQLi) — это атака на веб-приложение, при которой злоумышленник внедряет вредоносный SQL-код в поля ввода, чтобы обмануть базу данных и получить, изменить или удалить данные, к которым у него нет доступа. Причина — недостаточная проверка пользовательского ввода: приложение принимает то, что ввёл пользователь, и подставляет это напрямую в текст SQL-запроса, вместо того чтобы обработать как значение, отдельное от кода команды.
Атака возможна везде, где веб-приложение строит SQL-запрос из непроверенного пользовательского ввода: форма логина, поле поиска, параметр в URL, cookie, HTTP-заголовок. Если СУБД выполняет получившийся запрос буквально — включая ту часть, которую туда дописал атакующий, — граница между «данными» и «командой» стирается, и злоумышленник фактически получает возможность выполнять собственные SQL-команды от имени приложения.
Как работает SQL-инъекция
Механика SQL-инъекции строится на разрыве кавычек и логики условия внутри запроса, который приложение собирает из строк: атакующий вставляет в поле ввода символ, закрывающий ожидаемое значение раньше времени, а затем дописывает собственный код, который СУБД воспринимает как часть исходного запроса.
Классический учебный пример — форма логина, где запрос на сервере собирается конкатенацией строк:
Если приложение подставляет ввод без проверки, а атакующий вместо логина вводит ' OR 1=1 --, итоговый запрос превращается в:
Одинарная кавычка закрывает строковое значение раньше, чем рассчитывал разработчик, условие 1=1 истинно всегда, а -- комментирует остаток строки — в том числе проверку пароля. В результате запрос возвращает первую строку из таблицы пользователей без единой правильной пары логин/пароль, и атакующий заходит под чужой учётной записью.
Виды SQL-инъекций
Виды SQL-инъекций различаются тем, каким путём атакующий получает результат внедрённого запроса — видит его сразу в ответе приложения, восстанавливает по косвенным признакам или получает через отдельный канал связи.
↔ таблицу можно прокрутить вбок
| Вид | Как получают результат | Когда применяется |
|---|---|---|
| Классическая (in-band) | Результат виден напрямую в ответе страницы — в данных или в тексте ошибки СУБД | Самый простой для эксплуатации случай; включает подтип UNION-based, когда данные извлекаются через оператор UNION |
| Слепая (blind) | Ответ не показывает данные и ошибки — только косвенные признаки: разное поведение страницы (boolean-based) или разница во времени ответа (time-based) | Когда приложение не выводит ошибки СУБД и не показывает результат запроса напрямую, но реагирует на внедрённое условие иначе |
| Out-of-band | Результат передаётся по отдельному каналу — например, СУБД инициирует DNS- или HTTP-запрос к серверу атакующего, в котором закодированы похищенные данные | Когда ни прямой ответ, ни разница в поведении/времени недоступны атакующему, но СУБД умеет делать исходящие сетевые запросы |
Внутри слепой SQL-инъекции разделяют два приёма: boolean-based — атакующий по очереди задаёт истинные и ложные условия и смотрит, отличается ли ответ страницы (например, показан результат или пустая страница), и time-based — использует функции задержки СУБД, чтобы по времени ответа сервера понять, было условие истинным или нет, даже если содержимое страницы всегда одинаковое.
XSS: межсайтовый скриптинг
XSS (Cross-Site Scripting, межсайтовый скриптинг) — это атака, при которой злоумышленник внедряет вредоносный JavaScript-код в веб-страницу, и этот код выполняется в браузере другого пользователя, а не на сервере. Итог для жертвы — кража сессионных cookie и токенов авторизации, перехват вводимых данных, подмена содержимого страницы или выполнение действий от имени жертвы без её ведома.
Причина та же, что у SQL-инъекции — недостаточная проверка и обработка пользовательского ввода, только уязвимое место другое: приложение выводит непроверенные данные (введённые пользователем или взятые из параметра URL) обратно в HTML-страницу, и браузер жертвы интерпретирует их не как текст, а как исполняемый код.
Виды XSS различаются тем, откуда берётся вредоносный код и как он попадает в браузер жертвы:
Отражённый reflected
Вредоносный код передаётся в самом запросе — обычно в параметре ссылки — и сервер немедленно «отражает» его обратно в HTML-ответе без проверки. Атака требует, чтобы жертва перешла по специально составленной ссылке, часто присланной в фишинговом письме или сообщении.
Хранимый stored
Вредоносный код сохраняется на сервере — в комментарии, профиле пользователя, отзыве, поле формы — и выполняется в браузере каждого, кто откроет страницу с этим содержимым. Не требует специальной ссылки и потому опаснее: жертвой становится любой посетитель страницы.
DOM-based
Уязвимость целиком в клиентском JavaScript-коде страницы: скрипт на стороне браузера сам берёт непроверенные данные (например, из URL) и вставляет их в DOM, минуя сервер полностью — сервер может быть полностью корректен, а страница всё равно уязвима.
Чем XSS отличается от SQL-инъекции
Ключевое отличие — цель атаки: SQL-инъекция бьёт по базе данных на сервере, XSS — по браузеру и сессии конкретного пользователя. Обе используют один и тот же корневой недостаток — приложение не проверяет и не обрабатывает должным образом пользовательский ввод, — но результат внедрения выполняется в разных средах и с разными последствиями.
↔ таблицу можно прокрутить вбок
| Параметр | SQL-инъекция | XSS |
|---|---|---|
| Куда внедряется код | В SQL-запрос, который выполняет СУБД на сервере | В HTML/JavaScript-страницу, которую выполняет браузер жертвы |
| Где выполняется | На сервере, внутри базы данных приложения | В браузере другого пользователя, не на сервере |
| Основная цель атакующего | Доступ к чужим данным в БД, их изменение или удаление | Кража сессии/cookie, действия от имени жертвы, подмена контента |
| Кто жертва | Организация — владелец базы данных и приложения | Конкретный пользователь, чей браузер выполнил скрипт |
| Базовая защита | Параметризованные запросы (prepared statements) | Экранирование вывода, Content Security Policy |
Как защититься от обеих атак
Основная защита от SQL-инъекций и XSS находится в коде приложения, а не в отдельном защитном продукте — это параметризация запросов для SQLi и корректная обработка вывода для XSS. Средства сетевой защиты снижают риск дополнительно, но не заменяют исправление уязвимости в самом приложении.
Параметризованные запросы
Prepared statements передают пользовательский ввод в СУБД как значение параметра, а не как часть текста SQL-команды — сама конструкция запроса при этом не может быть изменена вводом.
Экранирование вывода и CSP
Экранирование спецсимволов HTML при выводе непроверенных данных плюс Content Security Policy, ограничивающая, какой код вообще может выполняться на странице.
Валидация ввода
Проверка формата, длины и допустимых символов на входе — не замена параметризации и экранирования, а дополнительный барьер до того, как данные вообще попадут в запрос или в вывод.
WAF
Web Application Firewall фильтрует известные паттерны SQLi и XSS на уровне HTTP-трафика — полезный дополнительный рубеж, в том числе на время исправления уже найденной уязвимости, но не замена защиты внутри кода.
На портале класс WAF — основная техническая защита веб-приложений на сетевом уровне: там же обзор продуктов, которые фильтруют SQLi- и XSS-паттерны в трафике. Отдельная задача — защита API, где та же логика инъекций применима к параметрам запросов и телу JSON-запроса: закрывается классом API Security.
Оба технических средства снижают риск на уровне трафика, но не устраняют корень проблемы — уязвимый код. Системная защита начинается раньше, на этапе разработки: практики безопасной разработки (РБПО) описывают, как встроить параметризацию запросов, экранирование вывода и статический анализ кода в сам процесс разработки, а не добавлять их постфактум.
Проверить, что эти практики действительно работают на конкретном приложении, позволяет пентест — тестирование на проникновение, которое ищет SQLi, XSS и другие инъекции тем же способом, что и реальный атакующий.
Связь с OWASP Top 10
SQL-инъекция и XSS относятся к категории Injection в рейтинге OWASP Top 10 — списке наиболее критичных рисков безопасности веб-приложений, который проект OWASP регулярно обновляет. В версии OWASP Top 10 2021 года эта категория обозначена как A03:2021-Injection и объединяет все атаки, где причина одна и та же — непроверенный пользовательский ввод исполняется как код: SQL-, NoSQL-, OS command-инъекции и, начиная с редакции 2021 года, также межсайтовый скриптинг, который в более ранних версиях рейтинга (2013, 2017) выделялся в отдельную категорию.
Смежная тема, которая не входит в фокус этого материала, — как OWASP Top 10 устроен целиком, какие ещё категории риска в него входят и как рейтинг применяют для приоритизации в собственном проекте безопасной разработки; отдельный разбор всех десяти категорий — на профильной странице словаря OWASP Top 10.
Частые вопросы
Что такое SQL-инъекция простыми словами?
Чем XSS отличается от SQL-инъекции?
Как защититься от SQL-инъекций?
Что такое слепая SQL-инъекция?
Что такое хранимый XSS?
Может ли WAF полностью защитить от SQL-инъекций и XSS?
Входят ли SQL-инъекция и XSS в OWASP Top 10?
Словарь терминов ИБ на SecRadar
SQL-инъекция, XSS и другие атаки на приложения — независимые разборы без привязки к вендору, с прямыми ссылками на классы СЗИ, которые закрывают конкретную угрозу.