PLSQL Language Referenc-PL/SQL動態SQL-SQL隱碼攻擊-SQL隱碼攻擊技術-語句修改

LuiseDalian發表於2014-03-28

SQL注入

SQL注入是在SQL語句中對使用客戶端提供資料的應用程式的一種惡意的探測,

目的是獲取對資料庫的非授權的訪問來檢視或操縱限制的資料。

--HR方案下建立SQL注入練習環境

DROP TABLE secret_records;

CREATE TABLE secret_records

(

    user_name     VARCHAR2(9),

    service_type VARCHAR2(12),

    value          VARCHAR2(30),

    date_created DATE

);

 

INSERT INTO secret_records VALUES ('Andy', 'Waiter', 'Serve dinner at Cafe Pete', SYSDATE);

INSERT INTO secret_records VALUES ('Chuck', 'Merger', 'Buy company XYZ', SYSDATE);

SQL注入技術

SQL注入技術只利用了一個缺陷:輸入的字串沒有進行有效的驗證,並且被連線到動態SQL語句中。

語句修改

語句修改意味著故意修改動態SQL語句,這樣語句就可以以一種開發者非計劃中的方式執行。

通常會通過修改where子句、select子句、插入union all子句來獲得未授權的資料。

典型例子是通過使where子句始終為真為越過口令驗證。

-- 11g12_07_09.prc 建立一個容易受語句修改攻擊的儲存過程

CREATE OR REPLACE PROCEDURE get_record (user_name IN VARCHAR2, service_type IN VARCHAR2, rec OUT VARCHAR2)

IS

    query VARCHAR2(4000);

BEGIN

  -- 下面的語句容易受SQL修改的攻擊,因為它使用連線來建立where子句

    query := 'SELECT value FROM secret_records WHERE user_name='''

            || user_name

            || ''' AND service_type='''

            || service_type

            || '''';

    DBMS_OUTPUT.PUT_LINE('查詢: ' || query);

    EXECUTE IMMEDIATE query INTO rec ;

    DBMS_OUTPUT.PUT_LINE('記錄: ' || rec );

END;

 

-- 11g12_07_09.tst

DECLARE   

    record_value VARCHAR2(4000);   

BEGIN

    -- 沒用使用SQL注入

    get_record('Andy', 'Waiter', record_value);   

    -- 使用SQL注入

    get_record('Anybody '' OR service_type=''Merger''--', 'Anything', record_value);

   

END;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1131205/,如需轉載,請註明出處,否則將追究法律責任。

相關文章