WAF實現(xiàn)掃描器識別 徹底抵擋黑客掃描
目前安全測試的軟件越來越多,也越來越強大,越來越多的人成為黑客,今天在網(wǎng)上看到一個文章說攔截wvs的掃描,勾起了我寫這篇文章的欲望。
因為公司的三大業(yè)務(wù)之一就有一個云WAF,每天攔截的日志里面,有將近90%的請求是掃描器發(fā)出,WAF接收到請求會解析數(shù)據(jù)包,然后過一遍規(guī)則,過完成百上千條規(guī)則必定對性能有一定的影響。如果能識別出來是人還是掃描器的請求,就可以在這方面節(jié)省很大的資源。
下面的分析介紹只針對web安全掃描器。
目前全能型的掃描器主要是wvs(Acunetix Web Vulnerability Scanner)、AppScan、WebInspect,國內(nèi)的像aisec、bugscan等等…還有國內(nèi)那些老安全廠商的掃描器就不說了,主要提一下像wvs這種使用率比較高的。另外還有目錄文件型的掃描器、注入工具(類似sqlmap、Havij)等等。
掃描器識別主要從以下幾點來做:
1、掃描器指紋(head字段/請求參數(shù)值等)
2、單IP+ cookie某時間段內(nèi)觸發(fā)規(guī)則次數(shù)
3、隱藏的鏈接標(biāo)簽()
4、Cookie植入
5、驗證碼驗證
6、單IP請求時間段內(nèi)Webserver返回http狀態(tài)404比例
一、掃描器指紋(head字段/請求參數(shù)值等)
目前最常見的手法就是收集掃描器的指紋特征來做識別,不同的掃描器都有自己的一些特征,比如發(fā)出的請求會加一些特定的head 字段,測試漏洞的請求參數(shù)的值會帶上自己掃描器的名稱等。
下面通過抓網(wǎng)絡(luò)數(shù)據(jù)包來看常見掃描器的指紋特征:
wvs(Acunetix Web Vulnerability Scanner):
下面是我抓到的一個wvs的請求
GET /help/website-performance-settings/x HTTP/1.1 Pragma: no-cache Cache-Control: no-cache Referer: http://www.anquanbao.com/help Acunetix-Aspect: enabled Acunetix-Aspect-Password: 082119f75623eb7abd7bf357698ff66c Acunetix-Aspect-Queries: filelist;aspectalerts Cookie: xxxxxxxxxxxx Host: www.anquanbao.com Connection: Keep-alive Accept-Encoding: gzip,deflate User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36 Accept: */*
請求頭里面有三個很明顯的標(biāo)志:
Acunetix-Aspect: enabled Acunetix-Aspect-Password: 082119f75623eb7abd7bf357698ff66c Acunetix-Aspect-Queries: filelist;aspectalerts
另外在請求的參數(shù)值,比如URL跟POST數(shù)據(jù)中都有很明顯的acunetix_wvs_security_test特征,下圖是我從waf攔截中調(diào)取到的結(jié)果。
根據(jù)以上抓取到的特征,我們可以把這個作為wvs的一個指紋,在waf中進行過濾。
Appscan:
同樣的,appscan也有自己的一些特征,如下
Bugscan:
關(guān)于Bugscan,我咨詢了一下作者,作者給了XSS模塊的掃描源碼我看了下,主要特征是:
–>’”><H1>XSS@HERE</H1>
另外還有一些特征就不一一列舉。
注意:并不是所有的請求都會帶有掃描器的特征,比如下面的一個包也是wvs發(fā)出的,但是沒有帶上面我們說的特征,掃描器指紋特征只能抵擋住一部分的掃描,但是我們可以利用這些信息識別出掃描器然后干掉IP等。
二、單IP+ cookie某時間段內(nèi)觸發(fā)規(guī)則次數(shù)
根據(jù)某個IP+ cookie某時間段內(nèi)觸發(fā)waf攔截規(guī)則的次數(shù)大于設(shè)定的某個閥值,比如在20秒內(nèi),某個IP+cookie觸發(fā)waf攔截規(guī)則10次。
數(shù)據(jù)證明如下圖:
另外還可以根據(jù)IP+user angent等,或者更多維度。
三、隱藏的鏈接標(biāo)簽等()
掃描器的爬蟲會把頁面里面的所有鏈接都抓出來去做漏洞探測,特別是現(xiàn)在基于webkit一類的掃描器,能夠渲染css跟js,可以爬出更多的鏈接測試。
下面貼出一個百度百科關(guān)于webkit的介紹
WebKit 是一個開源的瀏覽器引擎,與之相對應(yīng)的引擎有Gecko(Mozilla Firefox 等使用)和Trident(也稱MSHTML,IE 使用)。同時WebKit 也是蘋果Mac OS X 系統(tǒng)引擎框架版本的名稱,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序。WebKit 前身是 KDE 小組的 KHTML,WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎來自于 KDE 的 KHTML 和 KJS,當(dāng)年蘋果比較了 Gecko 和 KHTML 后,仍然選擇了后者,就因為它擁有清晰的源碼結(jié)構(gòu)、極快的渲染速度。Apple將 KHTML 發(fā)揚光大,推出了裝備 KHTML 改進型 WebKit 引擎的瀏覽器 Safari。
隱藏的標(biāo)簽鏈接是指人看不見的鏈接,如:
<a href=”http://www.cnseay.com/”></a>
形式,人是點擊不到的,只有軟件能夠匹配出這個地址,我們新建一個網(wǎng)頁,抓掃描器數(shù)據(jù)包測試。
<html> <head> <title>test</title> </head> <body> <a href="</a> </body> </html>
當(dāng)然如果在正常情況下也給所有用戶植入這種代碼是非常令人反感的,用戶體驗也會大打折扣,可以在前期先做一些條件限制,比如固定時間段內(nèi)觸發(fā)waf攔截規(guī)則到達預(yù)定閥值,再給這個用戶單獨植入一個隱藏鏈接。
四、Cookie植入
Cookie植入的方式跟上面講的隱藏鏈接植入大同小異,實現(xiàn)原理是:當(dāng)一個IP+user angent在固定時間段內(nèi)觸發(fā)規(guī)則的次數(shù)到達一定閥值,給發(fā)起請求的這個人植入一個cookie,如果下次再請求沒有攜帶這個cookie,則說明是掃描器。
cookie植入有利有弊,優(yōu)點是更直接,種下cookie馬上就能根據(jù)下一個請求判斷。缺點是這個方式在基于webkit的掃描器上面行不通。
五、驗證碼驗證
驗證碼驗證的方式跟上面的cookie植入也大同小異,不過是把cookie換成了驗證碼的方式,這種方法也被用于防CC攻擊。
六、單IP請求時間段內(nèi)Webserver返回http狀態(tài)404比例
這種方法主要用來應(yīng)對探測敏感目錄和文件的掃描器,這類的掃描器都是基于字典文件,通過對字典內(nèi)的url進行請求獲得的返回信息來進行判斷目錄或者文件的是否存在。
如果某個IP在一段時間內(nèi)請求頻率過快,這時候waf可以進行收集一段時間內(nèi)webserver返回404狀態(tài)數(shù)目,到達一定閥值后進行封殺。
看過上面幾種方法的介紹,應(yīng)該大部分人都會想到兩個問題,
1. 一大撥人使用同一個公網(wǎng)IP,怎么判斷誰是攻擊者?
2. 一大撥人使用同一個公網(wǎng)IP,怎么才能保證不誤殺?
第一,對于怎么判斷攻擊者,當(dāng)然不能單純的從一個IP判斷,一般一個完整的http請求都會帶有
user angent、cookie等信息,我們可以結(jié)合ip+user angent來判斷請求的人,或者再加一個cookie的維度,當(dāng)然在給這個攻擊者植隱藏鏈接、cookie或者驗證碼之前,需要它觸發(fā)一些規(guī)則閥值,以免影響用戶體驗。
第二,說到怎么保證不誤殺,也就是怎么去封殺的問題,關(guān)鍵在于怎么二次判斷攻擊者,目前最好的方法也是利用ip+user angent,在判斷是掃描器請求后,根據(jù)IP+user angent進行封殺,另外也是靠cookie封殺,關(guān)鍵在于是攜帶某個cookie鍵的封殺掉還是不帶的封殺掉。