SQL注入高階

2021-07-25 15:14:56 字數 3231 閱讀 2079

前言前面我們學習了如何尋找,確認,利用sql注入漏洞的技術,本篇文章我將介紹一些更高階的技術,避開過濾,繞開防禦。有攻必有防,當然還要來**一下sql注入防禦技巧。

目錄

第五節 避開過濾方法總結

第六節 **sql注入防禦技巧

正文

web應用為了防禦包括sql注入在內的攻擊,常常使用輸入過濾器,這些過濾器可以在應用的**中,也可以通過外部實現,比如web應用防火牆和入侵防禦系統。避開過濾的方法是靈活的,本節我總結了一些常用的技巧。在我們不知道過濾規則的時候可以嘗試一下。

5.1、大小寫變種

這種技巧適用於關鍵字阻塞過濾器不聰明的時候,我們可以變換關鍵字字串中字元的大小寫來避開過濾,因為使用不區分大小寫的方式處理sql關鍵字。

例如:(下面的**就是乙個簡單的關鍵字阻塞過濾器)

mysql

12

3

4

5

6

7

function

waf($id1)

return

$id1;

}

這段**的缺陷就在strstr()函式是對大小寫敏感的,所以我們可以通過大小寫變種來繞過。

=5.2、url編碼

url編碼用途廣泛,可以通過它繞過多種型別的輸入過濾器。

mysql

12

3

4

5

6

7

function

waf($id1)

return

$id1;

}

雙url編碼有時候會起作用,如果web應用多次解碼,在最後一次解碼之前應用其輸入過濾器。

因為雙url編碼,第一次解碼%2f%2a進入輸入過濾器,所以成功繞過了。當然這個使用前提是後面有乙個url解碼。

5.3、sql注釋

很多開發人員認為,將輸入限制為單個就可以限制sql注入攻擊,所以他們往往就只是阻止各種空白符。

mysql

12

3

4

5

6

7

function

waf($id1)

return

$id1;

}

但是內聯注釋不使用空格就可以構造任意複雜的sql語句。

5.4、空位元組

通常的輸入過濾器都是在應用程式之外的**實現的。比如入侵檢測系統(ids),這些系統一般是由原生程式語言開發而成,比如c++,為什麼空位元組能起作用呢,就是因為在原生變成語言中,根據字串起始位置到第乙個出現空位元組的位置來確定字串長度。所以說空位元組就有效的終止了字串。

只需要在過濾器阻止的字串前面提供乙個採用url編碼的空位元組即可,例如:

mysql

1%00

' union select username,password from users where username='admin'

--5.5、二階sql注入

實際上到目前為止,你在網上大部分搜尋sql注入文章 基本都可以歸類到」一階(first-order)」sql注入中,因為這些例子涉及的事件均發生在單個http請求和響應中,如下所示:

(1) 攻擊者在http請求中提交某種經過構思的輸入。

(2) 應用處理輸入,導致攻擊者注入的sql查詢被執行。

(3) 如果可行的話,會在應用對請求的響應中向攻擊者返回查詢結果。

另一種不同的sql注入攻擊是」二階(second-order)」sql注入,這種攻擊的事件時序通常如下所示:

(1) 攻擊者在http請求中提交某種經過構思的輸入。

(2) 應用儲存該輸入(通常儲存在資料庫中)以便後面使用並響應請求。

(3) 攻擊者提交第二個(不同的)請求。

(4) 為處理第二個請求,應用會檢索已經儲存的輸入並處理它,從而導致攻擊者注入的sql查詢被執行。

(5) 如果可行的話,會在應用對第二個請求的響應中向攻擊者返回查詢結果。

從字面上來看二階sql注入對於新手很難理解,所以我來介紹乙個經典的例子幫助大家理解。這是乙個個人資訊應用程式,我們可以更新我們的使用者名稱,也可以檢視我們的個人資訊。

第二步檢視我們個人資訊時的sql語句:

mysql

1select

*

from

users

where

username

='$name'

查詢的語句所用到的變數name就是從資料庫提取到的我們的使用者名稱,所以我們可以先利用更新我們的使用者名稱功能插入語句進資料庫。這樣檢視我們個人資訊的時候就成功執行了我們的sql注入攻擊。

例如:我們在使用者名稱插入

[sql] 純文字檢視 複製**

那麼後面我們就執行了語句

1select *

from

users

where

username

='zusheng'

or'1'

='1'

6.1、輸入驗證

輸入驗證是指要驗證所有應用程式接收到的輸入是否合法。有兩中不同型別的輸入驗證方法:白名單和黑名單驗證

應該盡量使用白名單,對於無法使用白名單的,使用黑名單提供區域性限制。

6.2、編碼輸出

我們除了要驗證應用程式收到的輸入以外,還要對資料進行編碼,這樣不僅可以防禦sql注入攻擊,還能防止出現其他問題,比如xss。

結束語

因為本人技術有限,所以對防禦技巧了解並不是深入,希望有更好防禦技巧的小夥伴可以分享一下心得,我會將收到的技巧加入本文,提供給更多的小夥伴進行參考,謝謝了。

SQL注入高階

sql注入高階 1 時間注入攻擊 時間注入利用sleep 或者benchmark 等函式讓mysql的執行時間變長。時間盲注多餘if expr1,expr2,expr3 結合使用,此if語句的含義是 如果expr1是true,則if的返回值為expr2 否則返回的值為expr3 所以判斷資料庫名長度...

SQL注入原理高階篇 2

我們舉個例子,已知表admin中存在username欄位,首先,我們取第一條記錄,測試長度 先說明原理 如果top 1的username長度大於0,則條件成立 接著就是 1 2 3這樣測試下去,一直到條件不成立為止,比如 7成立,8不成立,就是len username 8 當然沒人會笨得從0,1,2...

SQL注入漏洞接觸 高階篇

第一節 利用系統表注入sqlserver資料庫 sqlserver是乙個功能強大的資料庫系統,與作業系統也有緊密的聯絡,這給開發者帶來了很大的方便,但另一方面,也為注入者提供了乙個跳板,我們先來看看幾個具體的例子 分號 在sqlserver中表示隔開前後兩句語句,表示後面的語句為注釋,所以,這句語句...