注册安全分析陈诉:助通讯息

打印 上一主题 下一主题

主题 649|帖子 649|积分 1947

媒介

由于网站注册入口容易被黑客攻击,存在如下安全题目:

  • 暴力破解暗码,造成用户信息泄露
  • 短信盗刷的安全题目,影响业务及导致用户投诉
  • 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞

    以是大部分网站及App 都接纳图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度如许的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如何? 请看具体分析
一、 助通PC 注册入口

简介:上海助通讯息科技有限公司建立于2011年,总部位于上海、北京设有分公司。在近10年的历程中,以专业的服务团队、国际化、高尺度的工作流程为高出10万余家企古迹单位提供提供国内领先的网络接入服务和互联网行业增值服务。

二、 安全性分析陈诉:

该网站采用的是阿里的滑动条, 阿里的滑动条计划高度重视用户体验,但安全方面存在一定的计划缺陷,前端将密钥显示出来,造成一定程度的安全漏洞,上报后并未引起重视,漏洞依据存在。


三、 测试方法:

前端界面分析,这是阿里的滑动条,网上有一些的教学视频,但情势都差不多,
阿里的滑动条有点像程咬金的三板斧,
1 检测是否是 webdriver (有专门的文章怎么过检)
2 滑动条检测

  1. 滑动条在页面嵌JS 就能过去
  2. <script>
  3. (function () {
  4.     'use strict';
  5.     /**
  6.      * 休眠
  7.      * [url=home.php?mod=space&uid=952169]@Param[/url] time    休眠时间,单位秒
  8.      * @param desc
  9.      * @returns {Promise<unknown>}
  10.      */
  11.     function sleep(time, desc) {
  12.         return new Promise(resolve => {
  13.             //sleep
  14.             setTimeout(() => {
  15.                 console.log(desc, time, 's')
  16.                 resolve(time)
  17.             }, Math.floor(time * 1000))
  18.         })
  19.     }
  20.     /**
  21.      * 监测节点是否存在
  22.      * @param selector    CSS选择器
  23.      * @param desc
  24.      * @returns {Promise<unknown>}
  25.      */
  26.     function obsHas(selector, desc) {
  27.         return new Promise(resolve => {
  28.             //obs node
  29.             let timer = setInterval(() => {
  30.                 let target = document.querySelector(selector)
  31.                 if (!!target) {
  32.                     clearInterval(timer)
  33.                     console.log(desc, selector)
  34.                     resolve(selector)
  35.                 } else {
  36.                     return
  37.                 }
  38.             }, 100)
  39.         })
  40.     }
  41.     function slide(id) {
  42.         var slider = document.getElementById(id),
  43.             container = slider.parentNode;
  44.         var rect = slider.getBoundingClientRect(),
  45.             x0 = rect.x || rect.left,
  46.             y0 = rect.y || rect.top,
  47.             w = container.getBoundingClientRect().width,
  48.             x1 = x0 + w,
  49.             y1 = y0;
  50.         var mousedown = document.createEvent("MouseEvents");
  51.         mousedown.initMouseEvent("mousedown", true, true, window, 0,
  52.             x0, y0, x0, y0, false, false, false, false, 0, null);
  53.         slider.dispatchEvent(mousedown);
  54.         var mousemove = document.createEvent("MouseEvents");
  55.         mousemove.initMouseEvent("mousemove", true, true, window, 0,
  56.             x1, y1, x1, y1, false, false, false, false, 0, null);
  57.         slider.dispatchEvent(mousemove);
  58.     }
  59.     sleep(1,'sleep')
  60.         .then(() => obsHas('.nc_wrapper','has'))
  61.         .then(() => slide('nc_1_n1z'))
  62. })();
  63. </script>
复制代码
1. 模仿器交互

  1.         private final String INDEX_URL = "https://cloud.zthysms.com/#/register?source=www";
  2.         @Override
  3.         public RetEntity send(WebDriver driver, String areaCode, String phone) {
  4.                 RetEntity retEntity = new RetEntity();
  5.                 try {
  6.                         driver.get(INDEX_URL);
  7.                         // 输入手机号
  8.                         WebElement phoneElemet = driver.findElement(By.xpath("//input[@placeholder='输入手机号码']"));
  9.                         phoneElemet.sendKeys(phone);
  10.                         // 阿里滑动条验证
  11.                         boolean isRobot = true;
  12.                         int beginX = 811;
  13.                         int beginY = 609;
  14.                         if (isRobot)
  15.                                 ActionMove.RobotMove(beginX, beginY, 320);
  16.                         else {
  17.                                 boolean aliRet = AliClient.moveExec(driver, 320);
  18.                                 if (!aliRet) {
  19.                                         System.out.println("aliRet=" + aliRet);
  20.                                         return retEntity;
  21.                                 }
  22.                         }
  23.                         Thread.sleep(1000);
  24.                         WebElement sendElement = ChromeDriverManager.waitElement(driver, By.xpath("//span[text()='获取验证码']"), 1);
  25.                         if (sendElement != null && sendElement.isDisplayed()) {
  26.                                 sendElement.click();
  27.                         } else {
  28.                                 return retEntity;
  29.                         }
  30.                         Thread.sleep(1000);
  31.                         String msg = sendElement.getText();
  32.                         retEntity.setMsg(msg);
  33.                         // 判断是否成功
  34.                         if (msg != null && msg.contains("重新获取")) {
  35.                                 retEntity.setRet(0);
  36.                         }
  37.                         return retEntity;
  38.                 } catch (Exception e) {
  39.                         retEntity.setRet(-1);
  40.                         retEntity.setMsg(e.toString());
  41.                         System.out.println(e.toString());
  42.                         return retEntity;
  43.                 }
  44.         }
  45.        
复制代码
2. 模仿鼠标移动

  1. public static boolean moveExec(WebDriver driver, String moveId, int distance) {
  2.                 try {
  3.                         // 获取滑动按钮
  4.                         WebElement moveElemet = ChromeDriverManager.waitElement(driver, By.id(moveId), 100);
  5.                         Actions actions = new Actions(driver);
  6.                         actions.moveToElement(moveElemet).perform();
  7.                         Thread.sleep(500);
  8.                         List<Integer> trackList = ActionMove.getTrack(distance);
  9.                         actions.clickAndHold(moveElemet).perform();// 按住鼠标左键不释放
  10.                         for (Integer moveInt : trackList) {
  11.                                 actions.moveByOffset(moveInt, 0).perform();// 移动
  12.                         }
  13.                         actions.release(moveElemet).perform();// 释放鼠标左键
  14.                         // 滑动结果
  15.                         By langCntBy = By.className("nc-lang-cnt");
  16.                         WebElement langCntElemet = ChromeDriverManager.waitElement(driver, langCntBy, 50);
  17.                         String langCntInfo = (langCntElemet != null) ? langCntElemet.getText() : null;
  18.                         if (langCntInfo != null && langCntInfo.contains("验证通过")) {
  19.                                 return true;
  20.                         } else {
  21.                                 System.out.println("AliUtil.moveExec() langCntInfo=" + langCntInfo);
  22.                                 return false;
  23.                         }
  24.                 } catch (Exception e) {
  25.                         System.out.println("AliClient.moveExec() e=" + e.toString());
  26.                         return false;
  27.                 }
  28.         }
