在絕大部分網站中,都提供短信來進行用戶驗證,如註冊、登陸、修改密碼、轉賬等功能。通過短信可以簡單便捷地進行用戶驗證,但是,如果驗證邏輯存在缺陷,導致用戶可以無限制請求短信接口,就會造成短信轟炸漏洞,也屬於防護功能濫用類漏洞。該漏洞的利用過程也比較簡單,即偽裝成正常用戶,向短信接口發起大量的請求,即可完成攻擊過程。短信轟炸漏洞也能造成不小的危害,如會造成短信通道阻塞、短信資源被惡意消耗,如果被灰黑產利用,製作成短信轟炸機,還會造成企業形象受損,若被用戶投訴還可能造成接口封禁等威脅。短信轟炸漏洞造成的原因大概可以總結為兩個,一是沒有驗證用戶是否為正常用戶,二是沒有限制短信下發的頻率,而防禦思路也可以根據這兩個方面來展開。針對於用戶校驗方面,可以通過在發送短信驗證之前,增加圖形驗證碼或者是滑塊驗證碼。而短信下發頻率方面,可以限制單個IP請求頻率、限制單個手機號請求頻率等等。2.1圖形驗證碼造成短信轟炸漏洞的主要原因是攻擊者可以編寫成自動利用腳本工具,對短信接口進行大量的調用。如果再獲取短信驗證碼前,增加一個圖形驗證碼,只有校驗成功才能進行後續操作,也能有效的防禦漏洞。
如果圖形驗證碼功能增加的邏輯不當,仍然會造成短信轟炸漏洞:2. 驗證碼復用:驗證碼必須單次有效,有合理的失效機制 3. 圖形過於簡單:可以使用OCR進行圖形識別,驗證作用也就不復存在了,可以使用需要邏輯判斷的圖形驗證碼,如簡單的算式等等,都可以增加攻擊者自動化攻擊的成本。
2.2滑動驗證相對於簡單的圖片驗證碼,滑動驗證的方式不僅用戶體驗會更好,安全性也會更高,因為滑動驗證的本質邏輯是用戶的拖放軌跡是否符合真實用戶的行為特徵。
但是,滑動驗證也並不是完全不可繞過,在Github上有不少利用深度學習進行滑動驗證項目。其工作原理是,通過對大量的樣本數據進行數據標註,即將滑塊的位置標註,用目標識別的模型,預測出滑塊位置,最後通過軌跡方程,完成滑塊驗證。
同時,滑動驗證也需要規範使用的邏輯,如有效性控制,包括了有效時間和有效次數等等。
2.3限制單個IP請求頻率通過限制IP在單位時間內的請求次數,可以有效阻止某個IP在短時間內對大量用戶進行轟炸攻擊。一旦用戶請求次數超出設定的閾值,則暫停對該IP一段時間內的請求進行響應;若造成大量的惡意請求,也可以將IP加入黑名單,禁止該IP的訪問請求。
然而,通過IP限制的方式,僅僅是增加了攻擊成本而已。單一的IP限制很難達到比較好的防禦效果,攻擊者可以使用代理池等對IP限制進行繞過。
2.4限制單個手機號請求頻率可以根據業務需求,對手機號在單位時間內的請求次數進行限制,如一天不超過十次等。同時,還需要對兩次請求之間的時長做合理限制,時長應該要超過驗證碼有效期。
通過這樣的限制,可以有效的解決單個用戶遭受短信轟炸的困擾。但是,僅僅通過限制單個手機號的請求頻率,依然無法解決所有問題。這樣的防禦方案僅僅防止了短信轟炸問題,但是攻擊者依然可以通過生成隨機手機號,對隨機用戶發送短信,雖然這樣的攻擊並不會造成轟炸的效果,但是依然會損耗短信資源,造成一定的損失。
2.5總結上文敘述了常見的幾種防禦方式,顯然,單獨使用其中某種方式,是無法很好的防禦短信轟炸漏洞。此外,還需要嚴格控制功能邏輯,才能達到很好的效果。在請求短信接口的過程中,每一步都需要進行嚴格的驗證,必須以上一步的結果作為依據,如在驗證過程中加入隨機數,隨機數僅支持一次驗證,並且驗證需要貫穿整個過程。
在具體的實現過程中,客戶端的請求頻率相關數據存儲實現,可以使用session、redis數據庫等等。最近在實戰過程遇到的一個站,感覺他的功能邏輯相對來說比較嚴謹,所以想分享下。