前言
由于网站注册入口容易被黑客攻击,存在如下安全问题:
- 暴力破解密码,造成用户信息泄露
- 短信盗刷的安全问题,影响业务及导致用户投诉
- 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞
所以大部分网站及App 都采取图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度这样的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如何? 请看具体分析
一、 社保通 PC端注册入口
简介:云生集团,成立于2015年,以"让社会更高效"为使命,致力于成为企业信任、人人信赖的人力资源科技和民生服务平台。为中国企业提供自主知识产权的数字化系统解决方案,云生集团目前在全球超过260个城市设立了直营分支机构,构建成服务全球的智慧企业服务骨干网络GSSN,累计服务16000余家企业,150W+企业雇员。
二、 安全性分析报告:
采用第三方的智能验证,包含点击和滑动验证,容易被模拟器绕过甚至逆向后暴力攻击,滑动拼图识别率在 95% 以上。
在测试中点击登录后,闪现出滑动验证的加载页面接着消失,不能正常出现滑动验证,估计存在BUG或智能验证算法存在问题,导致一直跳过。
三、 测试方法:
前端界面分析,这是某第三方的版本,比较简单,网上有大量的文章参考, 我们采用模拟器的方式,关键点主要模拟器交互、距离识别和轨道算法3部分。 测试中发现模拟鼠标无法通过,但采用物理鼠标后,一点就过,并且再也不会弹出滑动窗口。
1. 模拟器交互部分
bash
private static String INDEX_URL = "https://web.hrwork.com/account/register";
@Override
public RetEntity send(WebDriver driver, String areaCode, String phone) {
RetEntity retEntity = new RetEntity();
try {
driver.get(INDEX_URL);
// 1 输入手机号
WebElement phoneElemet = ChromeDriverManager.waitElement(driver, By.id("js-form-mobile"), 10);
phoneElemet.sendKeys(phone);
// 2 获取验证码
WebElement gtElement = ChromeDriverManager.waitElement(driver, By.id("js-btn-send"), 1);
gtElement.click();
// rectTop
WebElement inteliElement = driver.findElement(By.id("rectTop"));
inteliElement.click();
// 3 阿里 滑动验证条
Thread.sleep(1 * 1000);
boolean isRobot = false;
int beginX = 1490;
int beginY = 475;
if (isRobot) {
RobotMove.move(beginX, beginY, 460);
} else {
AliClient.moveExec(driver, 460);
}
Thread.sleep(1500);
String gtInfo = gtElement != null ? gtElement.getText() : null;
retEntity.setMsg(gtInfo);
if (gtInfo.contains("重新发送")) {
retEntity.setRet(0);
} else {
retEntity.setRet(-1);
System.out.println("gtInfo=" + gtInfo);
}
return retEntity;
} catch (Exception e) {
System.out.println(e.toString());
return null;
} finally {
driver.manage().deleteAllCookies();
}
}
2. 物理鼠标移动算法
bash
/**
* 物理鼠标点击
*
* @param beginX
* @param beginY
*/
public static void RobotClick(int beginX, int beginY) {
Robot robot = null;
Double curX = null, curY = null;
try {
// 从当前位置移动到滑动条位置
robot = new Robot();
Point location = MouseInfo.getPointerInfo().getLocation();
curX = location.getX();
curY = location.getY();
Double xAdd = beginX - curX;
Double yAdd = beginY - curY;
//System.out.println("RobotMove() init(curX=" + curX + ",curY=" + curY + ",xAdd=" + xAdd + ",yAdd=" + yAdd + ")");
Double p = (xAdd.compareTo(yAdd) >= 0) ? Math.abs(yAdd) : Math.abs(xAdd);
Double moveX = curX;
Double moveY = curY;
for (int k = 0; k < p.intValue(); k++) {
moveX += xAdd / p;
moveY += yAdd / p;
robot.mouseMove(moveX.intValue(), moveY.intValue());
robot.delay(1);
}
robot.mouseMove(beginX, beginY);
robot.mousePress(InputEvent.BUTTON1_MASK); // 按下左键
} catch (Throwable e) {
System.out.print("RobotMove() " + e.toString());
} finally {
if (robot != null) {
robot.mouseRelease(InputEvent.BUTTON1_MASK); // 松开左键
robot.mouseMove(curX.intValue(), curY.intValue());
}
}
}
3. 测试结果输出:
四丶结语
云生集团,成立于2015年,以"让社会更高效"为使命,致力于成为企业信任、人人信赖的人力资源科技和民生服务平台。为中国企业提供自主知识产权的数字化系统解决方案,云生集团目前在全球超过260个城市设立了直营分支机构,构建成服务全球的智慧企业服务骨干网络GSSN,累计服务16000余家企业,150W+企业雇员,拥有雄厚的技术实力,但采用的是第三方的滑动验证 ,并且为了用户体验采用智能的方式,不能正常加载导致安全隐患。 即使问题解决,其安全性在机器学习的今天, 已经无法应对攻击了,并且正是由于该产品通俗, 所以在网上破解的文章和教学视频也是大量存在,并且经过验证滑动产品很容易被破解, 所以除了滑动验证方式, 花样百出的产品层出不穷,但本质就是牺牲用户体验来提高安全。
很多人在短信服务刚开始建设的阶段,可能不会在安全方面考虑太多,理由有很多。
比如:" 需求这么赶,当然是先实现功能啊 "," 业务量很小啦,系统就这么点人用,不怕的 " , " 我们怎么会被盯上呢,不可能的 "等等。
有一些理由虽然有道理,但是该来的总是会来的。前期欠下来的债,总是要还的。越早还,问题就越小,损失就越低。
所以大家在安全方面还是要重视。(血淋淋的栗子!)#安全短信#
谷歌图形验证码在AI 面前已经形同虚设,所以谷歌宣布退出验证码服务, 那么当所有的图形验证码都被破解时,大家又该如何做好防御呢?
>>相关阅读
《腾讯防水墙滑动拼图验证码》
《百度旋转图片验证码》
《网易易盾滑动拼图验证码》
《顶象区域面积点选验证码》
《顶象滑动拼图验证码》
《极验滑动拼图验证码》
《使用深度学习来破解 captcha 验证码》
《验证码终结者-基于CNN+BLSTM+CTC的训练部署套件》