任意使用者密碼重置(六):應答中存在影響後續邏輯的狀態引數

FLy_鵬程萬里發表於2018-06-06

前言

在邏輯漏洞中,任意使用者密碼重置最為常見,可能出現在新使用者註冊頁面,也可能是使用者登入後重置密碼的頁面,或者使用者忘記密碼時的密碼找回頁面,其中,密碼找回功能是重災區。我把日常滲透過程中遇到的案例作了漏洞成因分析,這次,關注因重置憑證可暴破導致的任意使用者密碼重置問題。

密碼找回流程一般包括獲取簡訊驗證碼、校驗簡訊驗證碼是否有效、設定新密碼等三個步驟。在第二步,校驗簡訊驗證碼是否有效的結果應儲存在服務端,某些網站未在服務端儲存而是錯誤地將結果狀態值下發客戶端,後續又依靠前端 js 判斷是否可以進入第三步,那麼,更改應答包中的狀態值,可重置其他使用者的密碼。

案例一

在密碼找回頁面 http://www.xx.cn/yy/action/forgot 用攻擊者手機號 13908081024 進入密碼找回全流程,獲取簡訊驗證碼 033128、輸入圖片驗證碼、輸入簡訊驗證碼並提交:

服務端校驗通過後,系統應答如下:


簡單分析發現,校驗通過時服務端並未向客戶端 set-cookie,猜測服務端並未記錄校驗狀態,是否進入設定新密碼頁面完全是由前端 js 基於應答狀態決定的,那麼,即便我沒有簡訊驗證碼,通過將服務端下發給客戶端的校驗狀態從“失敗”改為“成功”,也能成功重置找回賬號密碼。

具體而言,以資訊蒐集時找到的客服手機號 13980808888 為例。輸入手機號、獲取簡訊驗證碼、輸入圖片驗證碼、輸入錯誤的簡訊驗證碼 123123 後提交:


由於簡訊驗證碼錯誤,系統校驗肯定失敗,系統應答如下:


攔截該應答,用前面抓取校驗成功的應答包替換之:


放行至客戶端,順利進入新密碼設定頁面:



輸入新密碼 PenTest1024 後提交,頁面提示密碼修改成功:



嘗試用 13980808888/PenTest1024 登入,驗證成功


案例二

在密碼找回頁面 http://www.xx.cn/yy/forgot 用攻擊者手機號 13908081024 進入密碼找回全流程,獲取簡訊驗證碼 2118、輸入簡訊驗證碼並提交:


服務端校驗通過後,系統應答如下:


簡單分析發現,校驗通過時服務端並未向客戶端 set-cookie,將服務端下發給客戶端的校驗狀態 code 改為“0000”,可以重置其他使用者密碼。

具體而言,以土豪手機號 13888888888 為例。輸入手機號、獲取簡訊驗證碼、輸入錯誤的簡訊驗證碼 1234 後提交。由於簡訊驗證碼錯誤,服務端校驗失敗,應答如下:


攔截該應答,用前面抓取校驗成功的應答包替換之後,放行至客戶端,順利進入新密碼設定頁面:


輸入新密碼 PenTest1024 後提交,頁面提示密碼修改成功。嘗試用 13888888888/PenTest1024 登入,驗證成功:


加固措施

服務端校驗簡訊驗證碼後應通過 cookie 記錄狀態,不應在前端通過狀態引數判斷。另外,服務端應限制列舉等惡意請求。


相關文章