【滲透攻防Web篇】SQL注入攻擊高級

前言

前面咱們學習瞭如何尋找,確認,利用SQL注入漏洞的技術,本篇文章我將介紹一些更高級的技術,避開過濾,繞開防護。有攻必有防,固然還要來探討一下SQL注入防護技巧。

目錄


第五節 避開過濾方法總結php

  • 5.一、大小寫變種
  • 5.二、URL編碼
  • 5.三、SQL註釋
  • 5.四、空字節
  • 5.五、二階SQL注入

第六節 探討SQL注入防護技巧html

  • 6.一、輸入驗證
  • 6.二、編碼輸出






正文

正則表達式

  • 第五節 避開過濾方法總結


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注入攻擊。

例如:咱們在用戶名插入編碼

[SQL]  純文本查看 複製代碼
zusheng' or  '1'='1


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

select * from users where username = 'zusheng' or '1'='1'



  • 第六節 探討SQL注入防護技巧


6.一、輸入驗證

輸入驗證是指要驗證全部應用程序接收到的輸入是否合法。


有兩中不一樣類型的輸入驗證方法:白名單和黑名單驗證


白名單驗證:好比id值,那麼咱們判斷它是否爲數字。


黑名單驗證:使用正則表達式禁止使用某些字符和字符串


應該儘可能使用白名單,對於沒法使用白名單的,使用黑名單提供局部限制。


6.二、編碼輸出

咱們除了要驗證應用程序收到的輸入之外,還要對數據進行編碼,這樣不只能夠防護SQL注入攻擊,還能防止出現其餘問題,好比XSS。






結束語

由於本人技術有限,因此對防護技巧了解並非深刻,但願有更好防護技巧的小夥伴能夠分享一下心得,我會將收到的技巧加入本文,提供給更多的小夥伴進行參考,謝謝了。


系列文章預告及導航

滲透攻防Web篇-SQL注入攻擊初級(狀態:已更新)

  • 第一節 注入攻擊原理及本身編寫注入點
  • 第二節 尋找及確認SQL注入

滲透攻防Web篇-SQL注入攻擊中級(狀態:已更新)

相關文章
相關標籤/搜索