Я тестирую приложение на основе оракула и обнаружил следующий код:
Query = "ВЫБРАТЬ имя из сотрудников, ГДЕ id = '" + PKID + "';"
то есть строка запроса содержит кавычки вокруг значения PKID, которое получено прямо из URL.
Очевидно, это классическая SQL-инъекция, ожидающая выполнения ... за исключением того, что приложение находится за CA SiteMinder, который блокирует передачу любого URL-адреса с одинарной кавычкой (в любой форме) в приложение.
Есть ли способ вырваться из строки и ввести SQL без использования одинарных кавычек?
Редактировать: Извините, я должен был быть более ясным - я понимаю, как это должно быть написано, но мне нужно убедить людей, что это эксплуатируемая проблема. На данный момент, потому что он находится за siteminder, который блокирует одинарные кавычки, так что это будет исправление с низким приоритетом.
источник
Ответы:
Да, можно выполнить атаку SQL-инъекцией без указания кавычек в параметре.
Это можно сделать с помощью эксплойта для обработки чисел и / или дат. На уровне сеанса вы можете указать формат даты или числа. Управляя этим, вы можете вводить с любым персонажем.
По умолчанию в Великобритании и США запятая используется для обозначения разделителя тысяч в числах, а точка с запятой для десятичной точки. Вы можете изменить эти значения по умолчанию, выполнив:
Это означает, что «P» теперь является десятичной точкой, а «Z» - разделителем тысяч. Так:
Это число 0,01. Однако, если вы создадите функцию P01, ссылка на объект будет выбрана до преобразования числа. Это позволяет вам выполнять функции в базе данных, предоставляя вам дополнительные полномочия, а именно:
Создайте базовую функцию «get by id»:
Также создайте функцию P01, которая делает что-то нежелательное (в данном случае просто создайте таблицу, но вы поняли):
И мы готовы идти:
Кавычек нигде нет, но нам все же удалось выполнить «скрытую» функцию P01 и создать таблицу
t
!Хотя это может быть трудно сделать на практике (и может потребовать некоторых внутренних знаний / помощи), это показывает, что вы можете вводить SQL без необходимости заключать в кавычки. Изменение
nls_date_format
может позволить сделать подобные вещи.Оригинальные результаты для чисел были сделаны Дэвидом Личфилдом, и вы можете прочитать его статью здесь . Вы можете найти обсуждение Тома Кайта о том, как даты могут быть использованы здесь .
источник
Возможно, вы могли бы перегрузить тип данных, который вы используете, что приведет к сбою этого оператора. Тогда то, что последует, может быть запущено.
Возможно, отправка его в виде байтового массива в Юникоде сделает свое дело и выведет вас из этого оператора в другой.
Если открыта дыра, ею будут злоупотреблять. А блокировать все строки одной кавычкой не очень хорошая идея, так как люди с фамилией «О'Брайан» не могут быть вашими клиентами (среди прочих).
источник
Попробуйте использовать переменную связывания. Вы можете объявить его как число, и это должно предотвратить повреждение SQL-кода.
ДОПОЛНЕНИЕ: переменные связывания также повышают производительность и масштабируемость, поскольку план запроса компилируется и сохраняется для повторного использования. Просто что-то еще, чтобы добавить к вашему аргументу. :)
источник