前言
前面我們學習了如何尋找,確認,利用SQL注入漏洞的技術,本篇文章我將介紹一些更高級的技術,避開過濾,繞開防御。有攻必有防,當然還要來探討一下SQL注入防御技巧。
目錄
第五節 避開過濾方法總結
- 5.1、大小寫變種
- 5.2、URL編碼
- 5.3、SQL注釋
- 5.4、空字節
- 5.5、二階SQL注入
第六節 探討SQL注入防御技巧
- 6.1、輸入驗證
- 6.2、編碼輸出
正文
- 第五節 避開過濾方法總結
Web應用為了防御包括SQL注入在內的攻擊,常常使用輸入過濾器,這些過濾器可以在應用的代碼中,也可以通過外部實現,比如Web應用防火牆和入侵防御系統。避開過濾的方法是靈活的,本節我總結了一些常用的技巧。在我們不知道過濾規則的時候可以嘗試一下。
5.1、大小寫變種
這種技巧適用於關鍵字阻塞過濾器不聰明的時候,我們可以變換關鍵字字符串中字符的大小寫來避開過濾,因為使用不區分大小寫的方式處理SQL關鍵字。
例如:(下面的代碼就是一個簡單的關鍵字阻塞過濾器)
function waf($id1){ if(strstr($id1,'union')){ echo 'error:lllegal input'; return; } return $id1; }
這段代碼的缺陷就在strstr()函數是對大小寫敏感的,所以我們可以通過大小寫變種來繞過。
=
5.2、URL編碼
URL編碼用途廣泛,可以通過它繞過多種類型的輸入過濾器。
function waf($id1){ if(strstr($id1,' ') || strstr($id1,'/**/')){ echo 'error:lllegal input'; return; } return $id1; }
雙URL編碼有時候會起作用,如果Web應用多次解碼,在最后一次解碼之前應用其輸入過濾器。
因為雙URL編碼,第一次解碼%2f%2a進入輸入過濾器,所以成功繞過了。當然這個使用前提是后面有一個URL解碼。
5.3、SQL注釋
很多開發人員認為,將輸入限制為單個就可以限制SQL注入攻擊,所以他們往往就只是阻止各種空白符。
function waf($id1){ if(strstr($id1,' ')){ echo 'error:lllegal input'; return; } return $id1; }
但是內聯注釋不使用空格就可以構造任意復雜的SQL語句。
5.4、空字節
通常的輸入過濾器都是在應用程序之外的代碼實現的。比如入侵檢測系統(IDS),這些系統一般是由原生編程語言開發而成,比如C++,為什么空字節能起作用呢,就是因為在原生變成語言中,根據字符串起始位置到第一個出現空字節的位置來確定字符串長度。所以說空字節就有效的終止了字符串。
只需要在過濾器阻止的字符串前面提供一個采用URL編碼的空字節即可,例如:
%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語句:
select * from users where username = '$name'
查詢的語句所用到的變量name就是從數據庫提取到的我們的用戶名,所以我們可以先利用更新我們的用戶名功能插入語句進數據庫。
這樣查看我們個人信息的時候就成功執行了我們的SQL注入攻擊。
例如:我們在用戶名插入
那么后面我們就執行了語句
select * from users where username = 'zusheng' or '1'='1'
- 第六節 探討SQL注入防御技巧
6.1、輸入驗證
輸入驗證是指要驗證所有應用程序接收到的輸入是否合法。
有兩中不同類型的輸入驗證方法:白名單和黑名單驗證
白名單驗證:比如id值,那么我們判斷它是否為數字。
黑名單驗證:使用正則表達式禁止使用某些字符和字符串
應該盡量使用白名單,對於無法使用白名單的,使用黑名單提供局部限制。
6.2、編碼輸出
我們除了要驗證應用程序收到的輸入以外,還要對數據進行編碼,這樣不僅可以防御SQL注入攻擊,還能防止出現其他問題,比如XSS。
結束語
因為本人技術有限,所以對防御技巧了解並不是深入,希望有更好防御技巧的小伙伴可以分享一下心得,我會將收到的技巧加入本文,提供給更多的小伙伴進行參考,謝謝了。
系列文章預告及導航
滲透攻防Web篇-SQL注入攻擊初級(狀態:已更新)
- 第一節 注入攻擊原理及自己編寫注入點
- 第二節 尋找及確認SQL注入
滲透攻防Web篇-SQL注入攻擊中級(狀態:已更新)
- 第三節 利用SQL注入
- 第四節 SQL盲注利用
文章首鏈:http://bbs.ichunqiu.com/thread-10093-1-1.html
感謝您的閱讀,如果您學到了,請點贊(碼字不易)!
歡迎熱心園友補充!