Bug Bounty, Bug Hunting, Oracle, SQL-Injection

#19 Bug Bounty v.2 — Oracle. Union Based SQL — Injection

Здравствуйте, дорогие друзья.

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

Oracle

Как показано выше, сообщение об ошибке начинается с “ORA”, и это хороший признак того, что вы имеете дело с базой данных Oracle. Иногда вы не можете определить тип базы данных по сообщению об ошибке, в этом случае вам нужно вернуть версию базы данных из sql, как показано ниже:

● select banner from v$version

select banner from v$version

Обратите внимание, что, как и в PostgreSQL, когда вы выбираете столбец, он должен соответствовать типу первой инструкции select. Вы также можете использовать слово «null», если вы не знаете его тип. Еще одна вещь, на которую следует обратить внимание, это то, что при использовании оператора select вы должны указать таблицу, на приведенном выше рисунке была использована таблица по умолчанию “dual”.

Union Based SQL Injection

Как и в случае с MySQL и PostgreSQL, первым шагом является определение количества столбцов, используемых оператором select. Опять же, это можно сделать с помощью оператора “order by”, как показано ниже:

order by

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

Как показано выше, как только мы добрались до столбца номер 3, появилась ошибка, поэтому в инструкции select должно быть использовано только 2 столбца. Следующим шагом является получение списка таблиц, принадлежащих базе данных, как показано ниже:

union all select LISTAGG(table_name,’,’) within group (ORDER BYtable_name),null from all_tables where tablespace_name = ‘USERS’ –

union all select LISTAGG(table_name,',')

Если вы привыкли использовать MySQL или PostgreSQL, вы обычно используете таблицу “information_schema.tables” для получения списка таблиц, но oracle использует для этого таблицу “all_tables”. Вероятно, вы захотите выполнить фильтрацию по значению столбца “tablespace_name” “ПОЛЬЗОВАТЕЛИ”, иначе вы получите сотни таблиц по умолчанию, которые вам не нужны.

Также обратите внимание на функцию ”listagg()», которая аналогична функции group_concat() в MySQLs и используется для объединения нескольких строк в одну строку. При использовании функции listagg() функция вы также должны использовать оператор ‘within group()’, чтобы указать порядок следования результаты работы функции listagg.

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

union all select LISTAGG(column_name,’,’) within group (ORDER BY column_name),null from all_tab_columns where table_name = ‘EMPLOYEES’—

union all select LISTAGG(column_name,',')

В MySQL мы бы запросили таблицу “information_schema.columns”, чтобы получить список столбцов, принадлежащих таблице, но в oracle мы используем для этого таблицу “all_tab_columns”. Наконец, как только вы узнаете имена столбцов таблиц, вы сможете извлечь нужную информацию, используя стандартный sql-запрос, как показано ниже:

● Union all select email,phone_number from employees

Как вы могли заметить, Oracle SQL injection немного отличается от MySQL и PostgreSQL, но все равно они очень похожи. Единственное отличие заключается в синтаксисе нескольких элементов, но процесс остается тем же. Выясните имя целевой таблицы, получите столбцы таблиц и, наконец, извлеките конфиденциальную информацию.

Резюме

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

На этом все. Всем хорошего дня!

Цикл статей по Bug Bounty.