Представьте, что всего одна строка в текстовом поле входа способна обойти всю систему аутентификации и открыть доступ к базе данных сайта. Звучит как кино? Это реальность, и имя ей — SQL Injection.
Введение
SQL Injection — одна из самых опасных и распространённых уязвимостей в веб-приложениях. Несмотря на то, что о ней говорят уже больше 20 лет, до сих пор тысячи сайтов остаются уязвимыми.В этой статье мы разберём:
- Как работает SQL-инъекция на примере уязвимого веб-приложения.
- Практическую эксплуатацию с использованием Python и SQLmap.
- Как защититься от таких атак.
- Современные техники обхода WAF и сложные кейсы.
Как работает SQL Injection?
SQL-инъекция возникает, когда приложение некорректно обрабатывает пользовательский ввод, позволяя злоумышленнику внедрить произвольный SQL-код.Пример уязвимого PHP-кода:
PHP:
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($conn, $query);
admin' --
в поле username
, запрос превратится в:
SQL:
SELECT * FROM users WHERE username='admin' --' AND password='...'
--
отключает проверку пароля, и злоумышленник получает доступ к аккаунту администратора.Эксплуатация SQL-инъекции на практике
Рассмотрим реальный кейс с уязвимым сайтом (используем легальный стенд, например,
Ссылка скрыта от гостей
или
Ссылка скрыта от гостей
).1. Установка DVWA (для новичков)
- Скачайте DVWA с
Ссылка скрыта от гостей.
- Установите XAMPP или LAMP для локального сервера.
- Разместите файлы DVWA в папке
htdocs
(или аналогичной). - Настройте базу данных в
config.inc.php
. - Запустите сервер и откройте DVWA в браузере.
2. Обнаружение уязвимости
Проверим форму входа на SQL-инъекцию:- Вводим
'
— если появляется ошибка SQL, уязвимость есть. - Пробуем
' OR 1=1 --
— если авторизация проходит, инъекция подтверждена.
3. Извлечение данных с помощью UNION-атаки
Если приложение выводит результаты запроса, можно использовать UNION для получения данных из других таблиц.Пример запроса:
SQL:
' UNION SELECT username, password FROM users --
Ссылка скрыта от гостей
или
Ссылка скрыта от гостей
.4. Автоматизация с помощью SQLmap
Для ускорения тестирования используем SQLmap:
Bash:
sqlmap -u "http://example.com/login.php" --data="username=admin&password=123" --dbs
-u
— URL-адрес цели.--data
— данные POST-запроса.--dbs
— извлечение списка баз данных.
5. Современные техники: SQLi в REST API и обход WAF
SQLi в REST APIЕсли приложение использует JSON, инъекцию можно внедрить в тело запроса:
JSON:
{
"username": "admin' OR 1=1 --",
"password": "password"
}
Для обхода WAF можно использовать:
- Модификацию ключевых слов:
SQL:SELSELECTECT * FROM users WHERE username='admin'
- Каскадные запросы:
SQL:'; SELECT * FROM users WHERE '1'='1
Рекомендуемые материалы по SQL Injection на Codeby.net
- CTF: Решаем SQL Injection задания
Практический разбор SQLi-задач с использованием SQLmap и ручных техник. Подходит для подготовки к CTF и отработки навыков на легальных стендах. - SQL-injection, Error Based - XPATH
Разбор инъекций через функцииextractvalue()
иupdatexml()
в MySQL, с примерами и объяснением механизмов. - SQL Injection: обсуждение и вопросы
Форумная тема с обсуждением различных техник SQL-инъекций, включая Boolean-based и обход фильтров, с примерами запросов и советами от участников.
Как защититься от SQL Injection?
- Используйте подготовленные выражения (Prepared Statements)
PHP:$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?"); $stmt->bind_param("ss", $username, $password); $stmt->execute();
- Применяйте ORM (например, SQLAlchemy, Django ORM)
ORM автоматически экранируют запросы, предотвращая инъекции. - Ограничивайте права БД
У приложения не должно быть прав наDROP TABLE
илиUNION SELECT
. - Используйте WAF (например, ModSecurity)
WAF помогает блокировать известные шаблоны атак. - Проверяйте ввод данных
Используйте whitelisting (разрешение только ожидаемых значений).
FAQ

Только на своих приложениях или через bug bounty (например, на HackerOne).

Слепые (Blind SQLi), основанные на времени (Time-Based) и ошибках (Error-Based).

Через условные ошибки или задержки ответа (например,
SLEEP(5)
).
Django ORM, SQLAlchemy и Hibernate автоматически экранируют запросы.

Нет, WAF помогает, но не заменяет безопасный код.
Хотите глубже разобрать техники SQL-инъекций и научиться использовать их профессионально?
На курсе «SQL Injection: от сканирования до эксплуатации» от Codeby Academy вы:
Освоите 20+ техник SQLi (Classic, Blind, Time-based, Error-based, Out-of-Band)
Научитесь автоматизировать атаки с SQLmap и писать свои payload’ы
Получите практику на легальных стендах и CTF-задачах
Разберёте методы обхода WAF и эксплуатации SQLi в API
Старт ближайшего потока — 23 июня.
Попробуйте повторить атаку на DVWA и поделитесь результатами в комментариях!


Последнее редактирование: