【嘶吼文化-注册安全分析报告】

news2024/11/15 13:30:59

前言

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

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

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

一、 嘶吼文化PC端注册入口

简介:嘶吼——中国网络安全行业综合服务平台
嘶吼传媒成立于2016年,深耕网络安全行业数年,以行业媒体属性快速聚合业界多领域资源,打造集“政企、厂商、技术、人才”于一体的网络安全产业生态格局。品牌旗下自有11+媒体矩阵,覆盖数字时代下多元媒体传播路径。近年来,嘶吼积极向产业咨询、行业研究等更深层业务领域突破转型,成立嘶吼安全产业研究院,凭借对行业的分析与洞察,已实现产业集聚性发展态势,为政企机构的安全决策提供了重要参考,并为网络安全产业转型升级注入动力。

在这里插入图片描述

在这里插入图片描述

二、 安全性分析报告:

采用腾讯的文字点选,容易被模拟器绕过甚至逆向后暴力攻击,文字点选识别率在 95% 以上。

在这里插入图片描述

三、 测试方法:

前端界面分析,这是腾讯v1版本,比较简单,网上有大量的文章参考, 我们采用模拟器的方式,关键点主要模拟器交互、距离识别和轨道算法3部分。

1. 模拟器交互部分



	private static String INDEX_URL = "https://www.4hou.com/index.php/register";

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

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

			// 点击获取验证码
			WebElement sendElement = driver.findElement(By.id("send-code"));
			sendElement.click();
			Thread.sleep(500);

			tencentClientClick.moveExec(driver, false, 790, 447);

			Thread.sleep(2000);
			String info = sendElement.getAttribute("value");
			retEntity.setMsg(info);
			if (info != null && info.contains("重新发送")) {
				retEntity.setRet(0);
			}
			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();
		}
	}


 
	public boolean moveExec(WebDriver driver, boolean isImage, Integer startX, Integer startY) {
		WebElement iframe = null;
		try {
			// 获取到验证区域
			iframe = ChromeDriverManager.waitElement(driver, By.id("tcaptcha_iframe_dy"), 100);
			if (iframe == null) {
				System.out.println("imageClick() tcaptcha_iframe|timeout!!!");
				return false;
			}
			driver.switchTo().frame(iframe);
			WebElement titleElement = ChromeDriverManager.waitElement(driver, By.id("instructionText"), 50);
			String title = (titleElement != null) ? titleElement.getText() : null;
			return myClick(driver, isImage, title, startX, startY);
		} catch (Exception e) {
			return false;
		} finally {
			if (iframe != null) {
				close(driver);
				// 切回主页面
				driver.switchTo().defaultContent();
			}
		}
	}

	public boolean myClick(WebDriver driver, boolean isImage, String title, Integer startX, Integer startY) {
		File bFile = null;
		File tFile = null;
		try {
			String preFix = (isImage) ? "myClick.Image()" : "myClick.text()";
			// 获取带阴影的背景图
			WebElement wegClickElem = driver.findElement(By.id("slideBg"));
			String cssValue = (wegClickElem != null) ? wegClickElem.getCssValue("background-image") : null;
			String bgUrl = (cssValue != null && cssValue.contains("\"")) ? cssValue.split("\"")[1] : null;
			if (bgUrl == null) {
				System.out.println(preFix + " bgUrl=" + bgUrl);
				return false;
			}
			if (title == null) {
				System.out.println(preFix + " guideText=" + title);
				return false;
			}
			Long time = System.currentTimeMillis();
			bFile = new File(dataPath + time + "-b.png");
			FileUtils.copyURLToFile(new URL(bgUrl), bFile);
			byte[] bigBytes = FileUtils.readFileToByteArray(bFile);
			String result;
			String fujia = null;
			if (isImage) {
				WebElement iconElement = driver.findElement(By.className("tc-instruction-icon"));
				WebElement titleElement = iconElement.findElement(By.tagName("img"));
				String titleUrl = titleElement.getAttribute("src");
				tFile = new File(dataPath + time + "-t.png");
				FileUtils.copyURLToFile(new URL(titleUrl), tFile);
				byte[] titleBytes = FileUtils.readFileToByteArray(tFile);
				result = getJfbClick(titleBytes, bigBytes);
			} else {
				fujia = title.trim().substring(title.indexOf(":") + 1).replace(" ", "");
				System.out.println(preFix + " fujia=" + fujia + " bigBytes=" + bigBytes.length);
				result = ocrTest(Base64Encoder.encode(bigBytes), fujia);
			}

			System.out.println(preFix + " result=" + result);

			String[] resultArr = (result != null && result.contains("|")) ? result.split("\\|") : null;
			if (resultArr == null || resultArr.length < 1) {
				System.out.println(preFix + " remote err result=" + result);
				return false;
			}
			sleep(1000);

			if (startX != null && startY != null) {
				RobotMove.wordClickExec(startX, startY, 340 * 1.0 / 672, result);
				RobotMove.click(startX + 310, startY + 270);

			} else {
				ActionMove.wordClickExec(driver, wegClickElem, 340 * 1.0 / 672, result);
				WebElement confirmElement = driver.findElement(By.xpath("//div[@class='verify-btn-text' and contains(text(),'确定')]"));
				confirmElement.click();
			}
			sleep(10);
			// 获取结果
			WebElement statusElement = null;
			for (int i = 0; i < 20; i++) {
				try {
					statusElement = driver.findElement(By.id("statusSuccess"));
					if (statusElement != null && statusElement.isDisplayed()) {
						break;
					}
				} catch (org.openqa.selenium.NoSuchElementException | org.openqa.selenium.StaleElementReferenceException | org.openqa.selenium.ElementNotVisibleException ex) {
					sleep(5);
				}
			}
			String gtInfo = (statusElement != null) ? statusElement.getText() : null;
			System.out.println(preFix + " gtInfo=" + gtInfo);
			boolean verifyRet = (gtInfo != null && gtInfo.contains("验证成功"));
			System.out.println(preFix + " gtInfo=" + gtInfo + "->verifyRet=" + verifyRet);
			if (!verifyRet) {
				WebElement errElement = ChromeDriverManager.waitElement(driver, By.id("statusError"), 1);
				String errTxt = (errElement != null) ? errElement.getText() : null;
				if (errTxt != null && !"".equals(errTxt)) {
					System.out.println(preFix + "errTxt=" + errTxt);
				}
				return false;
			}

			String out = (isImage) ? dataPath + "tencent_image_click/" + time + ".jpg" : dataPath + "tencent_text_click/" + fujia + "/" + time + ".jpg";
			ActionMove.writeResult(bigBytes, resultArr, out, time);
			return true;
		} catch (Throwable e) {
			System.out.println(e.toString());
			for (StackTraceElement ele : e.getStackTrace()) {
				System.out.println(ele.toString());
			}
			return false;
		} finally {
			driver.manage().deleteAllCookies();
			if (bFile != null) {
				bFile.delete();
			}
		}
	}



	

