Безопасность

Учебное пособие по слепым методам внедрения SQL

Учебное пособие по слепым методам внедрения SQL

Что такое SQL-инъекция?

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

SQL-инъекция происходит из-за плохой очистки пользовательского ввода. Если вы вводите данные от пользователя на каком-либо языке программирования (PHP, ASP.NET) и передать его непосредственно в базу данных сервера без применения какого-либо фильтра на входе, это может привести к уязвимости SQL Injection.

Например, следующий PHP-код уязвим для атаки SQL Injection, поскольку он напрямую передает пользовательский ввод в базу данных. Злоумышленник может создать собственный вредоносный запрос к базе данных для извлечения данных из базы данных.

// Пользовательский ввод хранится в переменной id
$ id = $ _GET ['идентификатор'];
// Пользовательский ввод напрямую выполняется в базе данных
$ getid = "ВЫБЕРИТЕ first_name, last_name ОТ пользователей WHERE user_id = '$ id'";
// В случае ошибки или успеха результаты возвращаются пользователю
$ result = mysql_query ($ getid) или die ('
' . mysql_error () . '
');
$ num = mysql_numrows ($ результат);

С другой стороны, приводится пример защищенного кода такого кода для взаимодействия с базой данных. Он принимает вводимые пользователем данные и фильтрует из них любые вредоносные символы, а затем передает их в базу данных.

$ id = $ _GET ['идентификатор'];
$ id = полосы косой черты ($ id);
$ id = mysql_real_escape_string ($ id);

Нормальная и слепая инъекция SQL

Обычное внедрение SQL

При обычном внедрении SQL, если злоумышленник пытается ввести одинарную кавычку (') в качестве входных данных, когда эта одинарная кавычка выполняется в базе данных, база данных отвечает с ошибкой. Ошибка выводится в браузере злоумышленника.

Код, ответственный за эту ошибку:

// если база данных отвечает ошибкой, выполняется функция «or die ()»
распечатать ошибку
$ result = mysql_query ($ getid) или die ('
' . mysql_error () . '
');

При обычном внедрении SQL злоумышленник может видеть результаты ошибки, ее легко идентифицировать и использовать.

Слепое внедрение SQL

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

Бэкэнд-код, отвечающий за это, приведен ниже

$ результат = mysql_query ($ getid); // Удалено 'or die' для подавления ошибок mysql

При слепом внедрении SQL злоумышленник не может видеть полные результаты, поэтому этот тип SQLi трудно идентифицировать и использовать, но он имеет тот же уровень риска, что и обычный SQLi.

Методы обнаружения слепой инъекции SQL

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

Обнаружение на основе ИСТИНА и ЛОЖЬ

Одной из характеристик баз данных, включая MySQL, является различное поведение операторов True и False. Даже если база данных не показывает никаких ошибок, мы можем решить, используя инструкции True и False. Рассмотрим следующий сценарий,

Следующая страница уязвима для слепой SQL-инъекции, при условии, что истинный оператор отобразит все записи в базе данных

1 'или 1 = 1 #

Предоставление ложного запроса в качестве входных данных не будет отображать никаких данных.

1 'или 1 = 2 #

Даже на веб-странице нет ошибок, разница между двумя страницами говорит о том, что наши запросы успешно выполняются в базе данных.

Обнаружение на основе ВРЕМЕНИ

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

1 'И спать (15) #

Есть еще одна трудоемкая функция «ЭТАЛОН», которую можно использовать для задержки ответа базы данных

1 'И ЭТАЛОН (10000000, SHA1 (1337)) #

Вышеупомянутая строка выполнит функцию SHA1 () 10000000 раз в базе данных, что добавит значительную задержку в ответе.

Слепое внедрение SQL на основе времени в другие базы данных

MS SQL: ID = 1; ожидание задержки '0: 0: 10'-

ORACLE SQL: И [СЛУЧАЙНОЕ] = DBMS_PIPE.RECEIVE_MESSAGE ('[RANDSTR]', [ВРЕМЯ СНА])

PostgreSQL: И [СЛУЧАЙНОЕ ЧИСЛО] = (ВЫБРАТЬ [СЛУЧАЙНОЕ] ИЗ PG_SLEEP ([ВРЕМЯ СНА]))

SQLite: И [RANDNUM] = LIKE ('ABCDEFG', UPPER (HEX (RANDOMBLOB ([SLEEPTIME] 00000000/2))))

Извлечение информации из базы данных

Первым шагом при извлечении базы данных является определение номеров столбцов в базе данных. Затем попробуйте найти уязвимые столбцы для извлечения дополнительных данных.

Слепое внедрение SQL по-разному ведет себя с разными номерами столбцов в запросе «по порядку».

1 'заказ на 1 #

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

1 'заказ на 10000 #

Ответ базы данных отличается от предыдущего. Теперь попробуйте с 2 столбцами.

Оператор сработал, это означает, что в базе данных 2 или более столбца. Теперь попробуйте с 3 столбцами.

1 'заказ по 3 #

База данных не отправила никакого ответа, это означает, что в базе данных только 2 столбца. Теперь мы попробуем выгрузить список таблиц в базе данных, для этого воспользуемся следующим запросом

1 'объединить все выберите 1, group_concat (table_name) из information_schema.
таблицы, где table_schema = database () #

В серверной базе данных есть две таблицы «гостевая книга и пользователи». Таблица «пользователи» может содержать имена пользователей и пароли. Чтобы извлечь имена столбцов из таблицы, вставьте следующий запрос.

1 'объединить все выберите 1, group_concat (имя_столбца) из information_schema.
столбцы, где table_schema = database () #

Теперь мы извлекли имена столбцов, включая столбцы пользователя и пароля. В этих столбцах хранятся имена пользователей и пароли клиентов.

Теперь попробуем извлечь данные с помощью следующего запроса

1 'объединить все выберите 1, group_concat (пользователь, пароль) от пользователей #

Вот как вы можете использовать слепое внедрение SQL-кода, не полагаясь на ошибки. Выходные пароли большую часть времени хешируются, и их можно расшифровать с помощью таких инструментов, как John The Ripper или Hashcat.

Заключение:

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

Установите последнюю версию эмулятора Dolphin для Gamecube и Wii в Linux
Эмулятор Dolphin позволяет вам играть в выбранные вами игры Gamecube и Wii на персональных компьютерах (ПК) Linux. Являясь свободно доступным игровым...
Как использовать чит-движок GameConqueror в Linux
В статье содержится руководство по использованию чит-движка GameConqueror в Linux. Многие пользователи, играющие в игры на Windows, часто используют п...
Лучшие эмуляторы игровой консоли для Linux
В этой статье будет перечислено популярное программное обеспечение для эмуляции игровых консолей, доступное для Linux. Эмуляция - это уровень совмести...