Article / 文章中心

安全测试 : 搜狗(sogou.com)网站短信接口安全测试,短信接口防盗刷测试

发布时间:2021-04-12 点击数:3086

– “隐患险于明火,防范胜于救灾,责任重于泰山”

 

安全问题不容忽视,不要亡羊补牢!

 

前言

本文详细介绍了针对发送短信验证码接口的安全性测试过程,包含思路、部分测试代码已经测试结果。
本次测试网站 —搜狗(sogou.com)
搜狗搜索是全球第三代互动式搜索引擎,支持微信公众号和文章搜索、知乎搜索、英文搜索及翻译等,通过自主研发的人工智能算法为用户提供专业、精准、便捷的搜索服务。

一丶找到对外短信接口

从该网站注册入口可以发现,有提供发送短信验证码的服务。在这里插入图片描述

二丶分析外部防御措施

  1. 输入手机号
    在这里插入图片描述

  2. 点击发送验证码
    在这里插入图片描述

这里需要先输入算数验证码,输入后才可点击发送

在这里插入图片描述

外部防御措施:算数验证码

三丶查看请求报文

1. 找到发送短信的请求

按下F12打开浏览器控制台,再次点击发送验证码按钮通过控制台找出发送短信的请求。
在这里插入图片描述

2. 查看请求方式

在这里插入图片描述

3. 查看请求报文头
在这里插入图片描述

4. 查看请求参数
在这里插入图片描述

captchaCode为图片验证码的值
5. 查看返回值
在这里插入图片描述

四丶分析测试

1. 分析测试要点

  • 请求须携带图形验证码参数
  • 请求中携带token参数

2. 编写代码模拟请求进行测试

该网站的图形验证码为中文类型的简单计算题的验证码:

在这里插入图片描述

识别方法:通过机器学习,图像处理等方法创建识别库 / 通过打码平台识别。

大致思路:

  • 处理图片,将图片通过降噪,二值化等方式处理
  • 将字符分割,学习训练
  • 最终识别出图片中的各个字符

这里不做赘诉,感兴趣可以看下相关验证码识别的文章:

接着利用Java模拟报文请求 ,进行测试。部分代码如下:

//配置请求头
	inheads.put("Host", "www.sogou.com");
	inheads.put("Accept", "application/json, text/javascript, */*; q=0.01");
	inheads.put("X-Requested-With", "XMLHttpRequest");
	inheads.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
	inheads.put("Referer", "https://www.sogou.com/register");
//配置请求参数
	List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();
	params.add(new BasicNameValuePair("client_id", "2017"));
	params.add(new BasicNameValuePair("mobile", phone));
	params.add(new BasicNameValuePair("captcha", input.get("imgCode")));
	params.add(new BasicNameValuePair("token", "3267574cf7a9289da2fce68b296c9d35"));
	params.add(new BasicNameValuePair("t", "" + System.currentTimeMillis()));
//配置请求
		Hashtable<String, String> inheads = new Hashtable<>();
		LinkedHashMap<String, String> outheads = new LinkedHashMap<>();
		Map<String, String> imgOutMap = new HashMap<>();
		RetEntity retEntity = new RetEntity();
		httpclient = createSSLClientDefault();

		input.put("imgFmt", "png");
		input.put("codeType", codetype);
		input.put("lenMin", "1");
		input.put("cleanType", "512");

		String imgCode = getImgeCode(phone, httpclient, cookieStore, "get", imgUrl, inheads, outheads, input, imgOutMap);
		input.put("imgCode", imgCode != null ? imgCode : "");

		retEntity = userClick(httpclient, cookieStore, "post", smsUrl, inheads, outheads, input, phone);
		closeHttpClient(httpclient);

启动测试:

1次:

在这里插入图片描述

手机号码唯一,IP唯一:

10次 --间隔时间1秒:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

手机号码不唯一,IP唯一:

10次 --间隔时间1秒:

在这里插入图片描述
手机号码不唯一,IP不唯一:

10次 --间隔时间10秒:

在这里插入图片描述

五丶结果分析

测试目标:

针对发送短信验证码接口进行安全性测试。

测试思路:

1.找到请求接口
2.分析请求报文
3.模拟请求测试

测试结果:

1.单手机号频率限制(1次/分钟)兼次数限制
2.单IP频率限制(3次/分钟)

测试结论:

前台通过图形验证码,token参数进行限制,后台手机号和Ip均有频率限制或次数限制,当遇到大量更换手机号以及IP的攻击时,该网站的所有防御措施均无效。

风险等级: 

六丶结语

很多人在短信服务刚开始建设的阶段,可能不会在安全方面考虑太多,理由有很多。
比如:“ 需求这么赶,当然是先实现功能啊 ”,“ 业务量很小啦,系统就这么点人用,不怕的 ” , “ 我们怎么会被盯上呢,不可能的 ”等等。

有一些理由虽然有道理,但是该来的总是会来的。前期欠下来的债,总是要还的。越早还,问题就越小,损失就越低。

所以大家在安全方面还是要重视。(血淋淋的栗子!)#安全短信#

谷歌图形验证码在AI 面前已经形同虚设,所以谷歌宣布退出验证码服务, 那么当所有的图形验证码都被破解时,大家又该如何做好防御呢?