2. 坐标识别

/*
	 * 调用本地机器学习模型库
	 */
	private String ocrTest(String base64, String question) {
		String ocr32Url = PropertiesUtil.get("ocr32Url");
		CloseableHttpClient httpclient = HttpClients.createDefault();
		JSONObject obj = new JSONObject();
		obj.put("img", base64);
		obj.put("fujia", Base64Encoder.encode(question));
		String result = BasePost.httpPost(httpclient, ocr32Url + "/ocr_both", null, obj);
		System.out.println("ocrTest() ocr32Url=" + ocr32Url + ",question=" + question + " -> result=" + result);
		return result;
	}

3. 坐标点击算法

public static void wordClickExec(WebDriver driver, WebElement bigElement, Double r, String result) {
		try {
			String[] clickArray = (result != null && result.contains("|")) ? result.split("\\|") : null;
			if (clickArray == null || clickArray.length < 1) {
				System.out.println("wordClickExec() result=" + result + "->resultArr=" + clickArray);
				return;
			}
			Actions actions = new Actions(driver);
			Random random = new Random();
			Actions moveToElement;
			Double xOffset, yOffset;
			int len = clickArray.length;
			String group;
			for (int i = 0; i < len; i++) {
				group = clickArray[i];
				String[] p = group.split(",");
				xOffset = Integer.parseInt(p[0]) * r;
				yOffset = Integer.parseInt(p[1]) * r;
				System.out.print("wordClickExec() xOffset=" + xOffset + ",yOffset=" + yOffset);
				moveToElement = actions.moveToElement(bigElement, xOffset.intValue(), yOffset.intValue());
				moveToElement.click().perform();
				if (i < (len - 1)) {
					Thread.sleep(900 + random.nextInt(200));
					System.out.println();
				} else {
					System.out.println("---finish()");
				}
			}
			actions.release(bigElement).perform();
		} catch (Exception e) {

		}
	}

	public static void writeResult(byte[] bigBytes, String[] resultArr, String out, long time) throws IOException {
		if (bigBytes == null || resultArr == null) {
			System.out.println("writeResult() bigBytes=" + bigBytes + ",resultArr=" + resultArr);
			return;
		}
		try {
			ByteArrayInputStream bgObj = new ByteArrayInputStream(bigBytes);
			BufferedImage bgBI = ImageIO.read(bgObj);
			Graphics graphics = bgBI.getGraphics();
			Integer xOffset, yOffset;
			int sn = 1;
			int width = 60;
			int height = 60;
			StringBuffer sbLog = new StringBuffer();
			for (int i = 0; i < resultArr.length; i++) {
				String[] p = resultArr[i].split(",");
				xOffset = Integer.parseInt(p[0]);
				yOffset = Integer.parseInt(p[1]);
				sbLog.append(i + ":[" + xOffset + "," + yOffset + "]");
				if (sbLog.length() > 0) {
					sbLog.append(",");
				}
				// 标记顺序
				graphics.setColor(Color.RED);
				graphics.setFont(new Font("黑体", Font.BOLD, 40));
				graphics.drawString(sn + "", xOffset - 12, yOffset + 15);
				// 画圈
				graphics.setColor(Color.GREEN);
				graphics.drawArc(xOffset - width / 2, yOffset - height / 2, width, height, 0, 360);
				sn++;
			}
			System.out.println("writeResult() " + sbLog.toString());
			File destFile = new File(out);
			FileUtils.writeByteArrayToFile(destFile, bigBytes);
			Thumbnails.of(bgBI).scale(1f).toFile(destFile);
		} catch (Throwable e) {
			StringBuffer sb = new StringBuffer();
			sb.append("writeResult() " + e.toString() + "\n");
			for (StackTraceElement elment : e.getStackTrace()) {
				sb.append(elment.toString() + "\n");
			}
			System.out.println(sb.toString());
		}
	}

4. 匹配测试样例:

在这里插入图片描述

四丶结语

嘶吼——中国网络安全行业综合服务平台,嘶吼传媒成立于2016年,深耕网络安全行业数年,以行业媒体属性快速聚合业界多领域资源,打造集“政企、厂商、技术、人才”于一体的网络安全产业生态格局。品牌旗下自有11+媒体矩阵,覆盖数字时代下多元媒体传播路径。近年来,嘶吼积极向产业咨询、行业研究等更深层业务领域突破转型,成立嘶吼安全产业研究院,凭借对行业的分析与洞察,已实现产业集聚性发展态势,为政企机构的安全决策提供了重要参考,并为网络安全产业转型升级注入动力。作为知名媒体,拥有雄厚的安全技术实力,但身份验证产品才用的是通俗的第三方产品,正是由于该产品通俗, 所以在网上破解的文章和教学视频也是大量存在,并且经过验证文字点选用户体验差,并且依赖存在被破解安全隐患。

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

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

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

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

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

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

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

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

相关文章

私有VLAN,从原理到配置,全给你说明白

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 晚上好&#xff0c;我的网工朋友 传统的VLAN划分虽然能够有效地隔离不同部门或功能区域的网络流量&#xff0c;但在某些情况下&#xff0c;比如共…

【JSP `page` 指令详解:构建高效的动态网页】

JSP page 指令详解&#xff1a;构建高效的动态网页 在 JavaServer Pages (JSP) 中&#xff0c;<% page %> 指令用于配置 JSP 页面的一些关键属性。这些属性控制着页面的行为和生成的 Servlet 的特性&#xff0c;例如字符编码、是否启用会话、缓冲区大小等。合理使用 page…

​了解MySQL 的二进制日志文件​Binlog

1. SQL 语句的几种类型 首先介绍一下&#xff0c;对于一个 SQL 语句&#xff0c;它常常被分为以下几种类型&#xff1a; DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09;&#xff1a;用来操作数据库、表、列等&#xff0c;比如 CREATE、ALTER…

VSCode 创建Python 项目(最简单,最少步骤,无痛从pycharm迁移项目)

第一步&#xff1a;下载 下载地址&#xff1a;https://code.visualstudio.com/docs/?dvwin64user 第二步&#xff1a;配置 2.1&#xff1a;VsCode设置中文 按住键盘上的“CtrlShiftP”组合键&#xff0c;打开命令面板。 在命令面板中输入“Configure Display Language”。点击…

vue3 二次封装el-select增加分页功能

实现效果 需求来源于实时搜索客户名称,使用el-select相比用弹窗嵌套表格轻便不少。但是当远程搜索获得的数据量大时,可以滚动加载 也可以加上分页。 封装分页组件 <!-- el-pagination 二次封装 --> <template><div><el-paginationv-model:current-page…

【Linux篇】常用命令(笔记)

目录 一、认识Linux 1. Linux的组成 &#xff08;1&#xff09;文件系统&#xff08;FILE SYSTEMS&#xff09; &#xff08;2&#xff09;内核 &#xff08;3&#xff09;用户接口&#xff08;Shell&#xff09; &#xff08;4&#xff09;应用程序 2. Linux的目录结构…

工作分享,小红书企业內推码附送

小红书2025校园招聘全球启动&#xff0c;附有內推码 内推码&#xff1a;QMT16MXVARJL 内推链接&#xff1a;https://job.xiaohongshu.com/link?referer_codeQMT16MXVARJL 内推链接

C++常见异常汇总(三): fatal error: google/protobuf/port_def.inc

文章目录 1、fatal error : sw/redis/redis.h2、fatal error: dwarf.h: No such file or directory3、fatal error: elfutils/libdw.h: No such file or directory4、fatal error: libunwind.h: No such file or directory5、fatal error: google/protobuf/port_def.inc6、erro…

k8s部署springcloud-alibaba项目

本文由个人总结&#xff0c;如需转载使用请标明原著及原文地址 本文需要一些知识储备&#xff0c;有一定的自学能力&#xff0c;有一定的自行解决问题的能力&#xff0c;不然直接看的话压力会比较大&#xff0c;建议有一定知识储备后作为提升来学 本文的前置条件是会docker&a…

Codesys 与 ARMxy ARM 工业控制器:工业控制的黄金组合

在当今高度自动化的工业领域&#xff0c;高效、稳定且灵活的工业控制系统至关重要。ARMxy ARM 工业控制器与 Codesys 的结合&#xff0c;为工业控制系统带来了全新的可能性。 ARMxy ARM 工业控制器以其卓越的性能和丰富的功能&#xff0c;成为工业控制领域的佼佼者。它拥有丰富…

MathType7.4免费永久数学公式编辑器下载

