公司短信平臺上的2萬塊錢,瞬間就被黑光了前端
來自專輯
胡說閒扯
古時的風箏第 83 篇原創文章 程序員
做者 | 風箏
公衆號:古時的風箏(ID:gushidefengzheng)
轉載請聯繫受權,掃碼文末二維碼加微信算法
前兩天的中午像往常同樣熱,太陽不知疲倦的在天空燃燒,熱跑了雲彩和鳥兒,立刻就要點燃空氣和個人腦神經。爲我和電腦降溫的,是我簡陋的書桌上的小電扇,沒有它的話,鍵盤太熱,我可能就要寫不下去代碼了。
後端
簡陋的書桌
正在此時,旁邊的手機嗡嗡的震了兩聲,對於手機歷來不敢開鈴聲的人來講,這個震動的聲音實在太熟悉了,不用說,應該是廣告短信,或者有人加我微信好友了。由於短信我基本上歷來不看,微信消息不會有提示,只有加好友纔有,因爲最近有很多朋友看到我寫的文章,因此天天加我好友的仍是很多的,我都是找空閒時間統一處理。因此,我仍是繼續寫個人代碼,沒有理會。api
過了兩分鐘左右,嗡嗡~~又震了兩聲,不慌,繼續寫代碼。而後嗡嗡 ~~ 又震了兩聲,接着又震了兩聲,我心想,難道又是哪一個大號轉了我文章了(內心略帶幾分得意),淡定,繼續寫代碼。安全
這時候已經持續了 六、7次,我剛要拿手機看一下,忽然有事兒,趕忙開門出去了,過了20分鐘回來以後,發現手機還在震。我趕忙拿起來一看,未讀短信數量變多了(這是寫文章的時候截的圖,真實數量比這個還要多一點,被我點了)。服務器
我去怎麼這麼多短信了,我記得很清楚,原本才 820 多條(是在要對有強迫症的朋友表示歉意,這圖可能讓大家看上去很不爽),原諒我不怎麼看短信,一直堆積了 800 多條。怎麼半個小時的時間多了好幾十條,我打開一看,都是某不知名公司的登陸驗證碼消息,就像下面這樣。微信
【XX科技】您正在短信登陸,驗證碼689287,請在15分鐘內提交驗證碼,切勿將驗證碼泄露於他人。
瞬間讓我想到一個詞:短信轟炸機。what,有人轟炸我,我得罪什麼人了嗎,因而大腦飛速運轉。併發
難道是前幾天問我問題我沒及時回答,而後罵我,被我刪掉的那個兄弟吧?dom
難道是最近那個絕不客氣、素不相識,上來就讓我幫他抓數據,我讓他滾的那個總監吧?
又或者是屢次舉報我文章非原創的某大佬吧?
值得嗎,不至於嗎,這麼勞神傷財費力的,不至於吧。就在我思考的時間內,手機平靜了,不響了,事實證實我可能想多了,可能就是某短信轟炸機轟炸的時候定位錯了目標,而後及時發現了,或者其餘什麼緣由。
這個場景勾起了個人某些回憶,與此同時,我對XX科技表示深切的同情。幾年前,我所在的創業公司就被短信轟炸機利用,一夜,短信平臺上的 2 萬塊錢化爲烏有。
短信轟炸機
手機短信轟炸機是批量、循環給手機無限發送各類網站的註冊驗證碼短信的方法。通常一分鐘能夠收到超過一百條短信,可用於測試手機的短信接收速度。能夠是在電腦運行或是手機運行。
好比有人想整你,花點錢買個短信轟炸或者電話轟炸(學名呼死你)的服務,你的手機瞬間變成一個高頻振動器或者循環鈴聲播放器,輕則讓你手機發燙,重則直接沒電關機。
如今的短信平臺不少,好比騰訊、阿里、華爲何的一大堆,並且都有防盜刷等功能,當時,不知道老闆從哪一個渠道找到的一個短信平臺,具體名字已經不記得了,畢竟已經好幾年了。當時,那個平臺好像是充 2 萬,送 5000,因此老闆直接充了兩萬,按照幾分錢一條短信計算,以當時公司業務體量來看,用到公司倒閉可能都用不完。
那時候,通過幾個月的艱苦奮戰,開發的產品順利上線,可是沒有推廣,正在進行最後的線上測試,只是公司內部人測試,還有認識的一些朋友用用,順道幫忙測試一下,眼看着就要開始大範圍推廣了。
某晚夜黑風高,老闆忽然打電話過來,說他收到了短信平臺費用預警通知,顯示餘額所剩很少,讓我趕忙登陸看一下是什麼狀況。當我進入頁面的那一刻,我驚呆了,已用 4 萬多條,剩餘幾千條了。趕忙給客服打電話詢問狀況,其實到這一刻的時候,咱們還沒意識到是系統安全漏洞被利用了,客服解釋說這個帳號確實是一直在發短信,短信內容是驗證碼相關的,而且如今還在持續發,詢問是否要先把服務停掉。
什麼,還在持續的發,那趕忙先停了再說,因而讓客服操做先把服務停了。
當時我也是初入互聯網,並不知江湖如此險惡,團隊也是草臺班子,也都沒想到會出現這種問題。當我冷靜下來開始思考而且到搜索引擎搜索相關問題的時候,我找到了短信轟炸機的這個概念,短信轟炸機最喜歡利用具備安全漏洞的開放平臺的短信發送接口了,好比註冊、登陸接口,而咱們的網站確實因爲沒作驗證碼發送的防禦措施,致使漏洞產生,從而被利用了,說到底,仍是當時能力不到位。
到如今爲止我也不知道當時咱們這個還沒推廣的小產品是怎麼被盯上,而後被利用的。有說多是短信平臺方有內鬼,把客戶信息賣給第三方平臺,或者就是自產自銷,短信快點兒用完,就能夠趕忙續費了呀。
還有說是短信轟炸平臺會黑掉這些正常的短信平臺,而後找到使用方,進而利用。
還有說,他們就是全網掃這種 register、login 等相似的 url,掃通了就收集起來,進一步處理,並發現其中能夠被利用的。
但具體是哪一種,我也不知道,反正就是你不作好防禦,就得被利用。
這其實就是安全漏洞了,只不過比較低級,低級到什麼程度了呢?就是你在註冊頁面輸入手機號以後,點擊「發送驗證碼」按鈕,只會判斷手機號是否合法和是否已經註冊,不然就直接發驗證碼,這叫無知無畏。這就至關因而開門迎客的狀態,不須要權限,沒有調用頻次限制,也沒有什麼 token 之類的作校驗。
當時停掉短信服務以後,我立刻去看了後臺日誌,發現有不少不一樣的 IP 在不斷的發來請求,喪心病狂的是,雖然短信服務已經停了,可是請求還在不斷涌來。看來這就是一套完整的自動化流程,用 IP 池動態代理,模擬發送請求,咱們的短信接口只不過就是其中一個微不足道的免費資源而已。
停掉服務
當時已經很晚了,快要凌晨了,可是大腦被刺激的非常清醒。首先想的就是別管怎麼樣,先讓服務正常可用吧。可是請求還在一直過來,因而,我先把 Nginx 服務關閉了,既然你這麼智能,接口你訪問不到,是否是就會停了。停了 5 分鐘以後,我剛一重啓,立刻日誌又被填滿,事實證實不是它不智能,是我弱智了。它才無論你,它就是一臺沒有感情的自動請求機器。
更換接口地址
行吧,我認慫能夠吧,服務我又不能停,你這臺沒有感情的機器我也控制不了,那我先改了接口地址。因而我把註冊、登陸的接口地址先給換了,這樣一來,總能把短信服務先剝離開,先減輕點服務器壓力吧。但仍是不敢把短信服務打開,萬一它又發現咱們的新接口了呢。
這時已經很晚了,還好產品尚未推廣,沒什麼人用,就先睡了,等着次日處理。
加圖形驗證碼
次日早早去公司,第一件事兒,就是看看那臺沒感情的機器是否是放過咱們了,結果一看日誌,心忽然有點兒涼,我休息了一晚,它卻沒休息。
有同事說,要不換 IP 吧?
大哥,人家請求的是域名,卻是能夠換個二級域名,以前是 api.xxxx.com 做爲後端服務 domain 的,因而有同事開始鼓搗換二級域名。
我這邊開始加其餘規則,首先想到的就是加驗證,在發送驗證碼以前加個圖形驗證,當時找到了「極驗」提供的行爲驗證的方式。就是你們常常看到的下面這種方式,在發送驗證碼以前先讓用戶完成行爲校驗,基本上能夠把機器人阻擋在外,並且集成很簡單。
image-20200702095741892
可是,諮詢了一下費用,當時就被勸退了,當時是年費 5 萬,不知道如今多少錢了。
圖形驗證碼也不錯,關鍵是不用花錢啊,因而找了開源代碼,作了圖形驗證碼。當時爲了更加安全,讓機器更難破解,當時作了 6 位字母、數字組合,而且干擾因素加的很足。事實證實不只能放防機器,還能防人,不少同事作測試的時候表示常常很難辨認出來。因而改爲了 4 位,而且下降了干擾因素。
image-20200702100431130
有了此次教訓,當我看到 12306 一步步升級驗證碼難度的時候,我能體會到 12306 的無奈和心裏的彷徨。
不就是這樣嗎
限制訪問頻次
加了圖形驗證碼是第一步,還不行,萬一被繞過了,畢竟自動識別驗證碼也只是增長了門檻,若是真有人想搞你,仍是攔不住的。
限制單個手機號的驗證碼請求頻次,5分鐘內只容許發送三次,一小時內超過 9 次就限制24小時不容許發送。
除了限制手機號的頻次外,還限制單個 IP 的請求頻次,規則是同樣的。
設置黑名單
可是對方使用的是動態 IP 池,可能不會 5 分鐘內連續請求。經過日誌分析,發現這段時間內共有幾百個 IP在發請求過來,因而把這段時間內單 IP 請求超過 10 次的所有加入黑名單。
而且4小時單 IP 請求超過 8 次的都加入黑名單。固然這些規則都是經過觀察日誌獲得了,固然最終的科學依據是「拍腦殼」。
以後有請求過來,先看 IP 是否在黑名單中,若是在,就直接拒絕。
其餘方式
除了以上措施外,還有其餘的一些防禦方式。
好比在用戶進入前端頁面(登陸或註冊頁)的時候生成一個或者請求一個 Token,而後請求的時候對 Token 作校驗,你能夠寫一些比較複雜的算法邏輯在裏面。固然這也只是增長了門檻而已,若是被掌握了流程,仍是同樣會被利用。
舊的域名接口也一直保留着,倒要看看它會請求多久,過了差很少 八、9 天吧,請求才消失。
安全問題也是互聯網開發中很重要的方面,可是常常被開發人員忽視。細思極恐,若是是在產品剛推廣的時候出現問題,那對用戶的傷害真的是極大的。
有一些初創公司就是由於某些安全漏洞,直接致使公司關門大吉。大廠更是面臨風險,不少實力雄厚的羊毛黨就是利用漏洞來薅羊毛的,好比前段時間某大商城因爲優惠券漏洞被薅了幾千萬。
只要有利可圖,就有被利用的風險,安全問題,還需謹慎對待。
公衆號:古時的風箏
一個兼具深度與廣度的程序員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!你可選擇如今就關注我,或者看看歷史文章再關注也不遲。
技術交流還能夠加羣或者直接加我微信。