前言前面我們學習了如何尋找,確認,利用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請求和響應中,如下所示:從字面上來看二階sql注入對於新手很難理解,所以我來介紹乙個經典的例子幫助大家理解。這是乙個個人資訊應用程式,我們可以更新我們的使用者名稱,也可以檢視我們的個人資訊。(1) 攻擊者在http請求中提交某種經過構思的輸入。
(2) 應用處理輸入,導致攻擊者注入的sql查詢被執行。
(3) 如果可行的話,會在應用對請求的響應中向攻擊者返回查詢結果。
另一種不同的sql注入攻擊是」二階(second-order)」sql注入,這種攻擊的事件時序通常如下所示:
(1) 攻擊者在http請求中提交某種經過構思的輸入。
(2) 應用儲存該輸入(通常儲存在資料庫中)以便後面使用並響應請求。
(3) 攻擊者提交第二個(不同的)請求。
(4) 為處理第二個請求,應用會檢索已經儲存的輸入並處理它,從而導致攻擊者注入的sql查詢被執行。
(5) 如果可行的話,會在應用對第二個請求的響應中向攻擊者返回查詢結果。
第二步檢視我們個人資訊時的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中表示隔開前後兩句語句,表示後面的語句為注釋,所以,這句語句...