【邏輯漏洞】任意賬號密碼重置


0x00   短信驗證碼回傳

1、原理

  通過手機找回密碼,響應包中包含短信驗證碼

2、案例

  某網站選擇用手機找回密碼:

點擊發送按鈕,攔截回包,可以查看到短信驗證碼,如下圖所示:

3、修復建議

響應包中去掉短信驗證碼

0x01   修改用戶名、用戶ID或手機號重置任意賬號密碼

1、原理

  通過手機找回密碼是一般需要短信驗證碼驗證(這里可以嘗試爆破或繞過),當我們輸入正確的手機號和正確的短信驗證碼,然后進入重置密碼的最后一步,也就是輸入新的密碼,輸入密碼后提交到服務端的post數據包需要包含當前用戶的身份信息,而一般網站是通過用戶名或用戶ID來標識用戶身份的,如果這個用戶名或用戶ID沒有和當前手機號、短信驗證碼進行綁定,也就是說服務端只驗證用戶名、ID是否存在,而不去驗證用戶和當前手機號是否匹配,那么我們就可以通過修改用戶名、ID去修改其他用戶的密碼了。當然可以修改的地方不限於找回密碼的數據包,比如修改資料的地方也可能存在這樣的漏洞。

 2、案例

以某網站修改任意用戶資料導致修改任意賬號密碼為例,截取的數據包為:

POST /user/info_do HTTP/1.1
Host: www.XXX.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://www.XXX.com/user/info_view
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 211
Cookie: yunsuo_session_verify=9341a54b945886e9485ff54a17650468; PHPSESSID=sgbibaqe7f8f6okerps8jip916; sdrcUserlockcount=1; sdrcUseruserid=14943
Connection: keep-alive

password=A123456&email=1%40qq.com&address=1&postcode=1&mobile=13888888888&sex=man&birthday=0000-00-00&degree=collegeLT&testsite=1&post=1&__hash__=b0b15b067dea00bd34fd39421b7ef684_efc2399e5c4b2071f261e75fe3362d4fa

經分析與嘗試,發現數據包中的sdrcUseruserid的值是用來標識當前用戶身份的,那么我們就想到這個id可否任意修改呢?答案是肯定的,我們修改id的值為14942、14941都是可以成功的,截圖如下:

3、修復建議:

  • 用戶操作個人信息(讀取、修改)時,服務端要對當前用戶身份進行驗證,防止越權操作;
  • 用來標識用戶身份的名稱或ID可以使用自定義加密,也可以隱藏這些參數,直接從cookie中獲取用戶信息;
  • 用戶修改密碼時應該先對舊密碼進行驗證,或者使用手機短信驗證;
  • 用戶修改手機號時需要先對原手機號進行驗證。

0x02   修改響應包重置任意賬號密碼

1、原理

  通過手機找回密碼一般需要短信驗證碼驗證,服務端需要告訴客戶端,輸入的驗證碼是否正確,如果客戶端收到true的信息,那么就會向帶着true的信息向服務端請求進入下一步,而服務端收到true的信息,就會允許客戶端進入下一步,反之,如果是false的信息,服務端就不會允許客戶端進入下一步。也就是說我們進入下一步的關鍵是讓服務端收到客戶端的true信息,而借助burpsuite,我們可以修改服務端返回到客戶端的信息,這樣一來,我們就可以輸入任意短信驗證碼,然后將服務端返回的false信息改為true就可以繞過短信驗證碼的驗證了。

2、案例

下面是找回密碼的一個流程,輸入正確的用戶名,跳到第二步,這時需要輸入短信驗證碼,這里我們隨意輸入一個短信驗證碼:123456,然后抓取服務端返回的信息如下所示。

 

 

把回包中false改為true后,即可繞過短信驗證碼驗證,結果如下圖所示。

3、修復建議

  • 服務端對驗證碼進行驗證,結果為true時直接跳到下一步,無需向客戶端單獨返回驗證結果;
  • 輸入新的密碼,然后提交到服務端,服務端應對當前用戶名、手機號、短信驗證碼進行二次匹配驗證,都為true時,才可以修改成功。

0x03   跳過驗證步驟重置任意賬號密碼

1、原理

  找回密碼流程一般需要四個步驟:1、驗證用戶名;2、驗證短信驗證碼;3、輸入新密碼;4、重置成功。這四個步驟應該緊緊相連,互相相關,只有通過了第一個步驟驗證才可以進入下一個步驟,如果每個步驟之間沒有進行關聯性驗證,就可能導致跳過關鍵驗證步驟,從而導致重置任意賬號密碼。

2、案例

某網站找回密碼有四個步驟,第一步輸入正確的用戶名,第二步輸入手機號和正確的驗證碼,截取服務端返回的數據包為:

<html><head><title>object moved</title></head><body>
<h2>object moved to <a href="/Personal/sys/getpasswordreset">here</a>.</h2>
</body></html>

上述數據包是用來跳轉到輸入密碼的界面,我們猜想能否輸入任意驗證碼,然后直接訪問輸入密碼界面,結果是可以的,而且重置密碼成功了。經分析,此處成功的關鍵是頁面跳轉到輸入密碼界面,當我們輸入新的密碼后,提交到服務端,服務端並沒有對當前用戶身份進行二次驗證,只是簡單的獲取到用戶名或ID以及新密碼,從而導致跳過短信驗證碼驗證重置任意賬號密碼。

3、修復建議

  • 每一個步驟都要對前一個步驟進行驗證;
  • 最后提交新密碼時應對當前用戶名或ID、手機號、短信驗證碼進行二次匹配驗證。

0x04   重置密碼鏈接中token值未驗證或不失效導致任意賬號密碼重置

1、原理

使用郵箱重置密碼時,服務端向郵箱發送一個重置密碼的鏈接,鏈接中包含當前用戶的身份信息(如用戶名或用戶ID)和一個隨機生成的token信息,如果未對token值進行驗證或是驗證后不失效,我們就可以通過修改用戶名或用戶ID來重置任意賬號密碼。

2、案例

某網站使用郵箱找回密碼時,服務端向郵箱發送的鏈接為:

http://www.xxx.com/GetPwd.aspx?q=0x0531387a5a6c1227e4d6ba0ce16dc72e&r=3244166

經嘗試,此處未對隨機生成的q值進行驗證或是驗證了但是驗證之后未失效,導致可以重復使用,最終只需要修改r為其他用戶ID,即可重置其他用戶密碼。

 3、修復建議

  • 服務端對客戶端提價哦的token值進行驗證;
  • 保證token值使用一次后即失效,防止重復使用;
  • 對用戶ID進行自定義加密;
  • 使用根據用戶ID生成的token值來標識用戶,鏈接中不攜帶用戶ID。

0x05   找回密碼的短信驗證碼可被爆破導致任意賬號密碼重置

 1、原理

找回密碼時使用位數較少的短信驗證碼,或者驗證碼沒有設置有效時間限制,導致攻擊者借助自動化工具在一定時間范圍內爆破獲得短信驗證碼,從而導致重置任意賬號密碼。

2、案例

某網站找回密碼時使用短信驗證碼的一個數據包為:

Code=5000&u=13888888888&Check=dc5b94101cb4f23a9ce6ae71197fc5de&a=5

此處可以對Code進行爆破,如下圖所示:

3、修復建議

  • 驗證碼滿足一定復雜度,且限制驗證碼生效時間;
  • 驗證短信驗證碼的數據包使用token值並驗證,防止自動化工具爆破

還有cookie替換之類的,因為沒遇到實例,這里暫時不整理了,之后遇到了再補上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM