前言
前面咱們學習瞭如何尋找,確認,利用SQL注入漏洞的技術,本篇文章我將介紹一些更高級的技術,避開過濾,繞開防護。有攻必有防,固然還要來探討一下SQL注入防護技巧。
目錄
第五節 避開過濾方法總結php
第六節 探討SQL注入防護技巧html
正文
正則表達式
Web應用爲了防護包括SQL注入在內的攻擊,經常使用輸入過濾器,這些過濾器能夠在應用的代碼中,也能夠經過外部實現,好比Web應用防火牆和入侵防護系統。避開過濾的方法是靈活的,本節我總結了一些經常使用的技巧。在咱們不知道過濾規則的時候能夠嘗試一下。
5.一、大小寫變種
這種技巧適用於關鍵字阻塞過濾器不聰明的時候,咱們能夠變換關鍵字字符串中字符的大小寫來避開過濾,由於使用不區分大小寫的方式處理SQL關鍵字。
例如:(下面的代碼就是一個簡單的關鍵字阻塞過濾器)sql
function waf($id1){ if(strstr($id1,'union')){ echo 'error:lllegal input'; return; } return $id1; }
這段代碼的缺陷就在strstr()函數是對大小寫敏感的,因此咱們能夠經過大小寫變種來繞過。
=
5.二、URL編碼
URL編碼用途普遍,能夠經過它繞過多種類型的輸入過濾器。數據庫
function waf($id1){ if(strstr($id1,' ') || strstr($id1,'/**/')){ echo 'error:lllegal input'; return; } return $id1; }
雙URL編碼有時候會起做用,若是Web應用屢次解碼,在最後一次解碼以前應用其輸入過濾器。
由於雙URL編碼,第一次解碼%2f%2a進入輸入過濾器,因此成功繞過了。固然這個使用前提是後面有一個URL解碼。
5.三、SQL註釋
不少開發人員認爲,將輸入限制爲單個就能夠限制SQL注入攻擊,因此他們每每就只是阻止各類空白符。編程
function waf($id1){ if(strstr($id1,' ')){ echo 'error:lllegal input'; return; } return $id1; }
可是內聯註釋不使用空格就能夠構造任意複雜的SQL語句。
5.四、空字節
一般的輸入過濾器都是在應用程序以外的代碼實現的。好比入侵檢測系統(IDS),這些系統通常是由原生編程語言開發而成,好比C++,爲何空字節能起做用呢,就是由於在原生變成語言中,根據字符串起始位置到第一個出現空字節的位置來肯定字符串長度。因此說空字節就有效的終止了字符串。
只須要在過濾器阻止的字符串前面提供一個採用URL編碼的空字節便可,例如:編程語言
%00' union select username,password from users where username='admin' --
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'
6.一、輸入驗證
輸入驗證是指要驗證全部應用程序接收到的輸入是否合法。
有兩中不一樣類型的輸入驗證方法:白名單和黑名單驗證
白名單驗證:好比id值,那麼咱們判斷它是否爲數字。
黑名單驗證:使用正則表達式禁止使用某些字符和字符串
應該儘可能使用白名單,對於沒法使用白名單的,使用黑名單提供局部限制。
6.二、編碼輸出
咱們除了要驗證應用程序收到的輸入之外,還要對數據進行編碼,這樣不只能夠防護SQL注入攻擊,還能防止出現其餘問題,好比XSS。
結束語
由於本人技術有限,因此對防護技巧了解並非深刻,但願有更好防護技巧的小夥伴能夠分享一下心得,我會將收到的技巧加入本文,提供給更多的小夥伴進行參考,謝謝了。
系列文章預告及導航
滲透攻防Web篇-SQL注入攻擊初級(狀態:已更新)
滲透攻防Web篇-SQL注入攻擊中級(狀態:已更新)
文章首鏈:http://bbs.ichunqiu.com/thread-10093-1-1.html
感謝您的閱讀,若是您學到了,請點贊(碼字不易)!
歡迎熱心園友補充!