進行這個整理,由於在XXX項目的時候,發現登陸處的忘記密碼處,在驗證用戶身份的時候是經過,手機驗證碼驗證的,經過修改響應包的返回參數值,能夠繞過驗證,進入第三步的密碼重置。還有最近測試的一個sso登陸,也存在驗證碼問題。以前的測試中也遇到過相似的驗證碼繞過的漏洞,因此對驗證碼繞過方法進行一個總結匯總、以及關於登陸模塊可能會存在的邏輯漏洞進行一個小整理。php
其實,會出現驗證碼的地方,也就是校驗用戶身份處,好比,登陸、忘記密碼、註冊、綁定、活動領取、反饋處等。而登陸模塊中可能存在的邏輯漏洞,無非就是用戶枚舉、任意用戶密碼重置,固然認證繞過也是邏輯漏洞,這個咱們暫且放在驗證碼裏面。數據庫
0X01 繞太短信驗證碼的方法以及例子瀏覽器
這種是用戶端根據返回的值,來肯定是否進行下一步。好比發送成功返回state的值是success,失敗是false,而後客戶端根據state的值,來肯定下一步的動做。這樣,咱們能夠經過修改響應包,繞過驗證。cookie
好比忘記密碼處:第二步中,對用戶的身份進行短信驗證,可經過修改響應包,將error換爲ok便可繞過身份驗證,到設置密碼處。工具
註冊處,驗證手機驗證碼處,經過修改響應包,或替換爲本身的手機號,繞過驗證碼的限制,形成使用他人手機號進行註冊。post
有些登陸也存在相似的問題,隨便輸入帳號密碼,攔截返回的響應包,將包替換爲A帳號帳號密碼正確的登陸的返回的響應包(前提是,A帳號的cookie是有效的),便可登陸到A帳號。這種也是客戶端,根據響應包的值,來決定下一步動做。測試
這種比較少,由於算是功能問題,在驗證身份時,未對答案進行校驗。就是隨便輸入,就能進入下一步。ui
忘記密碼處,第二步中,選擇其餘方式找回,經過密保找回,未對密保答案進行驗證,隨便輸入答案,便可跳轉到設置密碼處。spa
短信驗證碼處,隨便輸入其餘,驗證碼錯誤,而置空卻不校驗,則能夠經過置空繞過3d
個人==>登錄==>短信驗證碼登錄登錄時抓包把code(驗證碼字段)值置爲空,便可登錄任意帳戶
當修改別人的信息時,須要短信認證時,在發送短信時,咱們能夠嘗試,將手機號替換爲本身的,來獲取短信驗證碼。若是服務端只是檢查驗證碼是否正確,而不是進行手機號和驗證碼匹配的話,或者只是匹配發送短信手機號和驗證碼,咱們就能夠繞過認證。
忘記驗證碼,驗證身份時,在發送短信時,攔截,將手機號替換爲咱們本身的,發送。而後再輸入獲得驗證碼,驗證,若是此時只是驗證碼驗證碼是否正確,便可繞過。可是,若驗證發送手機號和驗證碼是否匹配時,咱們能夠在填好驗證碼,提交時,攔截,將手機號再次改成咱們本身的,便可繞過。
在給手機發送短信驗證碼時,好比phone=13211111111,咱們同時向多個手機號發送短信,用逗號隔開,即phone=13211111111,13233333333。可發送成功。全部手機收到相同的驗證碼,若果,後面在驗證驗證碼時,能夠匹配成功的話,便可繞過驗證碼。另外,這樣能夠向大量手機號發送,形成費用增長。
註冊處,在獲取短信驗證碼時,抓包將mobilePhone的值改成多個手機號,並用逗號分隔,可成功多個手機號發送短信驗證碼。
有的短信驗證碼位數過短,採用4爲純數字的短信驗證碼做爲登陸認證的憑證,這樣如果沒有對次數限制或存在圖形驗證碼的話,就很容易採用工具進行爆破驗證碼登陸。
重置密碼處根據短信驗證碼,是否正確來肯定是否能修改爲功,並且驗證碼是四位純數字的,能夠進行爆破。code=4935&mobile=18556530793&pwd=123456a
註冊、忘記密碼、修改密碼處,均存在發送短信驗證,可能會設置參數值的不一樣,來判斷是執行什麼樣的功能。好比type=1是註冊,type=2是忘記密碼,type=3是修改密碼等。咱們能夠經過修改參數值,來繞過一分鐘內只發送一次限制,達到短信轟炸的目的。
註冊頁面處,URL/public/getPhoneVerifyCodeWithCheckPicVerCode正常邏輯是驗證圖片驗證碼,正確後,再發送手機驗證碼。將請求修改成/public/getPhoneVerifyCode,從而繞過圖片驗證碼的驗證機制。
註冊頁面處,發送短信驗證碼處,能夠結合上例中的繞過圖形驗證碼的機制,發現smsType的值,不一樣時,能夠繞過180秒限制。能夠遍歷修改smsType的值,從而形成短信炸彈。
註冊,在發送手機驗證碼或郵箱驗證碼處,r=2時,連續發送驗證碼,會提醒「從新輸入驗證碼」,說明驗證了圖形驗證碼。可是r=5時,能夠發送成功,連續發送時,提醒「一分鐘內不容許屢次發送」。僅有一分鐘內不容許屢次發送驗證碼限制,可是並未對圖形驗證碼進行校驗,能夠經過甚至頻率,使其,兩分鐘發送一次,一樣能夠形成短信/郵箱轟炸。
綁定手機號處,正常的發送短信的URL是sendSMS4Mobile,嘗試修改URL,是否存在其餘發送接口。通過不斷嘗試,sendSMS接口一樣能夠發送短信。
經過在參數值的前面加上空格,進行繞過一天內發送次數的限制。好比,mobile=13211111111,一天能夠發送10次,超過10次今天將再也不發送,次日才能夠繼續發送。可是,能夠經過在手機號前面或後面加上空格又能夠發送10次。好比,mobile= 13211111111,前面加個空格,就能夠再次發送成功。
有些發送短信的次數是根據cookie值進行判斷,(此cookie值並非登陸狀態下的cookie而不是普通狀態下的),利用當前cookie值來驗證發送次數的話,很容易被繞過。例子https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=27614
以前有個登陸帳號密碼錯誤三次,就會出現圖形驗證碼。可是當關閉瀏覽器,從新打開,再登陸,又會有三次機會,當時,蘆浩分析得出是根據cookie判斷的,而後經過,不斷獲取新的cookie,來繞過三次限制,進而進行帳戶密碼枚舉。
http://wiki.iflytek.com/pages/viewpage.action?pageId=128550855
有些是驗證當前IP,若是當前IP短期內獲取短信或郵件頻繁或達到必定的次數,會鎖定當前IP,這時能夠嘗試經過修改IP或代理IP來進行繞過限制
有時候驗證碼是發送到郵箱的,能夠經過修改郵箱後面字母的大小寫繞過限制。好比:email=****@qq.com,當次數達到限制時,將字母修改成大寫:email=****@Qq.com,便可繞過。
一、服務端對驗證碼進行校驗,短信驗證碼應該根據用戶存在數據庫中的手機號收到的驗證碼進行匹配驗證。
二、增長複雜的圖形驗證碼,且一次性有效
三、限制一天內發送的上限
0X02 用戶枚舉
在驗證用戶身份的時候,或判斷用戶是否已註冊時,若驗證碼處理不當、或錯誤提醒明確,均可能存在用戶枚舉。
忘記密碼處,首先驗證用戶身份,雖然此處有圖形驗證碼,可是,圖形驗證碼不刷新,即不是一次有效,經過攔截請求,發現,並未對驗證碼進行驗證。能夠進行用戶枚舉
手機驗證碼登陸處,在校驗手機號是不是已註冊的手機號時,綁定的手機號和未綁定的手機號,返回的響應包不一樣,並且未增長圖形驗證碼校驗,可對已綁定的手機號枚舉。
忘記密碼處,圖形驗證碼參數爲imageValidCode,重複放包時,發現,驗證碼是一次有效的,通過嘗試,發現刪除imageValidCode參數,能夠繞過驗證碼的驗證機制,從而進行用戶枚舉。爆破已註冊的帳號。
一些錯誤,提醒明確,好比登陸時,輸入帳號、密碼,均錯誤的狀況下,提醒帳號錯誤;帳號正確、密碼錯誤時,提醒密碼錯誤,從而能夠進行枚舉。
登陸處,輸入錯誤的帳號,會提醒用戶不存在;錯誤的密碼,會提醒密碼不正確。可根據提示,進行用戶、密碼枚舉。
關聯帳戶綁定==》切換帳戶處,根據loginname的值,返回對應帳號的綁定的手機、郵箱等我的信息。當loginname爲不存在的帳號時,響應包爲「操做失敗」,並且請求包中,僅有loginname這一個參數,能夠對其進行用戶枚舉。
在密碼修改功能,會驗證原始密碼和帳號的正確性,帳號、密碼都正確時resCode=00100000,帳號錯誤resCode=00100001,msg爲空。帳號正確,密碼錯誤時,msg提醒原始密碼錯誤。能夠進行枚舉其餘帳號、密碼。好比,能夠枚舉密碼爲1111的帳號。
一、 模糊提醒
二、 增長複雜的圖形驗證碼,對於登陸後可能存在的枚舉,增長token,且一次性有效
三、 限制請求頻率,錯誤必定次數,鎖定帳號一段時間
0X03 任意用戶密碼重置
形成任意用戶密碼重置,主要發生在修改密碼、忘記密碼處,在邏輯上處理不嚴謹形成的。好比,忘記密碼處,先驗證身份,驗證經過才容許密碼重置,前面驗證很嚴謹,不能繞過,可是第三步不嚴謹,好比僅根據帳號來進行密碼重置,那就極可能存在任意用戶密碼重置。
忘記密碼處,最後一步更新新密碼處,經過抓包,發現僅是根據帳號進行密碼修改,那麼修改account爲任意存在的帳號,就能夠修改任意帳號的密碼。
一、 邏輯上要嚴謹,不能說前面校驗如今要重置密碼的人是A後,就認爲後面的操做都是A的。仍是要進行校驗確認的。
0X04 附錄
一、 https://www.anquanke.com/post/id/93878
二、 https://wooyun.shuimugan.com/bug/index?BugSearch%5Bvendor%5D=%E8%85%BE%E8%AE%AF