本文帶給大家的內容是動態防禦WAF的技術原理及編程實戰。
將通過介紹ShareWAF的核心技術點,向大家展示動態防禦的優勢、實現思路,並以編程實戰的方式向大家展示如何在WAF產品開發過程中應用動態防禦技術。
ShareWAF是一款動態防禦型WAF產品,其在反自動化攻擊、反爬蟲等領域應用了動態防禦技術。
相比於傳統WAF,動態防禦型的WAF,有非常顯著的優勢:
【動態防禦優勢、原理】
概括而言,優勢體現為兩個詞:主動防禦、不可預見
傳統WAF,是靜待攻擊來臨、識別攻擊,再抵禦攻擊。
應用動態防禦技術後,WAF將逆轉攻防模式:不再被動,而是時刻處於主動出擊、積極防護狀態。
舉個例子:
假如打開一扇門:
傳統WAF狀態下,門後的景象總是一樣的。
如果是動態防禦WAF,每次打開門看到的將是不同的景色,可能是草原、可能是麥田。即:隨機變化 、不可預測。
再舉個例子:
比如射箭:
傳統WAF狀態下,箭靶是固定的。
如果是動態防禦WAF,箭靶將是隨機移動的。即:動態變化,目標不可預測。
具體到WAF產品中。
比如反暴力破解,傳統WAF可能採用一套規則,例如:訪問者IP或設備指紋+持續登錄行為+連續嘗試登錄次數+登錄失敗次數,通過規則判斷是否屬於暴力破解行為。
這是正統的、中規中矩的防衛理念,是被動式的。
在這個進程中,攻擊者是可以發起持續攻擊的。而且,攻擊者可以通過使用代理、修改設備特徵等方式,規避WAF規則,嘗試對WAF進行Bypass。
而如果是動態防禦
以ShareWAF為例,在對抗暴力破解這一功能點上,採取的方式是完全不同的:
ShareWAF會對被破解的某個關鍵點,進行動態封裝,比如:用戶名。
具體而言:保護前,用戶名在網頁中經常是username之類的固定元素名稱。暴力破解攻擊者會用自動化的工具或腳本,自動對其賦值,然後發起請求、嘗試登錄,反覆進行此操作即是攻擊過程。
ShareWAF會對username進行封裝,而且是動態的,用戶端發起訪問請求得到的將不再是username,每次得到的都是某個隨機數符串。
這樣,自動化的工具或腳本,就無法對關鍵的暴力破解點進行定位、賦值。攻擊行為在前端就被終結。
ShareWAF的反爬蟲也採用類似的理念。
【動態防禦WAF編程實戰】
前面是理論,接下來是實戰,證明理論的可行性、演示如何在安全編程開發中應用動態防護技術。
將通過例程,分別演示ShareWAF的反自動化攻擊、反爬蟲功能的核心實現。
反自動化攻擊
這裡將通過一個例程,一個最簡單的登錄頁面,模擬ShareWAF如何利用動態防禦技術對暴力破解這類自動化攻擊進行防禦。
登錄頁而的關鍵內容,通常是這樣的:
展現在瀏覽器端是一個簡單的登錄頁,提供用戶名、密碼輸入,並進行登錄。
攻擊者進行暴力破解時,可能採取的方式是:對username元素進行賦值,併發起登錄;或用Burp Suite等工具攔截數據並修改數據包進行枚舉破解。
這裡且不再談傳統WAF的應對手段,直入主題,看ShareWAF是如何進行動態防禦的。
例程代碼只有幾十行,展示最核心的"動態"概念。
這是一段NodeJS代碼,實現了一個web服務,其中融入了ShareWAF的動態防禦理念。
代碼功能簡單分析:
重點一:動態變形池,用於存放username和動態變形內容的對應關係;
重點二:在頁面訪問時,進行username元素動態變形、將變形對應關係存儲到變形池,並將變形後的內容發送到瀏覽器端。這一步完成時,瀏覽器端原本一成不變的username元素將在每次訪問或刷新時發生動態變化:
留意上方的name值,原本應該是username,而這時隨機變化的字符串,兩張圖中name值是不同的,事實上,每次都是不同的。
假如攻擊者原本採用自動化破解腳本:document.getElementById("username").value="***",這時將失效,因為username不見了,而且不可預見。
Burp Suite之類的數據包嗅探、截取、修改工具也失效了,因為關鍵字段username不見了。
動態防禦的理念即是如此。當然,這並不是全部,只是動態防禦的一小部分應用。
重點三、動態變形過的username當然是需要還原的,否則將影響原有的業務功能。代碼中的"變形池"存放的是username和"變形碼(即:隨機變形的字符串)"對應關係。通過對應關係,可以很輕鬆的還原回username,在WAF功能中,這時該將還原後的數據再轉發給被保護網站,實現正常的業務流程。
如圖:username已被還原:
反爬蟲
前一個例子是應用了針對內容的動態防禦,在反爬蟲領域,動態防禦又有所不同。
爬蟲有多種類型,下面要講的反爬蟲,準確的是說反內容爬蟲,防止內容被爬取,也可以理解為防止網頁內容被複制。
反內容爬蟲,慣用的一種方式是進行字體加密,即使用自定義字體。
但一般來說,自定義字體反爬容易被破解:攻擊者獲取字體後,很容易進行逆向分析,得出字碼對應邏輯,進而還原出原本內容。ShareWAF的反內容爬蟲,在自定義字體的基礎上,加入了"動態"概念:
使字體成為動態路徑、字體文件不可被下載。
這部分功能的實現,原理與之前類似,同樣是在將數據發往瀏覽器之前先對特定的內容:字體路徑,做動態變化處理,在收到請求時,再還原為原始正確路徑,使文件可讀取。
有一點特殊之處是:為了防止從網頁源碼中查看字體路徑、下載字體文件,又對"動態"路徑增加了訪問時間限制、使用一次即失效功能。如此,達到了:加載網頁時文件可以正常讀取,但非法獲取文件路徑卻不能打開的目的。
效果展示:
在這兩張圖中可以看到:字體路徑是變化的、從瀏覽器打開文件地址,文件不能讀取和下載。
使字體成為動態字體,防止逆向分析。
動態自定義字體技術,在ShareWAF中稱其為:動態字體變碼加密。
如果是傳統的自定義字體加密,相當於一種密碼技術,也類似於傳呼臺數字代碼表:
即用某個或某幾個數字,代替某個或某幾個文字。
具體到網頁文字內容加密反爬,是如下的效果:
也就是網頁中顯示正常的"文字",但在源碼中實際並不存在,存在的是"文字"對應的密碼字符。
這種文字,是不可複製的,整體複製網頁中的文字時,"密碼文字"部分將會缺失:
那麼,爬蟲也就無法複製、無法爬取內容。
這種技術的實現依賴於自定義字體,即網頁源碼中的css引入字體文件功能:
也就是需要引入自定義的字體文件。
自定義字體文件的相關知識不是本文的重點,在此略過。我們的重點是實現"動態自定義自體文件"。
這樣做的原因是:
如果使用一個固定的自定義字體文件,字體和數字的對應關係是可以被分析得出的。如上面:
Ԕ;表示"我",ԕ;表示"你"等等。
為了防止被分析出對應關係,我們需要對字體的加密碼也進行動態處理。
在本例中,提供了一種方法,用於生成新的變碼字體:
這是運行效果:
可以看到,出現了新的對應關係,與之前Ԕ;表示"我",ԕ;表示"你"是不同的。
這樣動態的改變字體編碼,就可以防止文字和數字編碼的對應關係被分析獲取。
以上,便是ShareWAF動態防禦技術在反自動化攻擊、反爬蟲場景中的應用。
閱讀更多 WangLiwen 的文章