Рассмотрите пример уязвимого SQL-запроса в веб-приложении и опишите способы его атак (SQL-инъекция), а затем перечислите конкретные меры защиты и практики безопасной работы с БД

13 Ноя в 09:40
3 +1
0
Ответы
1
Пример уязвимого запроса (псевдокод, конкатенация строк — плохая практика):
$sql = "SELECT * FROM users WHERE username = '" . $_GET['user'] . "' AND password = '" . $_GET['pass'] . "'";
Способы атак (SQL‑инъекции) — кратко с примерами полезных полезователей (payload):
- Тавтология (bypass аутентификации): подставляют условие, всегда истинное. Пример:
payload: `' OR 1=11=11=1 --` — запрос превращается в условие, дающее все строки.
- UNION‑инъекция (извлечение данных): добавление `UNION SELECT ...` чтобы вернуть колонки из другой таблицы. Пример:
payload: ` ' UNION SELECT username,password FROM users --`
- Error‑based (через сообщения об ошибке): заставляют СУБД вернуть текст ошибки, содержащий данные (например, неправильный CAST или подзапрос в сообщении).
- Blind SQL‑injection (Boolean‑based): проверяют логические ответы приложения (true/false) по содержимому базы, например по побайтному перебору значений. Пример логического теста: `... AND (SUBSTRING((SELECT password FROM users WHERE username='admin'),1,1) = 'a')`
- Time‑based (индикация через задержки): используют функции задержки, чтобы извлечь побайтно данные по времени отклика. Пример: `... IF((condition), SLEEP(555), 0)`
- Stacked queries (несколько команд в одном запросе): добавляют `; DROP TABLE users;` — зависит от поддержки нескольких запросов драйвером.
- Second‑order (вторичная инъекция): вредоносные данные сохраняются в БД и позже используются в уязвимом запросе.
Последствия: утечка/изменение/удаление данных, обход аутентификации, исполнение команд ОС (при некоторых настройках), полный контроль над БД.
Конкретные меры защиты и практики безопасной работы с БД
1. Параметризованные запросы / Prepared statements (обязательная первичная мера)
- PHP PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$user, $pass]);
- Python psycopg2:
cur.execute("SELECT * FROM users WHERE username = %s AND password = %s", (user, pass))
- Java:
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE username=? AND password=?"); ps.setString(1,user); ...
2. ORM/Query builders (использовать правильно): дают параметризацию по умолчанию; избегать raw SQL или экранировать параметры.
3. Белые списки (allowlist) для входных данных
- Для полей типа “column name”, “order by” и т.п. — проверять вход по списку допустимых значений.
- Ограничивать длину вводимых данных, тип (числа, email), применять строгие регулярные проверки.
4. Экранирование как запасной вариант (не основной)
- Использовать встроенные функции экранирования драйвера (например, mysqli_real_escape_string), но полагаться нужно на подготовленные выражения.
5. Отказ от динамического SQL
- По возможности избегать конкатенации SQL; если динамика нужна — параметризовать все значения и валидация для имён объектов.
6. Минимальные права для учётных записей БД
- Каждый сервис/модуль — свой пользователь БД с минимально необходимыми привилегиями (SELECT/INSERT/... по необходимости).
- Не использовать аккаунт администратора приложения для обычных запросов.
7. Отключение/ограничение поддержки нескольких выражений
- В драйверах отключить возможность выполнения нескольких SQL команд в одном запросе (например, allowMultiQueries=false).
8. Безопасные хранимые процедуры (с параметрами)
- Если используются, то только с параметрами; не генерировать динамический SQL внутри без параметризации.
9. Обработка ошибок и логирование
- Не показывать подробные сообщения об ошибках пользователю. Логи — централизованные и защищённые, с мониторингом аномалий.
10. Web Application Firewall (WAF) и IDS/IPS
- Дополняет защиту, блокирует известные шаблоны атак, но не заменяет безопасное кодирование.
11. Тестирование и процесс контроля качества
- Статический/динамический анализ кода, SAST/DAST, регулярные пентесты, ревью кода, автоматизированные тесты на инъекции.
12. Мониторинг и оповещения
- Логи запросов, аномальные паттерны (внезапные сложные запросы, длинные строки, много UNION), быстрые оповещения.
13. Контроль конфигурации СУБД
- Отключить опасные расширения (xp_cmdshell и т.п.), обновлять СУБД и драйверы, применять патчи.
Короткие рекомендации по приоритетам (что сделать в первую очередь)
- Немедленно заменить конкатенацию параметров на подготовленные выражения.
- Убедиться в минимальных привилегиях аккаунта БД.
- Спрятать подробные SQL‑ошибки от пользователей и включить логирование/мониторинг.
- Внедрить код‑ревью и тесты на SQL‑инъекции.
Если нужно, могу привести конкретные примеры кода (для вашей платформы/языка) и примеры payload'ов для каждого типа атаки.
13 Ноя в 09:48
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир