前言
由于网站注册入口容易被黑客攻击,存在如下安全问题:
1. 暴力破解密码,造成用户信息泄露
2. 短信盗刷的安全问题,影响业务及导致用户投诉
3. 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞
所以大部分网站及App 都采取图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度这样的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如何? 请看具体分析
一、 汽车之家会员注册入口
简介:汽车之家(纽约证券交易所股票代码:ATHM;港交所股票代码:2518)以科技驱动持续降低汽车行业决策和交易成本,秉持着专业、好玩的态度,为消费者提供“省心、省时、又省钱”的便捷汽车消费服务体验,致力于成为国际领先的2B和2C的“内容生态+工具服务+交易平台”一站式汽车生活服务提供商,实现真正的“看车-买车-用车-换车”的生态闭环。
二、 安全性分析报告:
采用数美的滑动验证码,容易被模拟器绕过甚至逆向后暴力攻击,滑动拼图识别率在 95% 以上。
三、测试方法:
前端界面分析,采用的是数美的滑动验证码, 网上有现成的逆向文章及视频参考,不过我们这次不用逆向, 只是采用模拟器的方式,关键点主要模拟器交互、距离识别和轨道算法3部分。
测试发现问题:
运行时,偶尔出现停留时间异常的提示, 后来发现纯人工操作也会出现, 害人呀 !!!!
- 模拟器交互部分
public RetEntity send(WebDriver driver, String areaCode, String phone) {
try {
RetEntity retEntity = new RetEntity();
driver.get(INDEX_URL);
// 点击验证码登录
WebElement tabEleme = driver.findElement(By.xpath("//span[contains(text(),'验证码登录')]"));
tabEleme.click();
Thread.sleep(500);
// 输入手机号
WebElement phoneElement = driver.findElement(By.id("phoneno"));
phoneElement.sendKeys(phone);
// 数美滑动按钮
WebElement moveElement = driver.findElement(By.className("shumei_captcha_slide_btn"));
Actions actions = new Actions(driver);
actions.moveToElement(moveElement).perform();
Thread.sleep(1000);
String spCode = "autohome";
long t = System.currentTimeMillis();
String path = dataPath + "/" + spCode + "/" + t + "/";
// 获取大图
WebElement bigElement = driver.findElement(By.xpath("//img[@class='shumei_captcha_loaded_img_bg']"));
String bgUrl = bigElement.getAttribute("src");
if (bgUrl == null) {
System.out.println("bgUrl=" + bgUrl);
return retEntity;
}
File bFile = new File(path + "big.png");
FileUtils.copyURLToFile(new URL(bgUrl), bFile);
byte[] bigBytes = FileUtils.readFileToByteArray(bFile);
// 获取小图
WebElement smallElement = driver.findElement(By.xpath("//img[@class='shumei_captcha_loaded_img_fg']"));
String smallUrl = smallElement.getAttribute("src");
File smllFile = new File(path + "small.png");
FileUtils.copyURLToFile(new URL(smallUrl), smllFile);
byte[] smallBytes = FileUtils.readFileToByteArray(smllFile);
if (smallUrl == null) {
System.out.println("smallUrl=" + smallUrl);
return retEntity;
}
String ckSum = GenChecksumUtil.genChecksum(bigBytes);
String[] result = cv2.getOpenCvDistance(ckSum, bigBytes, smallBytes, spCode, 2);
// 计算距离
Double width = Double.parseDouble(result[0]);
Double d = (Double.parseDouble(result[1]) - width) * 0.64;
int distince = d.intValue();
System.out.println("distince=" + distince);
ActionMove.move(driver, moveElement, distince);
Thread.sleep(3000);
// 点击获取验证码
driver.findElement(By.id("aGetphoneno")).click();
Thread.sleep(1000);
WebElement msgElement = driver.findElement(By.id("phonemsg"));
String msg = (msgElement != null && msgElement.isDisplayed()) ? msgElement.getText() : null;
retEntity.setMsg(msg);
if (msg != null && msg.contains("验证码已发送")) {
retEntity.setRet(0);
} else {
System.out.println("msg=" + msg);
}
return retEntity;
} catch (Exception e) {
System.out.println("send() " + e.toString());
StringBuffer er = new StringBuffer("send() " + e.toString() + "\n");
for (StackTraceElement elment : e.getStackTrace())
er.append(elment.toString() + "\n");
System.out.println(er.toString());
return null;
} finally {
driver.manage().deleteAllCookies();
}
}
2. 距离识别
- 轨道生成及移动算法
- OpenCv 轮廓匹配测试样例:
四丶结语
汽车之家作为汽车资讯行业的知名网站, 采用的却是通俗的滑动验证产品, 该产品稳定并且市场占有率很高, 在一定程度上提高了用户体验, 但安全性在机器学习的今天, 已经无法应对攻击了,并且正是由于该产品通俗, 所以在网上破解的文章和教学视频也是大量存在,并且经过验证滑动产品很容易被破解, 所以除了滑动验证方式, 花样百出的产品层出不穷,但本质就是牺牲用户体验来提高安全。
很多人在短信服务刚开始建设的阶段,可能不会在安全方面考虑太多,理由有很多。
比如:“ 需求这么赶,当然是先实现功能啊 ”,“ 业务量很小啦,系统就这么点人用,不怕的 ” , “ 我们怎么会被盯上呢,不可能的 ”等等。有一些理由虽然有道理,但是该来的总是会来的。前期欠下来的债,总是要还的。越早还,问题就越小,损失就越低。
所以大家在安全方面还是要重视。(血淋淋的栗子!)#安全短信#
戳这里→康康你手机号在过多少网站注册过!!!
谷歌图形验证码在AI 面前已经形同虚设,所以谷歌宣布退出验证码服务, 那么当所有的图形验证码都被破解时,大家又该如何做好防御呢?
>>相关阅读
《腾讯防水墙滑动拼图验证码》
《百度旋转图片验证码》
《网易易盾滑动拼图验证码》
《顶象区域面积点选验证码》
《顶象滑动拼图验证码》
《极验滑动拼图验证码》
《使用深度学习来破解 captcha 验证码》
《验证码终结者-基于CNN+BLSTM+CTC的训练部署套件》