复制代码
3. 轨迹生成(单轴通过)

  1. /**
  2.          * 根据距离获取滑动轨迹
  3.          *
  4.          * @param distance需要移动的距离
  5.          * @return
  6.          */
  7.         public static List<Integer> getTrack(int distance) {
  8.                 List<Integer> track = new ArrayList<Integer>();// 移动轨迹
  9.                 List<Integer[]> list = getXyTrack(distance);
  10.                 for (Integer[] m : list) {
  11.                         track.add(m[0]);
  12.                 }
  13.                 return track;
  14.         }
  15.         /**
  16.          * 双轴轨道生成算法,主要实现平滑加速和减速
  17.          *
  18.          * @param distance
  19.          * @return
  20.          */
  21.         public static List<Integer[]> getXyTrack(int distance) {
  22.                 List<Integer[]> track = new ArrayList<Integer[]>();// 移动轨迹
  23.                 try {
  24.                         int a = (int) (distance / 3.0) + random.nextInt(10);
  25.                         int h = 0, current = 0;// 已经移动的距离
  26.                         BigDecimal midRate = new BigDecimal(0.7 + (random.nextInt(10) / 100.00)).setScale(4, BigDecimal.ROUND_HALF_UP);
  27.                         BigDecimal mid = new BigDecimal(distance).multiply(midRate).setScale(0, BigDecimal.ROUND_HALF_UP);// 减速阈值
  28.                         BigDecimal move = null;// 每次循环移动的距离
  29.                         List<Integer[]> subList = new ArrayList<Integer[]>();// 移动轨迹
  30.                         boolean plus = true;
  31.                         Double t = 0.18, v = 0.00, v0;
  32.                         while (current <= distance) {
  33.                                 h = random.nextInt(2);
  34.                                 if (current > distance / 2) {
  35.                                         h = h * -1;
  36.                                 }
  37.                                 v0 = v;
  38.                                 v = v0 + a * t;
  39.                                 move = new BigDecimal(v0 * t + 1 / 2 * a * t * t).setScale(4, BigDecimal.ROUND_HALF_UP);// 加速
  40.                                 if (move.intValue() < 1)
  41.                                         move = new BigDecimal(1L);
  42.                                 if (plus) {
  43.                                         track.add(new Integer[] { move.intValue(), h });
  44.                                 } else {
  45.                                         subList.add(0, new Integer[] { move.intValue(), h });
  46.                                 }
  47.                                 current += move.intValue();
  48.                                 if (plus && current >= mid.intValue()) {
  49.                                         plus = false;
  50.                                         move = new BigDecimal(0L);
  51.                                         v = 0.00;
  52.                                 }
  53.                         }
  54.                         track.addAll(subList);
  55.                         int bk = current - distance;
  56.                         if (bk > 0) {
  57.                                 for (int i = 0; i < bk; i++) {
  58.                                         track.add(new Integer[] { -1, h });
  59.                                 }
  60.                         }
  61.                         System.out.println("getMoveTrack(" + midRate + ") a=" + a + ",distance=" + distance + " -> mid=" + mid.intValue() + " size=" + track.size());
  62.                         return track;
  63.                 } catch (Exception e) {
  64.                         System.out.print(e.toString());
  65.                         return null;
  66.                 }
  67.         }
复制代码
4. 测试返回效果:


四丶结语

上海助通讯息科技在近10年的历程中,以专业的服务团队、国际化、高尺度的工作流程为高出10万余家企古迹单位提供提供国内领先的网络接入服务和互联网行业增值服务,技能实力雄厚,但在验证产物方面,不是自己研发而是采用第三方的阿里的滑动条, 阿里的产物由于过分重视用户体验, 简单的滑动条特别,模仿器只需要单轴的模仿轨道就可以通过, 阐明阿里对轨迹的校验比较宽松,之前的分析显示,阿里主要是靠模仿器辨认,如果这道关过了,就没有其它的防护步伐了 。
   很多人在短信服务刚开始建设的阶段,大概不会在安全方面考虑太多,来由有很多。
比如:“ 需求这么赶,当然是先实现功能啊 ”,“ 业务量很小啦,体系就这么点人用,不怕的 ” , “ 我们怎么会被盯上呢,不大概的 ”等等。
  有一些来由虽然有道理,但是该来的总是会来的。前期欠下来的债,总是要还的。越早还,题目就越小,损失就越低。
  谷歌图形验证码在AI 面前已经形同虚设,以是谷歌宣布退出验证码服务, 那么当所有的图形验证码都被破解时,大家又该如何做好防御呢?
>>相关阅读
《腾讯防水墙滑动拼图验证码》
《百度旋转图片验证码》
《网易易盾滑动拼图验证码》
《顶象区域面积点选验证码》
《顶象滑动拼图验证码》
《极验滑动拼图验证码》
《利用深度学习来破解 captcha 验证码》
《验证码终结者-基于CNN+BLSTM+CTC的训练摆设套件》

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表