Что такое 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.