首页 > 其他分享 >【万方数据-注册安全分析报告】

【万方数据-注册安全分析报告】

时间:2024-08-21 17:22:02浏览次数:10  
标签:distance return 万方数据 driver 验证码 安全 注册 滑动 new

前言

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

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

一、 万方数据PC 注册入口

简介: 北京万方数据股份有限公司是科技部直属的中国科学技术信息研究所控股的股份制高新技术企业,以信息资源建设为核心,是集信息资源产品、信息增值服务和信息处理方案为一体的综合信息内容服务提供商,为用户提供从数据、信息到知识的全面数字图书馆及内容管理解决方案。
万方数据成立于1993年。2000年,在原万方数据(集团)公司的基础上,由中国科学技术信息研究所联合多家单位完成股份制改造,正式成立北京万方数据股份有限公司。作为国内较早以信息服务为核心的高新技术企业,经过三十余年快速稳定的发展,万方数据已经发展成为一家以提供信息资源产品为基础,同时集信息内容管理解决方案与知识服务为一体的综合信息内容服务提供商,形成了以"资源+软件+硬件+服务"为核心的业务模式。

在这里插入图片描述

二、 安全性分析报告:

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

三、 测试方法:

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

	@Override
	public RetEntity send(WebDriver driver, String areaCode, String phone) {
		RetEntity retEntity = new RetEntity();
		try {
			driver.get(INDEX_URL);
			driver.findElement(By.className("anxs-8qwe-login-all")).click();

			WebElement iFrame = driver.findElement(By.id("anxs-8qwe-login"));
			driver.switchTo().frame(iFrame);
			Thread.sleep(500);
			driver.findElement(By.className("all_login-way-change-nopassword")).click();

			Thread.sleep(500);
			// 输入手机号
			By phoneBy = By.id("login_phonenum");
			WebElement phoneElemet = ChromeDriverManager.waitElement(driver, phoneBy, 10);
			phoneElemet.sendKeys(phone);

			Thread.sleep(1 * 1000);
			boolean isRobot = true;
			int beginX = 756;
			int beginY = 473;
			if (isRobot) {
				ActionMove.RobotMove(beginX, beginY, 460);
			} else {
				AliClient.moveExec(driver, 460);
			}

			Thread.sleep(1000);
			WebElement gtElement = ChromeDriverManager.waitElement(driver, By.className("get-phonenumber-valid"), 1);
			String gtInfo = gtElement != null ? gtElement.getAttribute("value") : null;
			retEntity.setMsg(gtInfo);
			if (gtInfo.contains("秒后重发")) {
				retEntity.setRet(0);
			} else {
				retEntity.setRet(-1);
				System.out.println("gtInfo=" + gtInfo);
			}
			return retEntity;
		} catch (Exception e) {
			System.out.println(e.toString());
			return null;
		} finally {
			driver.manage().deleteAllCookies();
		}
	}

	

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的训练部署套件》

标签:distance,return,万方数据,driver,验证码,安全,注册,滑动,new
From: https://blog.csdn.net/weixin_44549063/article/details/141398832

相关文章

  • 网络安全原来是要这样学的,一文讲明白了
    还记得小杰之前为大家分享的关于自学网安的文章吗?当时我们只是大致触及了一些网络安全自学的关键点,比如“网络安全只有计算机高材生才能学?”“没有名校背景,根本进不了这个行业?”这些疑问。这次,我们明叔将为大家奉上一份更详细深入的学习指南,详细解析网络安全学习的每一个重......
  • 网络增加安全策略,兼容模式下打不开网页的问题,用到了js中的获取时间
    1、遇到了403的问题,查到原因是因为要url转义,可是转义后,发现极速模式可以用,兼容模式依然是403的问题。所以认为兼容模式与极速模式的解析url中存在很大差异,通过比较兼容模式与极速模式的url,发现兼容模式有中文字符,极速模式下是转义的,所以将中文字符换成英文,发现可以打开链接了。......
  • 安全网关 透明加解密
    在企业网络安全领域,关于源代码或敏感文件的处理,通常采用的是“上传解密、下载加密”的模式,特别是在使用安全网关进行源代码防泄密保护时。这一模式的具体实现方式如下:上传解密当客户端(如开发人员的电脑)向代码管理服务器(如SVN或Git服务器)上传源代码文件时,这些文件首先会通过安全......
  • GitHub Copilot Autofix 声称可识别并解决代码中的安全问题
    GitHub本周在其GitHub高级安全(GHAS)中推出了其Copilot自动修复高级AI代码扫描和修复产品。Copilot自动修复使用AI来查找代码中的漏洞,解释其重要性并提供代码建议来修复它们,GitHub首席安全官兼高级副总裁MikeHanley在公司博客上的文章中写道。“代码扫描工具检测......
  • 水库大坝安全监测平台系统+方案+设备(全套方案)
     引言作为星创技术的高级工程师,近期我有幸参与了一个极具挑战性的水库大坝安全监测平台系统项目。这个项目不仅考验了我们的技术能力,还让我们深刻体会到了团队协作的重要性。让我为大家详细介绍一下这个项目的来龙去脉。平台入口yun.key-iot.com.cn/skdb 项目背景2023年......
  • 银行总分支文件分发系统:在安全与效率之间找到平衡!
    银行的组织结构通常根据其规模、业务范围和地域分布而有所不同,但一般会包括以下几个层级:总行-区域总部或分行-分行-支行-业务中心或服务中心-国际分支机构-附属机构或子公司。  在日常中,存在总分支文件分发的业务场景,文件类型通常包含但不限于以下几种:财务报表:包括资产负债......
  • 告别U盘:看医院如何挑选高效安全的文件摆渡系统
    基于法规要求和自身安全管理需要,医院普遍使用网闸,将网络隔离为院内网、院外网。网络隔离后,医院各科室部门仍存在频繁的网间数据交换需求,需要文件摆渡系统进行内外网数据的安全交换。具体交换场景如下:1.影像科:病人拷贝影像资料/CT,影像资料传到内网会诊;2.信息科:软件安装包/补丁到......
  • 什么是静态应用程序安全测试 (SAST)?
    静态应用程序安全测试(SAST)是分析和测试应用程序源代码是否存在安全漏洞的过程。软件开发人员使用SAST在软件开发生命周期(SDLC)早期(即应用最终发布之前)查找并修复源代码中的缺陷。SAST的工作原理是什么?SAST是一种白盒测试方法,通过直接面向源代码、字节码和二进制文件,检......
  • 数据库:数据库的安全管理
    1实验目的(1)理解SQLServer身份验证模式(2)学会创建登陆账户和数据库用户(3)学会创建和管理服务器角色及数据库角色(4)学会创建、拒绝或撤销权限的方法2实验任务(1)创建Windows登录账户,用户名自拟。(2)将SQLServer身份验证模式改为混合模式。(3)创建SQLServer登录账户,用户名为......
  • cisaw信息安全保障人员认证好学吗
    CISAW信息安全保障人员的认证考试难度因考生而异。具有较强学习能力和丰富信息安全经验的考生可能觉得较为简单,反之则可能感到困难。首先,从考试内容来看,虽然概念性知识为主,辅以技术性内容,总体上不算太难,但闭卷形式要求考生必须有较强的学习和实践能力。其次,个人的学历背景......