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