常見WAF繞過方法


一、網絡架構層進行繞過

1. 利用真實IP地址繞過

  1.查找相關的二級域名或者同一域名注冊者的其他域名解析記錄

  2. 通過查看郵件交換記錄解析來找到真實IP地址。

Windows下可以通過nslookup命令
nslookup -qt=mx baidu.com
Linux下可以通過dig命令
dig mx baidu.com

  3. 查看域名的歷史解析記錄:https://securitytrails.com/

二、HTTP協議層繞過WAF

0.1. 利用pipeline繞過waf

  pipeline繞過是利用http協議的管道化技術,http遵循請求響應模型,比如發送一個A請求,則會返回A請求的響應,如果當發送一個請求的同時發送多個http請求,如果waf只對第一個請求進行檢查判斷,就可以繞過后面http請求的數據檢查。

利用這種方法需要將第一個請求的connection字段值改為 keep-alive 

Connection: keep-alive

0.2. 修改http請求頭的Transfer-Encoding: 字段值繞過

Transfer-Encoding: chunked 當請求頭中有該字段值時,說明該報文是分塊編碼,post的請求體中的數據 應該分塊來寫。就是將數據分行來寫。數據最后需要用0獨占一行表示結束。

 

 

1. 某些WAF對SSL加密算法的支持不夠全面進行繞過

  ssl握手有3個階段:

   1. ClientHello和ServerHello階段:

    首先客戶端向服務端發送一條ClientHello消息,該消息中包含服務器所需的各種密碼套件喝支持的SSL/TLS版本,服務端收到后,也返回一個包,包含密碼套件和SSL版本。

   2. 證書交換階段:

    連接初始化后,服務器為了向客戶端證明身份,將SSL證書發送給客戶端,客戶端檢查自己是否信任該證書並繼續連接。

   3. 密鑰交換階段:

    證書交換完畢后,建立了一條安全隧道,服務器就和客戶端交換密鑰,該密鑰用於數據的加密和解密。

  繞過方法:

   收集WAF支持的SSL密碼和TLS版本,服務端支持的SSL密碼和TLS版本。

sslscan

  利用這個工具可以收集服務端支持的SSL密碼。

apt install sslscan 
sslscan http://target/ | grep Accept

   通過收集到的信息,找出web服務器支持的SSL密碼和TLS版本,但WAF不支持。之后就可以利用。

curl --ciphers ECDHE-RSA-AES256-SHA https://waf-test.lab.local/ssl-cipher-test

2. 利用HTTP協議版本繞過

  通過修改HTTP協議的版本號繞過。

3. 利用url編碼、charset編碼、MIME編碼繞過

  對特殊字符進行編碼

  IISASP支持Unicode編碼,還會對不合法的url編碼進行字符刪除,比如:我們可以利用s%elect來繞過對select的過濾。

  但是nginx會將s%elect處理為slect,Nginx的ngx unescape_uri函數在處理%編碼時,如果%后面的第一個字符不在十六進制范圍內,則會丟棄%;否則判斷第二個字符是否在十六進制范圍內,如果不在則會丟棄%和%后的第一個字符。所以遇到nginx中間件時,我們可以在select的l前加%。se%lect

  修改http請求頭的Content-Type字段的值

    HTTP請求頭Content-Type的charset編碼可以指定內容編碼,這個值一般都是UTF-8編碼的,但惡意攻擊者可以指定使用ibm037、 ibm500、cp875、ibm1026等不常用的編碼來進行繞過。

可以設置Content-Type頭的值為
application/x-www-form-urlencoded;charset=ibm500

multipart/formdata;charset=ibm500,boundary=blah
這里使用Burpsuite的HTTP Request Smuggler插件可以簡化數據包的修改操作。

   利用MIME編碼繞過:spring框架可用。

   在Spring中,如果上傳的文件名以=?開始並以?=結束,則調用MimeDelegate.decode來對文件名解碼。MIME是郵件協議中用到的編碼方式,這里我們可以將上傳文件名改為=2UTF-82B?YS5gc3A=?=UTF-8代表字符編碼,B?代表后面的YS50c3A=是base64編碼的。

   經過Sprina解碼得到的文件名是aisp,而一般的WAF如果之前沒有經過處理,那么就會出現在WAF中上傳文件名過濾被繞過的問題。

4. 上傳協議對multipart/form-data的不規范解析進行繞過

  PHP web server對multipart/form-data解析時,會取最后一個filename的值,而WAF驗證時,取第一個值,我們可以在數據包中加一個filename的值,從而繞過waf。

Content-Disposition: form-data; name="file1"; 
filename="a.txt";filename="a.php";

5. 修改Host值繞過

  一些基於域名防護的WAF,我們可以修改Host值來繞過。

Host:localhost:80 
Host:127.0.0.1:80

三、第三方應用層繞過

1. 數據庫繞過:

  1. mysql的版本號注釋繞過:/%!

  2. 利用0xA0代替空格繞過、MySQL中0x01至0x0F的字符都能代表空格。

2. 系統命令的繞過:

  Linux系統下查看/etc/passwd

cat /etc/passwd可以改為下面方法:去掉空格
cat</etc/passwd lcat,/etc/passwd] cat$IFS/etc/passwd X=$'cat\x20/etc/passwd'&&sx
繞過關鍵字方法:插入成對的單引號、雙引號或者反引號。
c'a't /etc/pass'"wd
c""at /e't'c/pass""wd
c""at /e't'c/pass~~*wd

  windows系統下ping 百度,替換了空格。

ping%CommonProgramFiles:10.-18%baidu.com 
ping%PROGRAMFILES:~10,-5%baidu.com 

  通過一些腳本執行引擎,如perl、python、nodejs、php、java等來繞過WAF關鍵字,相關寫法如下:

perl -e 'sa "ca" Sb="t /et".sc="c/pas".exec sa.sb.sou"swd"."
python -c 'import subprocess;subprocess.call(["ca"+"t","/et"+"c/pa"+"sswd"1);"3 php 
-r
'exec("ca"."t /et"."c/pa"."sswd");"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM