Рассмотрите сценарий взлома веб‑приложения через SQL‑инъекцию: приведите пример уязвимого кода на PHP ($query = "SELECT * FROM users WHERE name='" . $_GET['name'] . "'";), объясните механизм атаки и опишите полные меры по обнаружению, устранению и предотвращению

18 Ноя в 17:29
2 +1
0
Ответы
1
Пример уязвимого кода (контекст PHP + mysqli):
<?php
// уязвимый пример
$name = $_GET['name'];
$query = "SELECT * FROM users WHERE name='" . $name . "'"; // <-- уязвимо
$result = mysqli_query($conn, $query);
?>
Механизм атаки (кратко)
- Атакующий подставляет в параметр строку с SQL‑синтаксисом, чтобы изменить смысл запроса.
- Например, если в GET передать payload типа: `anything' OR '1'='1`, итоговый SQL станет:
"SELECT * FROM users WHERE name='anything' OR '1'='1'". Здесь выражение 1=11=11=1 всегда истинно, поэтому фильтр обходится и возвращаются все строки.
- Последствия: обход аутентификации, чтение/изменение данных, привилегированное выполнение команд через инъекции в другие запросы.
Обнаружение
- Ревью кода: поиск конкатенации пользовательских данных в SQL (regexp, SAST).
- Логирование и анализ БД/приложения: неожиданно большие выборки, частые синтаксические ошибки SQL в логах, нестандартные символы (кавычки, `--`, `/*`).
- DAST (сканирование веб‑приложения), fuzzing и тесты на SQLi в CI.
- Мониторинг аномалий: резкие всплески количества запросов, необычные запросы к таблицам с чувствительными данными.
- WAF/IDS сигнатуры и поведенческие правила.
Устранение (ремонт уязвимости)
- Немедленно заменить уязвимые места на параметризованные запросы / подготовленные выражения. Пример с PDO:
<?php
$pdo = new PDO($dsn, $user, $pass, $options);
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute([':name' => $_GET['name']]);
$rows = $stmt->fetchAll();
?>
- Минимизация прав: аккаунт БД, используемый приложением, должен иметь только нужные привилегии (SELECT/INSERT/UPDATE/DELETE по необходимости), не root.
- Убрать подробные SQL‑ошибки из ответа клиенту; логировать их на сервере.
- Проверить и исправить все остальные места с динамическим SQL (включая ORM/строительство запросов вручную).
- Обновить зависимости, патчи.
Предотвращение (best practices)
- Всегда использовать подготовленные выражения/параметры (PDO, mysqli->prepare, ORM с параметризацией).
- Whitelist валидация входных данных (тип/длина/формат) вместо попыток полноценно экранировать.
- Экранирование входа только как запасной вариант (mysqli_real_escape_string) — не заменяет подготовленные выражения.
- Хранить секреты отдельно, использовать шифрование/хеширование для паролей (bcrypt/argon2).
- Ограничивать привилегии БД и сетевой доступ между сервисами.
- Внедрить автоматизированные SAST/DAST тесты в CI/CD; регулярные ревью кода.
- Включить WAF и правила блокировки для известных паттернов SQLi; настроить алерты.
- Журналировать запросы/ошибки, делать аудит и периодические пентесты.
Краткая дорожная карта внедрения fixes
1. Поиск всех мест с конкатенацией SQL (SAST, grep).
2. Заменить на подготовленные выражения + покрыть тестами.
3. Ограничить права БД и отключить вывод SQL ошибок пользователю.
4. Запустить DAST/пентест и настроить мониторинг/WAF.
5. Внедрить правила безопасности в разработческий процесс (SAST в CI, ревью).
Если нужно, могу привести безопасный пример для mysqli, шаблон политики аудита или чек‑лист для ревью кода.
18 Ноя в 18:15
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир