Методика проведения Error-based SQL-InjectionДовольно часто SQL-инъекцию можно обнаружить по сообщению об ошибке, выдаваемой базой данных, и не всегда использование уязвимости в подобных случаях возможно с применением классической техники эксплуатации (union). До некоторого времени в таких случаях приходилось пользоваться унылыми и медленными способами посимвольного перебора. Но зачем использовать неэффективный подход, когда возвращается ошибка СУБД?! Ведь ее не менее удобно, чем при классической эксплуатации SQL-инъекций, можно приспособить к построчному чтению данных из базы или файловой системы. Глупо отказываться от такой возможности. Именно о способах, которые позволяют использовать сообщение об ошибке базы данных в качестве контейнера полезным данным, далее, и пойдет речь в этой статье. Error-based blind SQL Injection в MySQLВ конце прошлого года Qwazar "достал" универсальную технику эксплуатации слепых SQL-инъекций в приложениях, функционирующих под управлением базы данных MySQL. Надо сказать, достаточно непростая и непрозрачная техника. Пример использования универсального подхода для MySQL >= 5.0:
В случае если имя таблицы неизвестно (может быть справедливо для MySQL < 5.0), то приходиться использовать более сложные запросы, которые полностью завязаны на функции rand(). Это означает, что далеко не всегда удастся получить желаемые данные в один http-запрос.
Пример практического использования для восстановления структуры базы данных:
Способ Qwazar работает на всех версиях MySQL, включая и версию 3.x, которую по-прежнему еще можно встретить на просторах глобальной сети. Однако учитывая, что подзапросы появились, начиная только с MySQL версии 4.1, то это сильно уменьшает возможность применения указанного способа на более ранних версиях мускуля. Универсальные техники для других баз данныхНе так давно хакером, скрывающимся под псевдонимом TinKode, были успешно осуществлены атаки с использованием уязвимости blind SQL-Injection на Web-сервера в домене army.mil. При проведении атак на Web-приложения, работающие под управлением MSSQL 2000/2005, хакер продемонстрировал достаточно интересную технику получения данных из баз данных. Используемый способ TinKode заключается в том, что MSSQL ругается при некорректном переопределении типов данных, что в свою очередь позволяет "протащить" полезную нагрузку в возвращаемом сообщении об ошибке:
Следовательно, при эксплуатации слепой SQL-инъекции, с использованием данного подхода становиться возможным, достаточно быстро получать нужные данные из Microsoft SQL Server. Например, восстановить структуру базы данных можно следующим образом:
Вспоминая о том, что Sybase ASE, также как MS SQL Server, базируется на Transact-SQL, можно смело предположить, что приведенная техника выше распространяется также и на эту СУБД. Проверка полностью подтвердила это предположение. Все приводимые примеры для MSSQL в полном объеме распространяются и на базу данных Sybase.
Аналогичные махинации с приведением типов были повторены и в отношении мускуля. Проведенные эксперименты с ним показали, что при некорректном переопределении типов MySQL возвращает лишь не критическое уведомление об ошибке, которое не позволяет достигнуть аналогичных целей при эксплуатации blind SQL Injection. А вот эксперименты с PostgreSQL удачно "выстрелили" в этом контексте:
Для получения полезных данных при эксплуатации SQL-инъекции содержащейся в приложении под управлением постгреса, можно использовать следующие запросы:
В недрах ораклятиныОбладая интересной подборкой быстрых способов эксплуатации слепых SQL-инъекций, мне недоставало аналогичных техник под не менее распространенную СУБД Oracle. Это побудило меня провести небольшой ресерч, направленный на поиск подобных техник в указанной базе данных. Убедившись в том, что все известные способы эксплуатации error-based blind SQL Injection не работают в среде оракла, мое внимание привлекли функции взаимодействия с форматом XML. Немного поковырявшись в них, была обнаружена функция XMLType(), которая возвращает в сообщении об ошибке первый символ из запрашиваемых данных (LPX-00XXX):
Уже хлеб. Используя функцию substr() становиться возможным посимвольное чтение требуемой информации. Например, можно достаточно быстро определить версию установленной базы данных:
Считывание одного символа в один запрос при эксплуатации слепых SQL-инъекций – это здорово, но было бы глупо останавливаться на достигнутом, и мы пойдем несколько дальше. Продолжая копать функцию XMLType() мне удалось найти аналогичный способ проброса данных в сообщении об ошибке, который существует и в других базах данных:
Вроде бы все замечательно, но есть несколько подводных камней. Первая загвоздка заключается в том, что в оракле не происходит автоматическое приведение типов. Поэтому такой запрос выдаст ошибку:
Второй нюанс заключается в том, что у ораклятины отсутствует limit и offset, что не позволяет простым путем осуществлять построчное чтение данных. И третья проблема связана с тем, что функция XMLType() при обработке ошибки обрезает возвращаемые данные после некоторых символов. Например, когда в строке встречается пробел или символ at ("@") и др. Но все можно разрулить ;) Для решения проблемы с приведением типов может использоваться функция upper(). Организовать построчное чтение данных, можно с использованием следующей нехитрой конструкции:
Ну, а для того, чтобы избежать потерю возвращаемых данных, может использоваться hex-кодирование. Опционально, можно также избавиться от кавычек в отправляемом запросе используя числовое представление символов (ascii), что в перспективе позволит обходить фильтрацию при обработке поступающих данных в приложение. Таким образом, конечный запрос примет следующий вид:
Используя данную технику за один http-запрос можно считывать до 214 байт в приложении (107 символов при использовании hex-кодирования), которое функционирует под управлением СУБД Oracle >=9.0 и возвращает сообщение об ошибке:
Для декодирования получаемых данных из приложения при эксплуатации SQL-инъекции описанным способом, в том числе, может использоваться стандартная функция оракла:
Подводя итогиИтого, мы получаем универсальные и быстрые техники эксплуатации error-based blind SQL Injection для следующих СУБД: PostgreSQL, MSSQL, Sybase, а также для MySQL версии >=4.1 и Oracle версии >=9.0. Для идентификации используемой версии базы данных в один http-запрос, могут применяться следующие конструкции:
ЗанавесПорой кажется, что все уже придумано до нас и нет смысла искать что-то новое. Как ты, наверное, заметил на примере развития направления по эксплуатации слепых SQL-инъекций – это не так. Всегда есть место для новых исследований. Удачных тебе хаков, и до новых встреч на страницах журнала X! WARNINGВнимание! Информация представлена исключительно с целью ознакомления! Ни автор, ни редакция за твои действия ответственности не несет! |