SQL-инъекция (SQLi) — уязвимость веб-приложения, позволяющая атакующему внедрить произвольный SQL-код в запрос к базе данных. По данным OWASP Top 10 2021, инъекции занимают третье место среди критических веб-уязвимостей. Эксплуатация — от утечки данных до полного захвата сервера.
Как работает SQL-инъекция
Уязвимый PHP-код передаёт пользовательский ввод напрямую в SQL:
// УЯЗВИМО
$query = "SELECT * FROM users WHERE login='" . $_GET['user'] . "'";
Ввод атакующего: ' OR '1'='1
Итоговый запрос: SELECT * FROM users WHERE login='' OR '1'='1' — возвращает всех пользователей.
Более опасный ввод: '; DROP TABLE users; -- — удаляет таблицу (при наличии прав).
Виды SQL-инъекций
- Classic / In-band: результат виден в ответе приложения (
UNION SELECTдля извлечения данных). - Blind Boolean-based: результат угадывается по изменению поведения приложения (истина/ложь).
- Blind Time-based: используется
SLEEP(5)— задержка ответа подтверждает инъекцию. - Out-of-band: данные извлекаются через DNS-запросы или HTTP от имени сервера БД.
- Second-order: вредоносный ввод сохраняется в БД и эксплуатируется позже другим запросом.
Защита от SQL-инъекций
- Параметризованные запросы (Prepared Statements) — единственная надёжная защита:
// БЕЗОПАСНО — PHP PDO
$stmt = $pdo->prepare('SELECT * FROM users WHERE login = ?');
$stmt->execute([$login]);
// БЕЗОПАСНО — PHP MySQLi
$stmt = $mysqli->prepare('SELECT * FROM users WHERE login = ?');
$stmt->bind_param('s', $login);
$stmt->execute();
- ORM: Eloquent (Laravel), Doctrine (Symfony), SQLAlchemy (Python) генерируют параметризованные запросы автоматически.
- Принцип минимальных привилегий: пользователь БД для приложения не должен иметь права
DROP,ALTER,FILE. - WAF (Web Application Firewall): блокирует типичные паттерны SQLi на уровне HTTP-запросов.
- Валидация ввода: белые списки допустимых символов для идентификаторов и числовых полей.
История
Первое публичное описание SQL-инъекций — статья Jeff Forristal в Phrack Magazine (#54, декабрь 1998 года). OWASP включил SQL injection в Top 10 с первого выпуска в 2003 году. Крупнейшие взломы через SQLi: Heartland Payment Systems (2008, 130 млн карт), Sony PlayStation Network (2011, 77 млн аккаунтов), Adobe (2013, 153 млн записей).
Инструменты для тестирования
sqlmap — автоматизированный инструмент обнаружения SQLi. Используется в рамках пентестинга с разрешения владельца сервера. Сканирует параметры GET/POST/Cookie на все виды инъекций, автоматически извлекает данные. Проверка защиты приложения через OWASP ZAP или Burp Suite Community Edition — стандартная практика перед production-деплоем.
Автоматическое обнаружение и DevSecOps
Статический анализ кода (SAST) находит потенциальные SQLi в коде до деплоя: PHP CodeSniffer с плагинами, Psalm, PHPStan. В CI/CD-пайплайне (CI/CD) SAST-инструменты запускаются автоматически при каждом коммите. Динамическое тестирование (DAST) — sqlmap, OWASP ZAP — сканирует работающее приложение. На уровне VPS: ModSecurity (Apache/Nginx WAF) с правилами OWASP Core Rule Set блокирует типовые SQLi без изменения кода приложения.