Се­год­ня я рас­ска­жу, как хакеры выкачи­вают огромные базы дан­ных, экс­плу­ати­руя сооб­щения об ошиб­ках. На кон­крет­ных при­мерах ты уви­дишь, как най­ти error-based SQL injection и как ее экс­плу­ати­ровать. Поп­робу­ешь раз­ные тех­ники, а в кон­це прев­ратим time-based в error-based при помощи ошиб­ки кон­фигура­ции.

Уяз­вимость типа error-based SQL injection воз­ника­ет, ког­да ты можешь выз­вать ошиб­ку в SQL-зап­росе к базе дан­ных при­ложе­ния. Сущес­тву­ет нес­коль­ко вари­антов:

  • Веб‑при­ложе­ние выводит сооб­щение об ошиб­ке в интерфейс — наибо­лее прос­той и быс­трый путь. Ты видишь под­робное опи­сание ошиб­ки и чет­ко понима­ешь, как будет выг­лядеть зап­рос. Дан­ные выводят­ся пря­мо в интерфейс при­ложе­ния внут­ри сооб­щения об ошиб­ке. Поч­ти как при union-инъ­екции.
  • Скры­тая error-based-инъ­екция — сооб­щение об ошиб­ке неин­форма­тив­ное или вооб­ще отсутс­тву­ет. Если сооб­щения нет вооб­ще, твоя задача — отсле­дить изме­нения в отве­тах сер­вера. Это может быть раз­ная дли­на отве­тов или раз­ное вре­мя заг­рузки стра­ницы. Этот тип инъ­екции похож на boolean-based или time-based.

www

Для боль­шинс­тва при­меров буду исполь­зовать собс­твен­ную лабу. Пол­ный архив с лабой ска­чивай из моего GitHub или Telegram-канала. Здесь при­веду исходные коды веб‑про­екта, что­бы ты мог уви­деть ошиб­ки, которые при­водят к воз­никно­вению инъ­екции.

 

Поиск error-based SQL injection

Ес­ли ска­чал мой архив с лабой, запус­ти коман­дой docker compose up --build -d. Если нет, соз­дай 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, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии