【投融界-注册安全分析报告】

news2024/11/15 19:55:59

前言

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

  1. 暴力破解密码,造成用户信息泄露
  2. 短信盗刷的安全问题,影响业务及导致用户投诉
  3. 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞
    在这里插入图片描述

所以大部分网站及App 都采取图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度这样的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如何? 请看具体分析

一、 投融界 PC端注册入口

简介:投融界是国内专业的一站式创业服务平台,在企业服务领域专业深耕14年。“以服务提升价值,成为最受信赖的服务企业”为发展使命,依托“科技+服务”的核心优势,不断拓展服务边界、创新服务模式,旨在为创业者提供高质量、个性化、多资源、全场景的陪伴式服务,为每一份创业梦想保驾护航。

在这里插入图片描述

二、 安全性分析报告:

采用网易的滑动行为验证方式,容易被模拟器绕过甚至逆向后暴力攻击,滑动拼图识别率在 95% 以上。该网站采用了严格的IP 限制,同一个IP操作3-6次后, 即使手动换浏览器也提示 “您更换手机号超过系统限制无法继续发送,请联系客服” 或“发送过于频繁请稍后再试!”

在这里插入图片描述

三、 测试方法:

前端界面分析为网易易盾的滑动验证码, 网上有大量现成的逆向文章及视频参考,不过我们这次不用逆向, 只是采用模拟器的方式,关键点主要模拟器交互、距离识别和轨道算法3部分
在这里插入图片描述

估计投融界被机器攻击的比较厉害,滑动验证并未带来安全保护,所以技术人员采取严格的 IP限制及频次控制,如果同IP 多用户则会误拦截:

提示一“您更换手机号超过系统限制无法继续发送,请联系客服”

在这里插入图片描述

提示二:“发送过于频繁请稍后再试!”

在这里插入图片描述

1. 模拟器交互部分


private final String INDEX_URL = "https://www.trjcn.com/register.html";
	
	@Override
	public RetEntity send(WebDriver driver, String areaCode, String phone) {
		try {
			RetEntity retEntity = new RetEntity();
			driver.get(INDEX_URL);

			// 输入手机号
			WebElement phoneElemet = ChromeDriverManager.waitElement(driver, By.id("J-mobile-popup"), 10);
			phoneElemet.sendKeys(phone);
			Thread.sleep(1000);
			WebElement sendElement = ChromeDriverManager.waitElement(driver, By.id("T-reg-mobile-popup-code"), 10);
			if (sendElement != null) {
				sendElement.click();
				Thread.sleep(1000);
			}

			WebElement popElement = ChromeDriverManager.waitElement(driver, By.id("J-mobile-popup-info"), 5);
			String errInfo = (popElement != null && popElement.isDisplayed()) ? popElement.getText() : null;

			if (errInfo != null && (errInfo.contains("超过系统限制") || errInfo.contains("发送过于频繁"))) {
				System.out.println("errInfo=" + errInfo);
				return retEntity;
			}
			if (errInfo == null || "".equals(errInfo)) {
				boolean result = netEasy.moveExec(driver);
				System.out.println("result=" + result);
			}
			String info = sendElement.getText();
			if (info.contains("秒后重新发送")) {
				retEntity.setRet(0);
				retEntity.setMsg("成功");
				return retEntity;
			} else {
				System.out.println("info=" + info);
			}
			return retEntity;
		} catch (Exception e) {
			System.out.println("send() phone=" + phone + ",e=" + 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. 距离识别


/**
	 * Open Cv 图片模板匹配
	 * 
	 * @param tpPath
	 *            模板图片路径
	 * @param bgPath
	 *            目标图片路径
	 * @return { width, maxX }
	 */
	public String[] getWidth(String tpPath, String bgPath, String resultFile) {
		try {
			Rect rectCrop = clearWhite(tpPath);
			Mat g_tem = Imgcodecs.imread(tpPath);
			Mat clearMat = g_tem.submat(rectCrop);

			Mat cvt = new Mat();
			Imgproc.cvtColor(clearMat, cvt, Imgproc.COLOR_RGB2GRAY);
			Mat edgesSlide = new Mat();
			Imgproc.Canny(cvt, edgesSlide, threshold1, threshold2);
			Mat cvtSlide = new Mat();
			Imgproc.cvtColor(edgesSlide, cvtSlide, Imgproc.COLOR_GRAY2RGB);
			Imgcodecs.imwrite(tpPath, cvtSlide);

			Mat g_b = Imgcodecs.imread(bgPath);
			Mat edgesBg = new Mat();
			Imgproc.Canny(g_b, edgesBg, threshold1, threshold2);
			Mat cvtBg = new Mat();
			Imgproc.cvtColor(edgesBg, cvtBg, Imgproc.COLOR_GRAY2RGB);

			int result_rows = cvtBg.rows() - cvtSlide.rows() + 1;
			int result_cols = cvtBg.cols() - cvtSlide.cols() + 1;
			Mat g_result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
			Imgproc.matchTemplate(cvtBg, cvtSlide, g_result, Imgproc.TM_CCOEFF_NORMED); // 归一化平方差匹配法
			// 归一化相关匹配法
			MinMaxLocResult minMaxLoc = Core.minMaxLoc(g_result);
			Point maxLoc = minMaxLoc.maxLoc;
			Imgproc.rectangle(cvtBg, maxLoc, new Point(maxLoc.x + cvtSlide.cols(), maxLoc.y + cvtSlide.rows()), new Scalar(0, 0, 255), 1);
			Imgcodecs.imwrite(resultFile, cvtBg);
			String width = String.valueOf(cvtSlide.cols());
			String maxX = String.valueOf(maxLoc.x + cvtSlide.cols());
			System.out.println("OpenCv2.getWidth() width=" + width + ",maxX=" + maxX);
			return new String[] { width, maxX };
		} catch (Throwable e) {
			System.out.println("getWidth() " + e.toString());
			logger.error("getWidth() " + e.toString());
			for (StackTraceElement elment : e.getStackTrace()) {
				logger.error(elment.toString());
			}
			return null;
		}
	}


  1. 轨道生成及移动算法

public boolean moveExec(WebDriver driver) {
		// 获取滑动按钮
		try {
			WebElement moveElemet = ChromeDriverManager.waitElement(driver, By.className("yidun_slider"), 400);
			if (moveElemet == null) {
				return false;
			} else {
				Actions actions = new Actions(driver);
				actions.clickAndHold(moveElemet).perform();
			}
			Thread.sleep(1000);

			// 获取带阴影的背景图

			WebElement bg = ChromeDriverManager.waitElement(driver, By.className("yidun_bg-img"), 400);
			String bUrl = bg.getAttribute("src");
			if (bUrl == null) {
				System.out.println("bUrl=" + bUrl);
				return false;
			}
			// 获取小图

			WebElement s = ChromeDriverManager.waitElement(driver, By.className("yidun_jigsaw"), 400);
			String sUrl = s.getAttribute("src");
			if (sUrl == null) {
				System.out.println("sUrl=" + sUrl);
				return false;
			}
			Map<String, String> outMap = getMoveDistance(bUrl, sUrl);
			String openWidth = outMap != null ? outMap.get("width") : null;
			String openDistance = outMap != null ? outMap.get("distance") : null;
			// 计算匹配到的位置
			int distance = (openWidth != null && openDistance != null) ? (int) (Double.parseDouble(openDistance) - Integer.parseInt(openWidth) + 2) : 0;
			System.out.println("getMoveDistance() distance=" + distance + "outMap=" + outMap);
			if (distance == 0) {
				System.out.println("err distance=" + distance + "|openWidth=" + openWidth + ",openDistance=" + openDistance);
				return false;
			}

			moveElemet.click();
			// 滑动
			ActionMove.move(driver, moveElemet, distance);
			String moveStr = null;
			WebElement yidunElement;
			for (int i = 0; i <= 40; i++) {
				yidunElement = ChromeDriverManager.waitElement(driver, By.className("yidun--light"), 400);
				moveStr = (moveStr != null) ? yidunElement.getAttribute("class") : null;
				if (moveStr != null && moveStr.contains("yidun--success")) {
					System.out.println("succ distance=" + distance);
					driver.findElement(By.id("nickname")).click();
					Thread.sleep(500);
					driver.findElements(By.className("sms-code")).get(1).click();
					Thread.sleep(500);
					break;
				}
				System.out.print(".");
				Thread.sleep(50);
			}
			return true;
		} catch (Exception e) {
			return false;
		}

	}

  1. OpenCv 轮廓匹配测试样例:
    在这里插入图片描述

四丶结语

投融界作为互联网投资的平台,拥有一定的技术资源, 采用的是通俗的滑动验证产品+ IP限制的策略, IP限制措施存在一定的误拦截,比如搞活动时,由于用户是同一个热点,就可能被误拦截,
滑动验证码行为验证产品稳定并且市场占有率很高, 在一定程度上提高了用户体验, 但安全性在机器学习的今天, 已经无法应对攻击了,并且正是由于该产品通俗, 所以在网上破解的文章和教学视频也是大量存在,并且经过验证滑动产品很容易被破解, 所以除了滑动验证方式, 花样百出的产品层出不穷,但本质就是牺牲用户体验来提高安全。

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

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

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

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

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

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

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

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

相关文章

8 自动类型转换、强制类型转换、整数数据溢出与模运算、浮点数精度丢失、类型转换值截断

目录 1 自动类型转换&#xff08;隐式转换&#xff09; 1.1 运算过程中的自动类型转换 1.1.1 转换规则 1.1.2 转换方向 1.1.3 案例演示 1.2 赋值时的自动类型转换 1.2.1 案例演示 2 强制类型转换&#xff08;显式转换&#xff09; 2.1 介绍 2.2 转换格式 2.3 转换规…

案例分享—国外毛玻璃效果UI设计案例

毛玻璃效果通过模糊和半透明特性&#xff0c;显著增强了UI界面的层次感和深度&#xff0c;使得元素之间界限清晰&#xff0c;同时赋予界面一种现代、高级的质感&#xff0c;提升了整体视觉吸引力。 该效果不仅美观&#xff0c;还通过柔和的色彩和光照效果营造出清新、轻松的氛围…

回归分析系列1-多元线性回归

03 多元线性回归 3.1 简介 多元线性回归是简单线性回归的扩展&#xff0c;允许我们同时研究多个自变量对因变量的影响。多元回归模型可以表示为&#xff1a; 其中&#xff0c;x1,x2,…,xp是 p 个自变量&#xff0c;β0 是截距&#xff0c;β1,β2,…,βp是对应的回归系数&…

【STM32项目】在FreeRtos背景下的实战项目的实现过程(一)

个人主页~ 这篇文章是我亲身经历的&#xff0c;在做完一个项目之后总结的经验&#xff0c;虽然我没有将整个项目给放出来&#xff0c;因为这项目确实也是花了米让导师指导的&#xff0c;但是这个过程对于STM32的实战项目开发都是非常好用的&#xff0c;可以说按照这个过程&…

Layout 布局组件快速搭建

文章目录 设置主题样式变量封装公共布局组件封装 Logo 组件封装 Menu 菜单组件封装 Breadcrumb 面包屑组件封装 TabBar 标签栏组件封装 Main 内容区组件封装 Footer 底部组件封装 Theme 主题组件 经典布局水平布局响应式布局搭建 Layout 布局组件添加 Layout 路由配置启动项目 …

关于Idea中的debug模式只能执行一次的问题

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、为什么debug模式只有生效一次三、补充说明其他调试功能四、最后 开篇说明 记录一…

设计模式学习优质网站分享:refactoring.guru

地址 英文版地址&#xff1a;https://refactoring.guru/design-patterns 中文版地址&#xff1a;https://refactoringguru.cn/design-patterns 介绍 这个网站是专门学习 设计模式 和 软件重构 的网站 整体来说并不花哨&#xff0c;但我觉得他最大的优点就是&#xff1a; 概…

PyTorch 基础学习(2)- 张量 Tensors

PyTorch张量简介 张量是数学和计算机科学中的一个基本概念&#xff0c;用于表示多维数据&#xff0c;是AI世界中一切事物的表示和抽象。可以将张量视为一个扩展了标量、向量和矩阵的通用数据结构。以下是对张量的详细解释&#xff1a; 张量的定义 标量&#xff08;0阶张量&am…

Assembly(七)实验环境搭建

本篇文章将讲解在win11环境下的王爽老师的汇编语言的环境搭建 首先凑齐这些文件: 随后安装好Dosbox,去官网下载就好 打开箭头所指文件 找到文件最后部分 [autoexec] # Lines in this section will be run at startup. # You can put your MOUNT lines here. MOUNT C D:\Debug …

快速搭建Vue_cli以及ElementUI简单项目学生管理系统雏形

为了帮助大家快速搭建Vue_cli脚手架还有ElementUI的简单项目,今天我给大家提供方法. 因为这个搭建这个项目步骤繁多,容易忘记,所以给大家提供这个资料希望可以帮助到你们. 废话不多说开始搭建项目: 搭建Vue_cli项目 首先点开HBuilder左上角的文件点击新建,点击项目,选择vue项…

2024年人工智能固态硬盘采购容量预计超过45 EB

根据TrendForce发布的最新市场报告&#xff0c;人工智能&#xff08;AI&#xff09;服务器客户在过去两个季度显著增加了对企业级固态硬盘&#xff08;SSD&#xff09;的订单。为了满足AI应用中不断增长的SSD需求&#xff0c;上游供应商正在加速工艺升级&#xff0c;并计划在20…

智慧交通物联网应用,5G路由器赋能高速道路监控数据传输

高速道路为了保障交通的高速、安全运行&#xff0c;沿线部署了控制设施、监视设施、情报设施、传输设施、显示设施及控制中心等。在传统的高速管理中&#xff0c;这些设施的传输设施多采用光纤线缆进行数据传输&#xff0c;但高速道路覆盖范围广、距离远&#xff0c;布线与施工…

韩顺平 集合

集合 一、体系结构图二、Collection2.1 Collection 接口和常用方法2.2 集合遍历2.2.1 迭代器2.2.2 增强for循环 三、List接口及其常用方法3.1 三种遍历方式3.2 ArrayList3.3 LinkedList 四 MAP4.1 hashmap 一、体系结构图 集合主要是两组 单列和双列集合 Collection接口有两个重…

第十五章:高级调度

本章内容包括&#xff1a; 使用节点污点和pod容忍度组织pod调度到特定节点将节点亲和性规则作为节点选择器的一种替代使用节点亲和性进行多个pod的共同调度使用节点非亲和性来分离多个pod Kubernetes允许你去影响pod被调度到哪个节点。起初&#xff0c;只能通过在pod规范⾥指定…

Linux安装Nginx后,无法解析Windows主机Hosts文件

问题展示&#xff1a; 配置好Linux的Nginx配置后&#xff0c;Windows同样配置好host&#xff0c;而通过浏览器只能用IP地址成功访问&#xff0c;而域名则不行 解决方法&#xff1a; 点击Windows图标&#xff0c;搜索记事本&#xff0c;选择以管理员身份运行&#xff0c;编辑…

php-xlswriter实现数据导出excel单元格合并,内容从指定行开始写

最终效果图&#xff1a; 代码&#xff1a; public function export_data() {$list $this->get_list_organ();$content [];$content[] []; // 第2行不设置内容&#xff0c;设置为空foreach ($list as $key > $value) {$content[] [$value[organ_name], $value[clas…

防火墙技术与地址转换

文章目录 前言一、四种区域二、实验拓扑图基础配置防火墙配置测试结果 前言 防火墙是计算机网络中的一种安全设备或软件功能&#xff0c;旨在监控和控制进出网络的网络流量。其核心目的是保护内部网络免受外部攻击或不必要的访问。防火墙通过设定一系列安全规则&#xff0c;允…

【iOS】UITableViewCell的重用问题解决方法

我自己在实验中对cell的重用总结如下&#xff1a; 非自定义Cell和非自定义cell的复用情况一样&#xff1a; 第一次加载创建tableView的时候&#xff0c;是屏幕上最多也显示几行cell就先创建几个cell&#xff0c;此时复用池里什么都没有开始下滑tableView&#xff0c;刚开始滑…

可视化编程-七巧低代码入门02

1.1.什么是可视化编程 非可视化编程是一种直接在集成开发环境中&#xff08;IDE&#xff09;编写代码的编程方式&#xff0c;这种编程方式要求开发人员具备深入的编程知识&#xff0c;开发效率相对较低&#xff0c;代码维护难度较大&#xff0c;容易出现错误&#xff0c;也需要…

最新的APS高级计划排程系统推动的MRP供应链计划是什么?

在当下“内卷”的市场环境下&#xff0c;制造业的订单需求从过去大批量标准品生产已经演变成小批量、多订单的非标订单生产&#xff0c;这对制造业的供应链提出了更高的要求。为了应对市场实现产销平衡&#xff0c;中大型的企业都开始重视供应链的建设工作&#xff0c;以应对企…