前言
由于网站注册入口容易被黑客攻击,存在如下安全问题:
- 暴力破解密码,造成用户信息泄露
- 短信盗刷的安全问题,影响业务及导致用户投诉
- 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞
所以大部分网站及App 都采取图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度这样的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如何? 请看具体分析
一、 南方周末官网 注册入口
简介:《南方周末》创办于1984年,由南方报业传媒集团主管主办,以“在这里,读懂中国”为追求,以“正义、良知、爱心、理性”为基本理念,是一份在中国有着广泛影响、深具公信力的严肃新闻大报。
二、 安全性分析报告:
采用的是一家短信服务商云片的滑动验证码,容易被模拟器绕过甚至逆向后暴力攻击,滑动拼图识别率在 95% 以上。
三、 测试方法:
前端界面分析, 南方周末采用的滑动验证码比较小众,是一家短信服务商提供的,名字叫云片,和极验不同,这家的网上几乎没有破解教程及源码,不过也没有难度,我们还是采用模拟器的方式,关键点主要模拟器交互、距离识别和轨道算法3部分
- 模拟器交互部分
2. 距离识别
3. 轨道生成及移动算法
-
OpenCv 轮廓匹配测试样例:
四、 南方周末App 端注册入口
app 端点击获取验证码,没有图形验证及交互验证机制,估计是后台有加密。
APP安全分析:
App端经过加固, 采取MD5签名措施,经过脱壳后逆向出源码,手机号签名保护算法暴露
加密算法复原后的算法
/**
* input:list,return:json
*/
@Override
public RetEntity send(CloseableHttpClient httpclient, String phone) {
try {
String type = "4";
String urlPrefix = "type=" + type + "&platform=ireader&device=iPhoneX&version=7.4.2&system_version=13.3";
urlPrefix += "&machine_id=2107B72E-73E4-40FD-9BB1-74099067C72B&format=json&user=" + phone + "&phone_prefix=%2B86";
Map<String, String> hashMap = new HashMap<String, String>();
hashMap.put("user", phone);
hashMap.put("type", type);
hashMap.put("phone_prefix", "+86");
hashMap.put("platform", "ireader");
hashMap.put("version", "7.4.2");
hashMap.put("machine_id", "2107B72E-73E4-40FD-9BB1-74099067C72B");
hashMap.put("format", "json");
hashMap.put("system_version", "13.3");
hashMap.put("device", "iPhoneX");
String link = createLinkString(hashMap);
StringBuilder sb = new StringBuilder();
sb.append(link);
sb.append("v6NesIGMIBGbmKq5");
String sign = MD5Util.getMD5Str(sb.toString());
String url = "https://passport.infzm.com/api/mobile/send_verify_code?" + urlPrefix + "&sign=" + sign;
String response = BasePost.httpGet(httpclient, url, null, null);
RetEntity retEntity = new RetEntity();
retEntity.setRet(-1);
JSONObject jsonRet = (response != null && response.startsWith("{") && response.endsWith("}")) ? JSON.parseObject(response) : null;
String code = (jsonRet != null) ? jsonRet.getString("code") : null;
String msg = (jsonRet != null) ? jsonRet.getString("msg") : null;
if ("200".equals(code)) {
retEntity.setRet(0);
retEntity.setMsg(msg);
} else {
retEntity.setMsg(response);
}
return retEntity;
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
}
private String createLinkString(Map<String, String> map) {
List<String> arrayList = new ArrayList<String>(map.keySet());
Collections.sort(arrayList);
String str = "";
for (int i = 0; i < arrayList.size(); i++) {
String str2 = (String) arrayList.get(i);
String str3 = (String) map.get(str2);
StringBuilder stringBuilder;
if (i == arrayList.size() - 1) {
stringBuilder = new StringBuilder();
stringBuilder.append(str);
stringBuilder.append(str2);
stringBuilder.append("=");
stringBuilder.append(str3);
str = stringBuilder.toString();
} else {
stringBuilder = new StringBuilder();
stringBuilder.append(str);
stringBuilder.append(str2);
stringBuilder.append("=");
stringBuilder.append(str3);
stringBuilder.append("&");
str = stringBuilder.toString();
}
}
return str;
}
报文测试结果:
五丶结语
南方周末作为有着广泛影响、深具公信力的严肃新闻大报, 采用的是短信服务商云片的滑动验证产品, 在一定程度上提高了用户体验, 不过随着图形识别技术及机器学习能力的提升,图形验证方式无法应对以人工智能为基础的人机识别,虽然还有文字点选、逻辑推理等更多复杂的交互验证方式,但本质就是牺牲用户体验来提高安全,并且同样无法应对人机识别。
App 端虽然采用了360加固, 但懂技术的都知道, 客户端无论如何都有可能被逆向,靠加固是否无法保证安全的,
脱壳后的算法就如同皇帝的新装,暴露在黑客面前。
很多人在短信服务刚开始建设的阶段,可能不会在安全方面考虑太多,理由有很多。
比如:“ 需求这么赶,当然是先实现功能啊 ”,“ 业务量很小啦,系统就这么点人用,不怕的 ” , “ 我们怎么会被盯上呢,不可能的 ”等等。有一些理由虽然有道理,但是该来的总是会来的。前期欠下来的债,总是要还的。越早还,问题就越小,损失就越低。
所以大家在安全方面还是要重视。(血淋淋的栗子!)#安全短信#
谷歌图形验证码在AI 面前已经形同虚设,所以谷歌宣布退出验证码服务, 那么当所有的图形验证码都被破解时,大家又该如何做好防御呢?
>>相关阅读
《腾讯防水墙滑动拼图验证码》
《百度旋转图片验证码》
《网易易盾滑动拼图验证码》
《顶象区域面积点选验证码》
《顶象滑动拼图验证码》
《极验滑动拼图验证码》
《使用深度学习来破解 captcha 验证码》
《验证码终结者-基于CNN+BLSTM+CTC的训练部署套件》