Содержание статьи
Уязвимость типа 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 не отбросил запрос как некорректный. Иначе никакого раскрытия данных не произойдет.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
