9-Web安全——SQL注入WAF繞過之select及union過濾

 

目錄

1. select及union過濾繞過

2. 使用URL編碼繞過


 

 

1. select及union過濾繞過

 

真實的注入環境中一般無法通過網站的源代碼進行安全審計的,那麼在注入過程中我們就需要使用常見的SQL注入繞過技巧來幫助我們進行繞過WAF。

 

首先需要判斷網頁的注入類型,輸入參數?id=1%0Aand%0A1=2,測試URL爲:

http://www.sqli.com/Less-27/?id=1%0Aand%0A1=2

 

頁面返回的結果如下:

當我們輸入id=1 and 1=2時,頁面還是正常返回,說明這是一個字符型注入。

 

 

然後判斷字符型注入的閉合方式,在前面的學習中說過,如果頁面是字符型注入的話,需要考慮以下幾種情況:

  1. 單引號閉合需要在後面增加一個單引號即可
  2. 雙引號閉合需要在後面注入語句後面增加一個雙引號
  3. ('')單引號加括號這種需要多加一個or ('')=('1
  4. ("")雙引號加括號這種需要多加一個or ("")=("1

 

直接輸入id=1',判斷注入類型:

從mysql報錯信息來看,Less-27是使用的“ ’ ”單引號閉合的,紅色部分代表我們輸入的參數,藍色的單引號代表後臺使用單引號來閉合的。

 

 

輸入參數id=1''進行閉合:

頁面返回正常,除了以上這種方式,輸入id=1'%0Aor%0A'1'='1這種方式同樣也能閉合成功。

 

 

接下來判斷列數,前面我們說過判斷列數方法可以通過group by或order by語句,還有union select語句來做到。

 

 

在當前web頁面匯使用group by或order by無法看到任何報錯信息,因此這裏就只能使用union select語句了:

id=1'%0Aunion%0Aselect%0A1,2,3,4%0Aor%0A'1'='1

後臺把union select關鍵字過濾掉了。

 

 

回憶一下之前學過的繞過方式:使用大小寫和複寫單詞,構造sql注入語句如下:

?id=1'%0AUUNIONNION%0ASSELECTELECT%0A1,2,3,4%0Aor%0A'1'='1

頁面返回了數據庫報錯信息,說明select和union成功繞過WAF,使用這種方式同樣也能繞過waf:

?id=1'%0AUnioN%0ASeLeCt%0A1,2,3,4%0Aor%0A'1'='1

 

確定了注入點,主任類型,顯示位後,就可以獲取當前數據庫,和數據庫下所有表名,列名,以及用戶名和密碼,這裏就不再演示了,交給你們去完成(其實我就是想偷個懶,逃......)。

 

 

2. 使用URL編碼繞過

 

當SQL注入環境中,如果頁面不返回任何的信息和數據庫,怎麼確定當前網站的注入類型:

直接輸入參數?id=1' and '1'='1,頁面能正常顯示返回結果,初步看起來當前網站是使用“ ' ”單引號閉合的。但輸入?id=1' and '1'='2的話,頁面就不能正常顯示返回結果了,也就是說當前網站並不是使用單引號閉合的,但也不可能是數字型注入。

 

 

那換一種思路:輸入參數?id=3' and '1'='1 ,web頁面的變化如下

按理說,如果當前頁面是使用單引號閉合的話,頁面應該返回id爲3的用戶名和密碼,但頁面仍然是返回的id=1的用戶名和密碼,因此這裏我們猜測是使用了單引號加括號的閉合方式。

 

 

分析Less-28源碼:

 

 

也就是說,之前輸入的id=3' and '1'='1,在後臺中實際上被替換成這樣了(紅色部分爲替換的$id):

真實的注入環境中如果頁面不反饋數據庫報錯信息,那麼就可以通過這種方式進一步判斷當前網站的閉合方式。

 

 

 

在注入的時候我們可能會碰到這樣一個問題:就是凡事出現union select關鍵字的地方會被繞過,這種情況下可以嘗試使用URL編碼繞過:

輸入的SQL命令中使用了大小寫方式,union select關鍵字仍然還是被過濾掉了。

 

 

Less-28a源代碼:

function blacklist($id)
{
    //$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*
    //$id= preg_replace('/[--]/',"", $id);				//Strip out --.
    //$id= preg_replace('/[#]/',"", $id);					//Strip out #.
    //$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
    //$id= preg_replace('/select/m',"", $id);	   		 	//Strip out spaces.
    //$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
    //對於出現的union select,不區分大小寫,一律過濾
    $id= preg_replace('/union\s+select/i',"", $id);	    //Strip out spaces.
    return $id;
}

 

這種情況下可以使用URL編碼過濾方式進行繞過,將%0A替換成%A0進行繞過:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章