Содержание статьи
Уязвимость типа error-based SQL injection возникает, когда ты можешь вызвать ошибку в SQL-запросе к базе данных приложения. Существует несколько вариантов:
- Веб‑приложение выводит сообщение об ошибке в интерфейс — наиболее простой и быстрый путь. Ты видишь подробное описание ошибки и четко понимаешь, как будет выглядеть запрос. Данные выводятся прямо в интерфейс приложения внутри сообщения об ошибке. Почти как при union-инъекции.
- Скрытая error-based-инъекция — сообщение об ошибке неинформативное или вообще отсутствует. Если сообщения нет вообще, твоя задача — отследить изменения в ответах сервера. Это может быть разная длина ответов или разное время загрузки страницы. Этот тип инъекции похож на boolean-based или time-based.
www
Для большинства примеров буду использовать собственную лабу. Полный архив с лабой скачивай из моего GitHub или Telegram-канала. Здесь приведу исходные коды веб‑проекта, чтобы ты мог увидеть ошибки, которые приводят к возникновению инъекции.
Поиск error-based SQL injection
Если скачал мой архив с лабой, запусти командой docker . Если нет, создай PHP-файл с таким содержимым:
<?php// Отключаем автоматический вывод ошибок, чтобы контролировать выводmysqli_report(MYSQLI_REPORT_OFF);// Подключаемся к MySQL$db = new mysqli("db", "root", "root", "lab");// Получаем строку поиска без санитизации$search = $_GET['q'] ?? '';// Прямая подстановка параметра в запрос$sql = "SELECT title, author, year FROM books WHERE title LIKE '%$search%'";$result = $db->query($sql);?><h2>Level 1 — Book search (Syntax error-based)</h2><form> <input type="text" name="q" placeholder="Search book title"> <button>Search</button></form><?php// Простой вывод информации об ошибке на страницуif (!$result) { echo "<pre>SQL Error: " . htmlspecialchars($db->error) . "\nQuery: " . htmlspecialchars($sql) . "</pre>"; exit;}// Вывод в случае успешного поискаwhile ($row = $result->fetch_assoc()) { echo "{$row['title']} ({$row['year']}) — {$row['author']}<br>";}Дополнительно создай базу данных с таблицей books и полями title, author, year. Убедись, что все подключается и работает.
Обнаружить SQL injection ты можешь, подставляя в строку поиска конструкцию '". Она передастся в параметре ?q= и без санитизации и фильтрации подставится в запрос. Если уязвимость есть, одна из кавычек закроет строковую константу и запрос приобретет такой вид:
SELECT title, author, year FROM books WHERE title LIKE ''"'Этот кривой запрос MySQL не сможет интерпретировать и вернет ошибку.

info
Два разных вида кавычек потому, что неизвестно, какие кавычки использовал программист. Из практики скажу, что при написании кода один и тот же программист в одном месте может поставить двойные, а в другом одинарные кавычки. Используя две разные кавычки, ты добьешься, чтобы появилась хотя бы одна «висячая», и увидишь ошибку.
Приложение вернуло сообщение об ошибке, из которого видно, что параметр ?q= подставляется в конструкцию LIKE . Твоя задача — отправить пейлоад, который будет синтаксически верным, чтобы MySQL не отбросил запрос как некорректный. Иначе никакого раскрытия данных не произойдет.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»
