查明sql注入漏洞


我的整理:mysql

1.注入字符串數據sql

    步驟:數據庫

        a.提交一個單引號做爲目標查詢的數據,觀察是否會形成錯誤,或結果是否與原來結果不一樣。瀏覽器

        b.若是發現錯誤或其餘異常行爲,同時提交兩個單引號,看會出現什麼狀況。數據庫使用兩個單引號做爲轉義序列,表示一個緣由單引號,所以這個序列解釋成引用字符串中的數據,而不是結束字符串的終止符。若是這個輸入致使錯誤或異常行爲小時,則應用程序可能易於收到sql注入***服務器

        c.爲進一步覈實漏洞,可使用sql鏈接符創建一個等同於「良性」輸入的字符串,若是應用程序以與處理對應「良性」輸入相同的方式處理專門設計的輸入,那麼可能易受到***。cookie

            每種數據庫鏈接方式各不相同,如:oracle

                oracle: '||'FOOide

                ms-sql:  '+'FOOpost

                mysql: ' 'FOO 引號之間存在空格測試


2.注入數字數據:

    若是sql查詢合併用戶提交的數字數據,應用程序仍然會將它包含在單引號之中,做爲字符串數據進行處理,能夠按照上面字符串的測試步驟處理。有時候會直接將數字數據傳送到數據庫中,並不放在單引號中,使用上面方法沒法檢測到漏洞,能夠按照下面測試步驟。

    步驟:

        a.嘗試輸入一個結果等於原始數字值的簡單數學表達式。如,若是原始值是2,能夠嘗試提交1+1或3-1,若是有相同相應,則代表易受到***。

        b.若是證明被修改的數據會對應用程序形成明顯影響,則前面描述的測試方式最爲可靠。可是,若是可以在數字化參數中插入任意輸入,但程序行爲沒有發生改變,前面的檢查方法就沒法發現漏洞。

        c.若是第一個測試方法取得成功,能夠利用更加複雜、使用特殊sql關鍵字和語法的表達式進一步得到與漏洞有關 的證據。ASCII命令就是一個典型的實例,它返回被提交字符的數字化ASCII代碼,。例如,A的ASCII值是65,在sql中,如下表達式等於2:

            67-ASCII('A')

        d.若是單引號被過濾掉,那麼前面的測試方法就沒有用。可是,這時能夠利用這樣一個事實:即在必要時,數據庫會隱含的將數字數據轉化成字符串數據。例如,由於字符 1 的ASCII值爲49,在sql語句中,如下表達式等於2:

             51-ASCII(1)

    

    特別注意:

      在查探應用程序是否 存在sql注入類缺陷時,咱們經常會犯一個錯誤,即忘記某些字符在http請求中具備特殊含義。若是但願在***有效載荷中插入這些字符,必須謹慎的對他們進行url編碼,確保應用程序按照預料的方式解釋他們,特別是如下字符:

       - &和=用於鏈接名/值對,創建查詢字符串和post數據塊。應當分別使用%26和%3d對他們進行編碼。

       - 查詢字符串中不容許使用空格,若是在其中提交空格,整個字符串會當即終止。必須使用 + 或 %20 對其編碼。

       - 因爲 + 用於編碼空格,若是想在字符串中使用 + ,必須使用 %2b 對其編碼。所以,前面的數字化實例中,1+1應以 1%2b1 的形式提交。

       - 分號用於分隔cookie字段,必須使用 %3b對其編碼。

    不管是經過哦攔截代碼服務器直接從瀏覽器中編輯參數值,或是使用其餘方法進行編輯,都必須使用這些編碼方法。若是沒有對相關字符進行編碼,那麼整個請求可能會無效,或提交預期以外的數據。


3.注入查詢結構:

    若是用戶提交的數據被插入sql查詢結構,而不是查詢中的數據項,這時實施sql注入***只須要直接應用有效的sql語法,而不須要進行任何「轉義」。

    sql查詢結構中最經常使用的注入點是 order by子句。   

    步驟:

        a.記下任何可能控制應用程序返回的結果的順序或其中的字段類型的參數。

        b.提供一系列在參數值中提交數字值的請求,從數字 1 開始,而後逐個請求遞增。

            - 若是更改輸入中的數字會影響結果的順序,則說明輸入可能被插入到order by子句中。

            - 若是提交輸入 1 生成一組結果,其中一個列每一行都包含一個 1 ,則說明輸入要可能被插入到查詢返回的列的名稱中,如:

                SELECT 1,title,year from books where publisher='wilery'

        註解:

        在order by子句中實施sql注入與其餘注入情形有很大區別,此時,數據中不會接受查詢中的union、where、or、and關鍵字。一般實施注入***須要***者指定一個嵌套查詢來替代參數,如用(SELECT 1 WHREE<<condition>> or  1/0=0)替代列名稱。

相關文章
相關標籤/搜索