WEB應(yīng)用防火墻WAF 的配置跟 CDN 的配置差不多,如果類似 CDN 的配置,那么該 WAF 的部署方式屬于串連部署,就是所有流量先經(jīng)過 WAF 設(shè)備,然后再到后端服務(wù)器,這樣對于攻擊事件,可以做到實時攔截,有一個缺點就是,容易誤傷用戶,如果 WAF 設(shè)備出現(xiàn)故障,那么會影響一大片用戶的訪問,造成 p0 級故障,這是做安全防御不想看到的。
那么還有啥方式呢?就是旁路部署的方式,原理就是將所有流量鏡像到 WAF 設(shè)備,對于 WAF 設(shè)備來說,流量是實時的,但是對于目標(biāo)系統(tǒng)來說只是將流量復(fù)制了一份而已,這種部署方式無法做到實時攔截,需要 WAF 審計出攻擊事件之后,再給目標(biāo)系統(tǒng)發(fā)送指令,來對攻擊來源進行限制,比如封 IP,封賬號之類的操作。
如何識別呢?首先可以嘗試識別 CDN 的那種方式,從 IP、CNAME 上去匹配相應(yīng)規(guī)則,這種可以識別那些 WAF 串聯(lián)在目標(biāo)與用戶之間的 WAF,而旁路 WAF 部署則需要進行 WAF 觸發(fā)攔截之后,根據(jù)相應(yīng)數(shù)據(jù)來進行規(guī)則判斷 。
核心原理就是,有一個 WAF 指紋庫,通過構(gòu)造惡意 payload 來進行觸發(fā) WAF 攔截,然后再進行指紋比對,如果能比對上則說明存在 WAF,比如 sqlmap 檢測 WAF 的 Payload:
HEURISTIC_PAYLOAD = "1 AND 1=1 UNION ALL SELECT 1,NULL,'<script>alert(\"XSS\")</script>',table_name FROM information_schema.tables WHERE 2>1--/**/; EXEC xp_cmdshell('cat ../../../etc/passwd')#" # Reference:
https://github.com/sqlmapproject/sqlmap/blob/master/lib/core/settings.py
當(dāng)我們在一個沒有 WAF 的網(wǎng)站做測試時,使用上面的 payload 是不會有任何變化的,如圖:
https://edu.xazlsec.com/?1%20AND%201=1%20UNION%20ALL%20SELECT%201,NULL,%27%3Cscript%3Ealert(/%22XSS/%22)%3C/script%3E%27,table_name%20FROM%20information_schema.tables%20WHERE%202%3E1--/etc/passwd%27)#
當(dāng)我們在一個有 WAF 的網(wǎng)站測試時,出現(xiàn)了跟正常訪問不一樣的畫面,這就證明該網(wǎng)站存在了 WAF,因為 WAF 廠商也要考慮用戶體驗問題,正常用戶難免會觸發(fā) WAF 攔截,WAF 誤傷問題很常見,所以攔截頁面都還是比較友好的,而且很有辨識度,能夠即使發(fā)現(xiàn)問題,經(jīng)過投訴之后,及時解決,這對于識別 waf 來說也提供了便利。