# Authentication Lab8 這題二階段驗證(2FA)邏輯錯誤,題目名稱就叫 "2FA broken logic",屬於認證機制設計錯誤的變種,可以用自己的帳號發起請求,卻偷偷指定「Carlos」來產生驗證碼,接著爆破那組碼進行登入。 一樣先進入網站登入帳密去抓 F2A 的請求封包。 ![image](https://hackmd.io/_uploads/ryNoVJwPlx.png) ![image](https://hackmd.io/_uploads/SJ5pVJvPel.png) ![image](https://hackmd.io/_uploads/rkxgByvwxe.png) 接著登出帳號,並去剛剛攔截的封包,把 wiener 改成另一位使用者,這樣就會強制後端為 carlos 產生一組 2FA 驗證碼(就像偷幫他按了登入一樣)。 ![image](https://hackmd.io/_uploads/rJhJUyDPlg.png) 回到` /login`,再次用 wiener 登入,然後進入 `/login2`,輸入一組錯誤的驗證碼讓流程卡住。 ![image](https://hackmd.io/_uploads/H1hr8JwDgg.png) 這是我們將登入的封包拿去爆破 F2A 的數字。 ![image](https://hackmd.io/_uploads/HyqiIJPvxg.png) ![image](https://hackmd.io/_uploads/S1SyPJvPlx.png) ![image](https://hackmd.io/_uploads/rk27wJDDel.png) 發現有一個 302 狀態碼的結果,去複製他的 URL 並前往。 ![image](https://hackmd.io/_uploads/BkGLwywwxg.png) ![image](https://hackmd.io/_uploads/Skpvu1vwlg.png) ![image](https://hackmd.io/_uploads/B1DdOyvvll.png) :::info ### 為什麼這樣會中? 因為這個系統沒有用 session 綁定驗證使用者,卻讓前端可以自定 `verify=carlos`,你就可以代替他產生並猜測驗證碼。 這是邏輯設計錯誤,尤其常見於把 2FA 當作二段表單處理、但沒驗證誰在使用的情況下。 ::: ---