漏洞掃描技巧篇-Web漏洞掃描器
在很久以前有人提問 AMF 格式的請求怎么進行檢測,或者有什么工具可以檢測。
既然我們要講解的是 Web 漏洞掃描器,那么就先假設是 AMF over HTTP (這里并不需要你了解 AMF,你只需要知道 AMF 是一種數據格式類型就行)。
1.先解析 HTTP 中 AMF 格式數據
2.然后在測試參數中填寫 payload
3.重新封裝 AMF 格式數據
4.發(fā)送 HTTP 請求
整個流程下來沒什么問題,但是如果又來了一個 X 協(xié)議(X over HTTP),那么我們就得繼續(xù)修改 SQL 注入模塊以便支持這種 X 協(xié)議,但是掃描器中可不是只有 SQL 注入檢測模塊,還有其他同類模塊,難道每加一個新協(xié)議我還得把所有檢測模塊都改一遍?
所以我們需要把這些協(xié)議解析和封裝單獨抽出來放在一個模塊中。
上面的遞歸 decode 主要是為了解碼某種格式的數據里面還有另外一種格式的數據,雖然看起來這種場景比較少見,但是仔細想一下 multipart 帶著 json,json 里的字符串是另外一個 json 字符串,是不是又覺得這種情況也并不少見。
因為每個檢測模塊的檢測依據大致就幾種:
-
返回內容
-
消耗時間 (time based)
-
另外一條信道的數據 (比方說 dnslog)
所以即便是我們將網絡操作剝離出來也不會影響檢測的效果。
在編寫檢測模塊的時候,編寫者可以不用關心基礎協(xié)議是什么,怎么對數據編碼解碼,只用關心根據 value 生成 payload 并填寫到相對應的 key 中。
假如某天出現(xiàn)了這么一種流行編碼格式 http://szzk126.cn/key1, value1,key2,value2,那我們所有的檢測模塊也無需修改,僅僅需要在上一層再添加一套 encode/decode 操作即可。假如某天出現(xiàn)了一種比較流行的協(xié)議,我們也僅需要在上一層提供一套 client 即可。檢測模塊的工作就僅僅剩下生成并填寫 payload。
在 2014 年的時候,我做了大量的競品分析,包括使用逆向工程逆向商業(yè)的 Acunetix WVS, HP Webinspect, IBM AppScan, Netsparker 掃描邏輯,也包括閱讀開源的 w3af, arachni 代碼。
如果不談掃描質量,只關注整體項目設計以及產品中使用到的猥瑣技巧,那么其中最讓我眼前一亮的當屬 AWVS,接下來我將詳細介紹一下我從 AWVS 中學習到的 PoC 分類。
PoC 分類:
類型 | 描述 |
---|---|
PerServer | 用于檢測 Web Server 級別中存在的漏洞,比方說各種中間件,Web 框架的漏洞 |
PerFile | 用于檢測某個文件中是否存在漏洞,比如對應文件的備份,Bash RCE 等 |
PerFolder | 用于檢測某個目錄中是否存在漏洞,比如敏感信息的泄漏,路徑中的 SQL 注入等 |
PerScheme | 用于檢測某個參數中是否存在漏洞,比如 SQL 注入,XSS 等 |
PostCrawl | 在爬蟲結束之后啟動,直接使用爬蟲的資源進行檢測 |
PostScan | 在掃描結束之后啟動,用于檢測二階注入,存儲 XSS等 |
WebApps | 用于檢測比較常用的 Web 應用的漏洞 |
在獲取到爬蟲資產,對相關資產格式化之后,便下發(fā)到各個不同類型的 PoC 中進行檢測,這樣做的好處是分類明確,覆蓋大多數檢測階段,也避免為了減少重復請求的下發(fā)而需要額外記錄中間狀態(tài)的行為。
AWVS 有個比較有趣的功能 AcuMonitor ,也就大家熟知的 dnslog、反連平臺。在 2014 年看到 AWVS 的這個功能時,就建議 WooYun 出個類似的功能,也就是 cloudeye,tangscan 也就算是國內比較早使用這種技術的掃描器,當然后續(xù)又出現(xiàn)了各種類似 cloudeye 的項目,自然而然也出現(xiàn)了各種使用該技術的掃描器。
不過今天我們不打算繼續(xù)介紹 AcuMonitor,而是介紹另外一個也很有趣的功能 AcuSensor 。AcuSensor 就是IAST,只要稍微了解過 Web 漏洞掃描器的,都應該會知道 IAST 是干啥的。那為什么我要單獨拎出來講這個呢?
主要是因為 AcuSensor 的實現(xiàn)方式非常有趣。AcuSensor 提供了 Java、 .NET、PHP 這三個語言版本,其中比較有趣的是 PHP 版本的實現(xiàn)。
PHP版本的AcuSensor使用方法是下載一個acu_phpaspect.php文件,再通過 auto_prepend_file 加載這個文件, 眾所周知,PHP 是不能改直接 hook PHP 內置函數的,那么單單依靠一個 PHP 腳本,AcuSensor是如何做到類似 IAST 功能的呢?
很簡單,直接替換所有關鍵函數。嗯,真的就那么簡單。
我們來詳細介紹一下這個過程,在 acu_phpaspect.php 中:
1.獲取用戶實際請求的文件內容
2.檢查一下有沒有相關 cache,如果有 cache 那么直接加載執(zhí)行 cache,然后結束
3.使用 token_get_all
獲取所有 token遍歷每一個 token,對自己感興趣的函數或者語句使用自己定義的函數進行 wrap 并替換
4.將替換后的內容保存到 cache 中并使用 eval 執(zhí)行
5.__halt_compiler
中斷編譯
整個過程簡單粗暴有效,這樣做的優(yōu)點在于:
-
實現(xiàn)簡單,只需要編寫 PHP 即可
-
安裝簡單,無需安裝擴展,只需修改配置文件可以
-
兼容性強,比較容易兼容性各種環(huán)境,各種版本 PHP
AcuSensor
的實現(xiàn)。如果對自己實現(xiàn)的檢測邏輯效率比較自信的話,甚至可以基于這個原理直接實現(xiàn)一個 PHP 版本的 RASP 項目。在 Web 漏洞掃描器中,無論作為乙方的商業(yè)產品、甲方的自研產品,限速都是一個至關重要的功能,甚至可以說如果你的掃描器沒有限速功能,那壓根就不能上線使用。接下來我們將介紹一下在掃描器中限速的幾種方法。
1.代理
使用代理做限速功能,將所有執(zhí)行掃描任務的 worker 的測試流量全轉發(fā)proxy 服務器上:
由 proxy 服務器統(tǒng)一調度發(fā)送測試請求頻率,直接使用 proxy 方案優(yōu)點是可以兼容之前沒做限速功能的掃描器,缺點是所有基于 time based 的檢測均無效(當然也可以讓 proxy 返回真正的響應時間來進行判斷,不過仍需要修改檢測模塊),也不允許在檢測模塊中加入超時設置。
2.雙重隊列
另外一種方法是使用雙重隊列實現(xiàn)限速功能,流程圖如下:
1. worker1 從隊列中取到名為 target1 的任務
2. worker1 從 target1 隊列中取出和 target1 相關的任務
3. 默認單并發(fā)執(zhí)行和 target1 相關任務,根據設置的 QPS 限制,主動 sleep 或者增加并發(fā)
這種方案的缺點是掃描器設計之初的時候就得使用這種方法,優(yōu)點是每個并發(fā)可以穩(wěn)定的和遠程服務器保持鏈接,也不影響掃描功能。
實際上這一節(jié)并不會講具體某個漏洞檢測方法,只是簡單談一下漏掃模塊每個階段該干的事情。
項目之初,沒有相關積累,那么可以選擇看一下 AWVS 的檢測代碼,雖然說網上公開的是 10.5 的插件代碼,但其實從 8.0 到 11 的插件代碼和 10.5 的也差不多,無非新增檢測模塊,修復誤漏報的情況,也可以多看看 SQLMap 代碼,看看檢測邏輯,但是千萬不要學習它的代碼風格。從這些代碼中可以學習到非常多的小技巧,比如動態(tài)頁面檢測,識別 404 頁面等。看代碼很容易理解相關的邏輯,但我們需要去理解為什么代碼這樣處理,歷史背景是什么,所以多用 git blame。
如果掃描器是自己的一個開源項目的話,那么就必須適當的推廣自己的項目,讓更多的人去使用、反饋,然后才能繼續(xù)完善項目,從而繼續(xù)推廣自己的項目,這是一個循環(huán)的過程。總而言之,提升漏洞檢測的精準度需要兩個條件:1. bad case,2. 維護精力
到了后期,各種常規(guī)的漏洞檢測模塊已經實現(xiàn)完成,也有精力持續(xù)提升檢測精準度,日常漏洞 PoC 也有人員進行補充。
當然除了完善資產收集這塊,還有輔助提升檢測效果的事情,比如說上面提到的 AcuSensor
,這部分事情可以結合公司內部的 RASP 做到同樣效果,還有分析 access log、數據庫 log 等事情。總的來說,做漏掃沒有什么條條框框限制,只要能發(fā)現(xiàn)漏洞就行。
以上都是和技術相關的事情,做漏掃需要處理的事情也不僅僅只有技術,還需要去搞定詳細可操作的漏洞描述及其解決方案,匯報可量化的指標數據,最重要的是擁有有理有據、令人信服的甩鍋技巧。
以上即是我認為在掃描器中比較有用且能夠公開的小技巧,希望能夠對你有所幫助。