本篇文章介紹 OWASP top 10 中 2017 第二名的 broken authentication 針對身份驗證相關的漏洞,身份驗證原理,以及常見的三種身份驗證漏洞成因,最後附上與身份驗證防禦的方式。
身份驗證定義 Authentication
身份驗證是伺服器會透過「身份驗證因素」確認使用者的身份的過程,目前有三種驗證因素
- You know:knowledge factors
- 你知道的事物,密碼、安全提示的答案
- You have: possession factors
- 你擁有的物品:手機、安全碼(簡訊、信箱)
- You are: inherence factors
- 你的生物特徵:指紋、人臉
身份驗證(authentication) vs 授權(authorization)
- 身份驗證:我說我是飛飛,我有飛飛的密碼,可以正常登入。
- 授權:我的權限是管理員,我可以刪除留言、文章。
不安全的身份驗證 Broken Authentication
- 驗證機制脆弱,無法防禦「暴力攻擊」
- 程式碼有問題,可以「繞過」身份驗證機制,又稱 broken authentication。
> A2:2017-Broken Authentication
身份驗證影響
- 登入系統管理員(最高權限)控制整個網站、系統。
- 登入一般使用者,取得商業的敏感資料。
- 增加攻擊者進一步的攻擊思路。
漏洞類型
- 密碼相關的身份驗證弱點
- 多驗證因素身份驗證弱點
- 其他身份驗證弱點
密碼相關的身份驗證弱點
很多網站都是透過「帳號」、「密碼」進行驗證,因此目標是:找到帳號跟密碼。
Brute-force attacks
- 爆破帳號
- 爆破密碼
- 枚舉帳號
繞過保護機制(保護機制可能有缺陷)
- 帳號鎖定
- IP 鎖定
HTTP 基本驗證機制
Authorization: Basic base64(username:password)
多驗證因素身份驗證弱點
繞過雙重身份驗證
- 雙因素驗證邏輯有問題: 使用 Cookie 確認 username
- 爆破二階段驗證碼
其他身份驗證弱點
網站允許記憶登入狀態
- Cookie 爆破 Cookie
- Cookie –> 可能為 帳號+時間戳
- Cookie 內包含帳號密碼
重新設定使用者密碼
- 使用信箱發送密碼
- 使用 URL 重設密碼
更新使用者密碼
- 不需要輸入原本的密碼就可以修改
防禦身份驗證漏洞
- 注意自己的密碼,在安全的機制無法防禦自己洩漏密碼
- 有效的密碼策略
- 防止帳號枚舉,不管帳號存不存在,都出現相同的狀態碼
- 防止暴力破解,加入驗證碼,限定帳號登入次數
- 進行 code Review 確認無身份驗證漏洞
- 注意密碼重設或密碼更改的功能
- 適當的雙因素驗證