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.自己的驗證碼和對方的手機号填上,下一步城管設定新密碼
參考連結:
https://woo.49.gs/static/bugs/wooyun-2014-080315.html
https://woo.49.gs/static/bugs/wooyun-2012-013836.html
解決方案:
1.在伺服器進行有效驗證,手機号和驗證碼在伺服器進行唯一性綁定驗證。
2.在服務端限制驗證碼發送周期,設定時效,限制次數。
關于我:一個網絡安全愛好者,緻力于分享原創高品質幹貨,歡迎關注我的個人微信公衆号:Bypass--,浏覽更多精彩文章。