MathType 7.4&#xff1a;数学公式编辑器的全新升级 &#x1f31f; 闪亮登场&#xff0c;MathType 7.4 来了&#xff01;&#x1f31f; 嘿&#xff0c;亲爱的朋友们&#xff01;&#x1f44b;&#x1f44b; 今天&#xff0c;我要给你们带来一个超级好用的小助手——MathType …

大数据新视界 --大数据大厂之Flink强势崛起:大数据新视界的璀璨明珠

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

好用的视频压缩工具有哪些?这4款千万不要错过

视频压缩的方法有很多种&#xff0c;像我们手机里的视频剪辑工具&#xff0c;手机和电脑自带的压缩功能&#xff0c;在线压缩网站&#xff0c;专业压缩软件压缩等等。不同的场景和需求下大家可以选择不同的工具&#xff0c;但是如果碰到需要大量和经常压缩视频的话&#xff0c;…

Ubuntu增强功能

文章目录 共享粘贴板共享文件夹vim 共享粘贴板 双击 输入认证用户密码 显示这个界面 命令行界面 reboot就会重新启动 虚拟机 设置下面的选项&#xff0c;就可以实现共享粘贴 共享文件夹 先在本机&#xff08;windows&#xff09;新建一个共享文件夹 再在ubuntu建一个共…

Python和MATLAB及C++信噪比导图(算法模型)

&#x1f3af;要点 视频图像修复模数转换中混合信号链噪音测量频谱计算和量化周期性视觉刺激脑电图高斯噪声的矩形脉冲 总谐波失真 周期图功率谱密度各种心率失常检测算法胶体悬浮液跟踪检测计算交通监控摄像头图像噪音计算 Python信噪比 信噪比是科学和工程中使用的一种测…

高级算法设计与分析 学习笔记4 二叉查找树

左子树小于父节点小于右子树。 那么如何构建一个二叉查找树呢&#xff1f; 如何遍历一颗树&#xff1f; 这个其实就是中序遍历&#xff08;在中间访问根节点&#xff09; 如何查找一个元素&#xff1f; 可以看到后面这种方法更好&#xff0c;虽然都是递归&#xff0c;但后者不…

由于安装nvm 引发的vue : 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

&#x1f388;亲爱的读者朋友们&#xff1a; 如果你觉得这篇文章对你有所帮助&#xff0c;恳请你为我点个赞&#x1f44d;。你的每一个赞都是对我辛勤创作的认可&#xff0c;是我继续前行的动力源泉。 同时&#xff0c;也欢迎你关注我的 CSDN 博客。在这里&#xff0c;我会持续…

【828华为云征文|手把手教你如何用华为云Flexus X实例部署之前爆火的“人生重启“游戏】

文章目录 华为云Flexus X实例介绍部署【人生重启】游戏准备工作具体操作指南服务器环境确认验证git环境Ubuntu/Debian:CentOS/Red Hat:Fedora:Arch Linux: 验证nodejs环境检查是否安装了 Node.js 及其版本安装或更新 Node.js 用git拉取项目安装项目依赖运行项目使用后台保持的方…

Nginx+Keepalive集群实战

随着Nginx在国内的发展潮流&#xff0c;越来越多的互联网公司都在使用Nginx&#xff0c;Nginx高性能、稳定性成为IT人士青睐的HTTP和反向代理服务器。 Nginx负载均衡一般位于整个网站架构的最前端或者中间层&#xff0c;如果为最前端时单台Nginx会存在单点故障&#xff0c;也就…

海外仓系统如何为企业提供智能财务解决方案?

在跨境电商的蓬勃发展中&#xff0c;海外仓系统作为连接商品、消费者与财务管理的关键纽带&#xff0c;正逐步演变为企业财务智能化的重要推动力。通过集成先进的技术与智能化功能&#xff0c;海外仓系统不仅优化了仓储物流流程&#xff0c;还为企业提供了全面、高效的智能财务…