任意使用者密碼重置(一):重置憑證洩漏
前言
在邏輯漏洞中,任意使用者密碼重置最為常見,可能出現在新使用者註冊頁面,也可能是使用者登入後重置密碼的頁面,或者使用者忘記密碼時的密碼找回頁面。其中,密碼找回功能是重災區。我把日常滲透過程中遇到的案例作了漏洞成因分析,這次,關注因重置憑證洩漏導致的任意使用者密碼重置問題。
案例一
用郵件找回密碼時,作為重置憑證的驗證碼在 HTTP 應答中下發客戶端,抓包後可輕易獲取。先用攻擊者賬號走一次密碼找回流程,測試賬號 yangyangwithgnu@yeah.net 選用郵箱找回密碼:
點選獲取校驗碼後抓取如下應答:
其中,VFCode 從字面理解很可能是校驗碼。登入郵箱檢視網站發過來的密碼找回郵件:
發現兩者一致,那麼,幾乎可以確認服務端將密碼找回的校驗碼洩漏至客戶端,可導致任意賬號密碼重置問題。
嘗試找回普通賬號的密碼。密碼找回首頁輸入郵箱後,系統將立即校驗該郵箱是否註冊:
將 UName 引數定義為列舉變數,以常見 qq 郵箱作為字典,可列舉出多個有效郵箱:
以 chenwei@qq.com 為例,在應答包中找到校驗碼,成功將其密碼重置為 PenTest1024,驗證可登入:
嘗試找回管理員賬號的密碼。從該網站的域名註冊資訊中找到聯絡人的郵箱為 fishliu@xxxx.cn,可推測後臺使用者的郵箱字尾為 @xxxx.cn,所以,用常見後臺使用者名稱簡單調整可構造出後臺使用者郵箱字典,列舉出大量後臺使用者:
同理可重置這些後臺使用者的賬號密碼,為避免影響業務,不再實際操作。
案例二
用郵件找回密碼時,帶憑證的重置連結洩漏至客戶端,抓捕可獲取。用攻擊者賬號走一次密碼找回流程。在找回密碼頁面輸入攻擊者賬號及其郵箱(yangyangwithgnu、yangyangwithgnu@yeah.net)後提交:
攔截如下應答:
顯然是個重定向,isVerify、PassPhrase 這兩個引數很可疑,後續互動中應留意,先放包,進入傳送重置郵件的頁面,輸入驗證碼後提交。登入攻擊者郵箱檢視重置郵件:
這個帶 token 的重置連結似曾相識,對,就是前面抓包獲取的 token 資訊,比對看下:
forgotPwdEa.php?isVerify=eWFuZ3lhbmd3aXRoZ251fHlhbmd5YW5nd2l0aGdudUB5ZWFoLm5ldHw2MzQyNDkw&PassPhrase=01e4f6d4ede81b2604dc320bc4e3a6e8
forgotPwdEc.php?isVerify=eWFuZ3lhbmd3aXRoZ251fHlhbmd5YW5nd2l0aGdudUB5ZWFoLm5ldHw2MzQyNDkw&PassPhrase=01e4f6d4ede81b2604dc320bc4e3a6e8
唯一區別 forgotPwdEa 和 forgotPwdEc 兩個檔名。
接下來驗證通過服務端洩漏的 token 能否重置普通使用者的賬號密碼。從重置流程可知,要重置密碼必須提供使用者名稱及其郵箱(或手機號)。
獲取有效使用者名稱。註冊頁面中,輸入使用者名稱後立即校驗該使用者名稱是否被佔用:
對應請求、應答如下:
使用者名稱已存在返回 failed,不存在返回 ok。以此特徵,用常見國人姓名字典,可列舉出大量有效使用者名稱(如 chenchuan、chenanqi、chenanxiu、zhangfeng 等等),存為 username.txt。
獲取有效使用者名稱對應郵箱。密碼找回首頁提交的請求中,user_name 與 email 引數匹配情況下,HTTP 應答程式碼為 302,互動包如下:
可以此特徵列舉有效使用者名稱及其郵箱。現在考慮如何製作郵箱字典?很多使用者喜歡用使用者名稱註冊 qq 郵箱,換言之,使用者名稱 yangyangwithgnu 可能對應郵箱 yangyangwithgnu@qq.com。所以,用前面已經獲取有效使用者名稱字典 username.txt 快速製作了郵箱字典 qq-email.txt,其中,username.txt 與 qq-email.txt 逐行對應。
例如,前者第一行為 yangyangwithgnu、後者第一行為 yangyangwithgnu@qq.com。將上面的資料包放入 burp 的 intrduer 中,攻擊型別選 pitchfork、user_name 的引數值定義為列舉變數 1 並載入字典 username.txt、email 的引數值定義為列舉變數 2 並載入字典 qq-email.txt,可列舉出大量有效使用者名稱/郵箱資訊,如,zhangfeng/zhangfeng@qq.com、chenchuan/chenchuan@qq.com 等等。
用普通賬號 chenchuan/chenchuan@qq.com 演示密碼重置漏洞。輸入使用者名稱、密碼提交,正常完成密碼找回邏輯,從互動包中獲取服務端下發的重置 token:
isVerify=Y2hlbmNodWFufGNoZW5jaHVhbkBxcS5jb218MTE2MDIzNw==&PassPhrase=cbf0160662358808f3586868f041cbaa
拼裝為重置連結
http://www.xxxx.com/user/forgotPwdEc.php?isVerify=Y2hlbmNodWFufGNoZW5jaHVhbkBxcS5jb218MTE2MDIzNw==&PassPhrase=cbf0160662358808f3586868f041cbaa訪問之,即可進入密碼重置頁面:
輸入新密碼 PenTest1024 後系統提示修改成功。用 chenchuan/PenTest1024 成功登入:
防禦措施上,密碼找回的憑證切勿下發客戶端,另外,校驗郵箱是否有效應新增圖片驗證碼,以防止關鍵引數被列舉。
相關文章
- 任意使用者密碼重置(五):重置憑證可暴破密碼
- 任意使用者密碼重置(二):重置憑證接收端可篡改密碼
- 任意使用者密碼重置(三):使用者混淆密碼
- 重置PbootCMS使用者密碼boot密碼
- Ubuntu重置root密碼Ubuntu密碼
- centos 7 重置密碼CentOS密碼
- MySQL 重置Root密碼MySql密碼
- mysql 8 如何重置 root 使用者密碼MySql密碼
- MySQL 8 下重置密碼MySql密碼
- MySQL 8.0 重置 root 密碼MySql密碼
- linux重置寶塔密碼Linux密碼
- CentOS 7.5 重置 root 密碼CentOS密碼
- Django搭建個人部落格:重置使用者密碼Django密碼
- Microsoft.AspNet.Identity 重置密碼ROSIDE密碼
- 邏輯漏洞之密碼重置密碼
- MySQL 資料庫重置密碼MySql資料庫密碼
- laradock 重置 portainer 密碼的方法AI密碼
- Oracle 重置密碼及基本操作Oracle密碼
- mac版MySQL重置初始密碼MacMySql密碼
- Mac下MySQL密碼重置方法MacMySql密碼
- phpMyAdmin重置WordPress管理員密碼PHP密碼
- PbootCMS忘記密碼後的重置密碼流程boot密碼
- 群暉NAS忘記密碼如何重置密碼密碼
- Azure VM域控密碼重置方法密碼
- MySQL 8.0.15忘記密碼重置方法MySql密碼
- rocky9如何重置root密碼密碼
- centos7的root密碼重置CentOS密碼
- ubuntu 雲映象預設密碼重置Ubuntu密碼
- 記一次MySql重置root密碼無效MySql密碼
- Ata Hakçıl :每142個洩漏憑證中就有1個使用“123456”作為密碼密碼
- 任意使用者密碼重置(六):應答中存在影響後續邏輯的狀態引數密碼
- Win10 1909系統如何重置開機密碼_Win10 1909開機密碼重置方法Win10密碼
- mysql5.7重置root密碼MySql密碼
- linux破解root登入密碼,並重置Linux密碼
- Tool-Gitlab-重置root賬戶密碼Gitlab密碼
- Laravel 重置密碼傳送郵件分析Laravel密碼
- 如何在Mac上重置MySQL根密碼MacMySql密碼
- 在Linux中,如何重置 mysql root 密碼?LinuxMySql密碼