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--,每周原創一篇技術干貨。