文章摘要: 以避免通過發手機驗證碼爆破已註冊使用者賬號(普通使用者名稱、郵箱、手機號等)密碼————常見 賬號驗證碼 登入需要面臨的問題是爆破和一些邏輯漏洞造成的任意使用者登入等問題
0x01 為什麼關注登入、註冊安全
使用者登入功能是業務系統具備的最基本的功能,登入作為系統的入口,成功登入意味著擁有系統的使用權利,普通使用者登入介面出現安全問題,可能導致用戶數據洩露,對業務發展造成影響,而非普通使用者登入入口出現安全問題,意味著攻擊者擁有更大的攻擊面去對系統進行攻擊。
首先看幾個登入、註冊相關的業務安全問題
- 某短視訊業務註冊介面漏洞,可大量註冊殭屍賬號用於刷粉,引流,廣告等
- 某站點登入介面可爆破、可爆破使用者名稱,攻擊成功可竊取使用者賬號資訊,將賬號用於其他目的
- 某站點注入被脫褲,使用者密碼明文儲存。傳統安全漏洞~
登入面臨的最大問題是邏輯問題導致任意使用者登入和爆破使用者密碼
註冊面臨的最大問題是惡意註冊,影響使用者生態
縱觀國內各大網際網路公司,其中騰訊是對使用者賬號體系運營最好的,一個QQ號,早些年針對QQ賬號的安全,騰訊推出了各種安全手段,有密保、密保卡等多因子手段,到現在手機普及了,賬號都和手機號進行關聯,手機號成為一層更加有效和便捷的賬號安全驗證手段。網路安全法要求網路實名,而手機號繫結是進行實名化最有效的手段,雖然可能會增加使用者的第一次使用體驗,但是一定程度上造就了使用手機號作為安全驗證的良好環境。而更安全的動態密碼、USB是不適合網際網路業務。
一個健壯的登入、註冊系統應該具備哪些因素:
- 無邏輯問題導致的任意使用者登入問題(這裏主要指使用者認證邏輯不當,如前端驗證、驗證碼回顯等)
- 無爆破風險或爆破的自動化成本高
- 無任意註冊漏洞或註冊流程自動化進行的複雜度高
- 完整的登出功能
- 進行口令複雜度策略校驗
- 避免瀏覽器記住密碼策略
- 安全的口令儲存方案
- 以及實現上述因素採取的手段不具備繞過的可能
0x02 安全註冊設計
註冊的基本流程
首先使用者註冊需要採集哪些資訊,幾種方式:
- 先採集儘量少的資料(username/password),後續部分或全部功能使用需要繫結手機、郵箱等
- 直接採集其他關聯資料——手機號、郵箱
目前第二種是大多數站點的方式,下面主要以第二種方式說明
資料驗證是在註冊時立即完成還是採用啟用的方式?如果採用先註冊儲存資料後啟用的方式,需要做訪問驗證賬號是否啟用,啟用大多數是郵箱連結的方式,不適合手機。
資料驗證安全設計:
- 後端資料驗證,型別、格式,如手機號、郵箱格式,校驗密碼複雜度策略,郵箱可選擇拒絕部分匿名郵箱字尾註冊,不建議對空格等不可列印字元正則去除處理,避免用於繞過,直接拒絕。
- session中暫存使用者標識資料、驗證資料,響應客戶端輸入驗證資料,郵箱可採取連結跳轉方式。此處不可將驗證碼、連結響應在返回包內容、header中。
- 使用者傳輸驗證資料,與session中資料進行驗證。如果使用資料庫儲存驗證資料如驗證碼,在進行從資料庫查詢進行校驗時,不使用客戶端傳輸的資料查詢資料庫,通過session中能夠標識該使用者的資料去從資料庫中查詢。
- 如果註冊涉及多個步驟,在最後插入註冊成功資料前驗證每一步是否完成。
- 針對驗證碼,記錄手機號、郵箱、IP傳送次數,對次數進行限制
儲存、傳輸安全設計:
- 如果前端不進行資料加密,則後端需要加密再儲存使用者密碼,md5(md5(salt,passwd))
- 數據傳輸加密,使用ssl或者對資料前端加密,避免中間人攻擊
錯誤處理:
考慮一個問題,如果一個已經註冊了的手機號,第二次註冊時,是在發驗證碼時提示已註冊,還是在所有資料提交時返回已註冊呢?考慮使用簡訊驗證碼,可以避免使用圖形驗證碼,因此這裏我們需要在所有資料提交後返回已註冊,以避免通過發手機驗證碼爆破已註冊使用者。
表關係:
一張使用者賬戶密碼錶
零或一張驗證碼次數記錄表,需要有手機號、IP、次數等欄位
多張使用者資訊表
總結: 通過需要與使用者進行互動來避免自動化序號產生器,而對於如果攻擊者使用打碼平臺、接碼平臺,可採取使用搞互動式驗證碼來防止批量註冊
0x03 安全登入設計
不關注會話保持、傳統漏洞問題。畫一個簡單的流程圖:
登入的幾種方式:
- 賬號(普通使用者名稱、郵箱、手機號等)密碼————常見
- 賬號驗證碼
登入需要面臨的問題是爆破和一些邏輯漏洞造成的任意使用者登入等問題,其中任意使用者登入又要分使用第三方賬號和自己的賬號體系,歸根結底還是驗證流程出現安全問題。
傳輸安全設計:
- 密碼密文傳輸或ssl加密連線
數據處理安全設計:
- 資料格式化處理
- 校驗密碼,響應
- 登入錯誤,記錄當前錯誤登入次數、IP,普通業務系統可使用驗證碼、錯誤鎖定等策略,爲了優化使用者體驗,可以使用錯誤次數達到閾值後再需要驗證碼登入。
- 處理驗證碼、Cookie為空等情況
- 對使用Token防止跨站的情況,是不能避免爆破的。
- 對使用驗證碼進行登入的情況,驗證碼長度應不少於六位,應限制時效性,以及驗證次數限制
- 應避免使用自動登入功能
錯誤處理:
密碼錯誤、賬號不存在不直接提示,避免用於爆破賬戶名,返回賬戶或密碼錯誤。
針對第三方賬號體系,大多數為OAuth方式,應遵循 OAuth 安全設計原則。