目前兩個漏洞都已經被修復,但是其攻擊方法,對其它APP的攻防提供了一個重要思路。
漏洞獎勵之一
說在前
當用戶使用手機號找回Instagram密碼時,手機會收到一個6位的數字驗證碼,用戶必須輸入這個驗證碼才能重設自己的密碼,驗證碼10分鐘內有效。6位數字,排列組合總共1百萬種(000001 ~ 999999),所以,對於任意一個帳號,在10分鐘內最多嘗試100萬次就能重設他的密碼了。。。
然鵝。。。
通過測試發現,連續發送1000次請求,250次可以過,剩下的750次因為頻率過高被攔截。再嘗試1000次,發現大部分都被攔了。貌似,大多數風控都這種路數,看起來很有效。。。
然鵝,經過測試,發現兩個套路可以繞過他們的頻繁限制機制:
競爭冒險 (組合邏輯電路的概念)
IP輪換
當通過多個IP同時發送請求可以達到發送一大堆請求而不被限制的效果。因為驗證碼10分鐘內過期,經過測算,需要1000個IP來實現這種攻擊。
POC請求重置密碼的驗證碼:
POST /api/v1/users/lookup/ HTTP/1.1
User-Agent: Instagram 92.0.0.11.114 Android (27/8.1.0; 440dpi; 1080×2150; Xiaomi/xiaomi; Redmi Note 6 Pro; tulip; qcom; en_IN; 152830654)
Accept-Language: en-IN, en-US
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip, deflate
Host: i.instagram.com
Connection: keep-alive
q=mobile_number&device_id=android-device-id-here
受害者會收到一個驗證碼,並在10分鐘後過期
發送驗證碼:
POST /api/v1/accounts/account_recovery_code_verify/ HTTP/1.1
User-Agent: Instagram 92.0.0.11.114 Android (27/8.1.0; 440dpi; 1080×2150; Xiaomi/xiaomi; Redmi Note 6 Pro; tulip; qcom; en_IN; 152830654)
Accept-Language: en-IN, en-USContent-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip, deflate
Host: i.instagram.com
Connection: keep-alive
recover_code=123456&device_id=android-device-id-here
上面是一個正常用戶重置密碼的過程,現在以HTTP協議的方式展現。
現在需要做的把這個http請求,利用很多個ip發送出去。
測試時,大概每個ip發送200次請求都沒被攔,使用1000個機器和ip(使並發更容易),發送大約20萬個請求便達到重置密碼的效果。
在實質上的攻擊場景,攻擊者需要用5000IP才可以比較完美地攻擊任意一個Instagram 帳號。這個數字聽起來很大很可怕。可怕那是是以前,在現在,使用雲,例如亞馬遜雲或者Google雲,大概150美元就能完成一次需要100萬次驗證碼的攻擊。
跟第一個很類似,主要有問題的地方在devic_id:
recover_code=123456&device_id=device-id
當用戶請求重置密碼時,有一個device id 會隨著請求發送過去。同一個device id會再一次被用來發送驗證碼。
device id是一個由Instagram app 生成的隨機字符串。所以,如果同樣的device id用來給多個Instagram 帳號請求驗證碼呢?通過測試發現,同一個device id可以用來給不同的帳號請求多個驗證碼。
POC6個數字的驗證碼有100萬種可能。如果我們給很多個帳號都申請重置密碼,那麼我們黑下帳號的概率就提升了。
例如:
如果你用同樣的device id給10萬個帳號申請重置密碼,你就有了10%的成功率,因為有10萬個驗證碼和這個device id綁定在一起了。
如果我們用同樣的device id給100萬個用戶申請密碼重置,那麼這100萬個用戶都和這個device id綁在一起,並且都對應一個6位數的密碼重置驗證碼。我們便可以快速地控制這100萬個帳號,僅僅只需要遞增挨個嘗試驗證碼便可(這個時候,其難度和操作方法就回到了第一個漏洞)。
因此,攻擊者可以給100萬人申請密碼重置來實施100%的攻擊成功率。還需要注意的是,驗證碼10分鐘過期,所以整個攻擊需要在10分鐘內完成。
兩個現在都已經修復。但這兩種方式給APP滲透一個攻擊思路,相信現行的絕大多數APP都沒有充分考慮超大規模的IP攻擊的安全性問題。也給藍隊一個警醒。兩個漏洞的詳情:
https://thezerohack.com/hack-any-instagramhttps://thezerohack.com/hack-instagram-again