短信驗證碼常被用于網(wǎng)站用戶注冊、賬戶安全登錄以及忘記密碼、確認(rèn)下單等應(yīng)用場景,特別是一些涉及到用戶個人敏感行為時候,為了確認(rèn)操作是用戶本人執(zhí)行的通常會使用短信驗證碼進行二次認(rèn)證。
在實際應(yīng)用中,有很多產(chǎn)品的短信驗證碼接口存在諸多邏輯漏洞,針對手機短信驗證碼可能存在的問題,這里總結(jié)常見的邏輯漏洞如下,供大家參考:
1、短信驗證碼接口沒有設(shè)置下發(fā)頻次
①無限制,任意下發(fā);
②有一定時間間隔,無限下發(fā);
短信驗證碼接口沒設(shè)頻次上限導(dǎo)致短信轟炸。這種情況往往出現(xiàn)在一些小站或者子站,這幾年很少看到通過GET請求發(fā)送短信驗證碼了,基本都是使用POST請求,使用抓包軟件可以重放請求對于后端沒有做限制的網(wǎng)站就可以達(dá)到短信轟炸的效果。
危害:對用戶來說個人生活受到騷擾,對企業(yè)來說造成一定的負(fù)面影響,很多小公司因為短信驗證碼接口被大量調(diào)用出現(xiàn)運營問題,對于公司沒有安全工程師的情況下,一般都是業(yè)務(wù)方發(fā)現(xiàn)了數(shù)據(jù)異常向上匯報,最后和開發(fā)一起反溯才會找到這個問題,那么在這段時間中對企業(yè)所損失的錢也是無法挽回的。
預(yù)防:這里主要是針對兩種攻擊場景來進行防御,第一種是對單用戶的短信轟炸,即重放發(fā)送請求且phonenum為一個值。第二種是對多用戶發(fā)送短信騷擾的場景,即將phonenum參數(shù)設(shè)置為字典,重放短信驗證碼接口。
①設(shè)置發(fā)送間隔,即單一用戶發(fā)送請求后,與下次發(fā)送請求時間需要間隔60秒。
②設(shè)置單用戶發(fā)送上限,即設(shè)置每個用戶單位時間內(nèi)發(fā)送短信數(shù)的上限,如果超過閾值就不允許今天再次調(diào)用短信接口(閾值根據(jù)業(yè)務(wù)情況設(shè)置)。
③設(shè)置單IP發(fā)送上限,這種情況是預(yù)防第二種攻擊場景的,由于IP的特殊性可能存在所處IP是大出口,一旦誤殺后果會很驗證,所以這個限制根據(jù)自身情況酌情考慮,對于有風(fēng)控的團隊來說,當(dāng)發(fā)現(xiàn)發(fā)送IP存在異??梢詫υ揑P增加二次認(rèn)證來防止機器操作,也可以降低誤殺情況。
2、無效驗證
有驗證碼模塊,但驗證模塊與業(yè)務(wù)功能沒有關(guān)聯(lián)性,此為無效驗證,一般在新上線的系統(tǒng)中比較常見。
①獲取短信驗證碼后,隨意輸入驗證碼,直接輸入兩次密碼,可成功更改用戶密碼,沒有對短信驗證碼進行驗證,可能導(dǎo)致CSRF等問題。
②任意用戶注冊
第一步,利用自己的手機號接收驗證碼進行驗證,下一步跳轉(zhuǎn)到一個設(shè)定密碼的頁面
第二步,抓包,篡改手機號,使用任意手機號進行注冊
問題剖析:業(yè)務(wù)一致性存在安全隱患,身份驗證與密碼修改過程分開,驗證無效。
3、客戶端驗證繞過
客戶端驗證是不安全的,可能導(dǎo)致任意賬號注冊、登錄及重置任意用戶密碼等一系列問題。
①直接返回明文驗證碼
②返回密文驗證碼
③攔截替換返回包
4、驗證碼與手機號未綁定
一般來說短信驗證碼僅能使用一次,驗證碼和手機號未綁定,驗證碼一段時期內(nèi)有效,那么就可能出現(xiàn)如下情況:
1、A手機的驗證碼,B可以拿來用;
2、A手機在一定時間間隔內(nèi)接到兩個驗證碼,都可以用。
案例一:任意用戶密碼重置
a、使用自己手機號收取驗證碼
b、自己的驗證碼和對方的手機號填上,下一步城管設(shè)置新密碼
解決方案:
1.在服務(wù)器進行有效驗證,手機號和驗證碼在服務(wù)器進行唯一性綁定驗證。
2.在服務(wù)端限制驗證碼發(fā)送周期,設(shè)置時效,限制次數(shù)。
5、驗證碼爆破
短信驗證碼一般由4位或6位數(shù)字組成,若服務(wù)端未對驗證時間、次數(shù)進行限制,則存在被爆破的可能。 推薦閱讀:60 秒短信驗證背后的危險