当前位置: 首页 > news >正文

【注册/登录安全分析报告:孔夫子旧书网】

前言

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

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

一、 孔夫子旧书网 PC 注册入口

简介:孔网创建于2002年,是大型的二手旧货、古旧图书和商品交易平台,是传统文化行业结合互联网而搭建的C2C平台,是有传统文化价值的旧货市场。网站主要板块是书店区和拍卖区。网站秉承“网罗天下图书,传承中华文明”的理念,致力于发掘、抢救、保护和传播中国传统文化资源。

在这里插入图片描述

在这里插入图片描述

二丶 安全分析:

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

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

1. 模拟器交互

private static String INDEX_URL = "https://login.kongfz.com/register/index.html";@Overridepublic RetEntity send(WebDriver driver, String areaCode, String phone) {RetEntity retEntity = new RetEntity();try {driver.get(INDEX_URL);// 1 输入手机号WebElement phoneElemet = ChromeDriverManager.waitElement(driver, By.id("phone"), 1);phoneElemet.sendKeys(phone);// 2 获取图形验证码WebElement sendElement = driver.findElement(By.xpath("//a[contains(text(),'获取验证码')]"));sendElement.click();Thread.sleep(1 * 1000);WebElement imgElement = ChromeDriverManager.waitElement(driver, By.xpath("//li[@class='verityBox']/div/span/img[contains(@src,'/Pc/ajax/showSimpleCaptcha')]"), 20);sendElement = (imgElement == null) ? ChromeDriverManager.waitElement(driver, By.xpath("//a[contains(text(),'获取验证码')]"), 10) : null;if (sendElement != null) {sendElement.click();Thread.sleep(1500);WebElement gtElement = ChromeDriverManager.waitElement(driver, By.xpath("//a[contains(text(),'秒后可重发')]"), 10);String gtInfo = (gtElement != null) ? gtElement.getText() : null;if (gtInfo != null && gtInfo.contains("秒后可重发")) {retEntity.setMsg("[无感验证通过]->" + gtInfo);retEntity.setRet(0);return retEntity;}}if (imgElement == null) {return null;}System.currentTimeMillis();imgElement.click();Thread.sleep(1000);String imgCode = null, picUrl;byte[] imgByte = null;for (int i = 0; i < 3; i++) {System.currentTimeMillis();picUrl = imgElement.getAttribute("src");imgByte = (picUrl != null) ? GetImage.callJsByUrl(driver, picUrl) : null;imgCode = ddddOcr.getImgCode(imgByte);if (imgCode != null && imgCode.length() >= 6) {ddddOcr.saveFile("KongFz/", imgCode, imgByte);break;} else if (imgCode != null && imgCode.contains("=")) {System.out.println("算术运算");return null;}imgElement.click();Thread.sleep(1 * 1000);}if (imgCode == null || imgCode.length() < 1) {return null;}// 3 输入识别出来的图形验证码WebElement codeInputElement = driver.findElement(By.id("verity"));codeInputElement.sendKeys(imgCode);Thread.sleep(1 * 1000);sendElement = ChromeDriverManager.waitElement(driver, By.xpath("//a[contains(text(),'获取验证码')]"), 10);if (sendElement != null) {sendElement.click();Thread.sleep(2 * 1000);}WebElement gtElement = ChromeDriverManager.waitElement(driver, By.xpath("//a[contains(text(),'秒后可重发')]"), 10);if (gtElement == null) {WebElement errElement = ChromeDriverManager.waitElement(driver, By.xpath("//span[@class='red' and contains(text(),'短信发送太快')]"), 10);String errInfo = (errElement != null) ? errElement.getText() : null;if (errInfo != null) {retEntity.setMsg("[imgCode:" + imgCode + "]->" + errInfo);String lateTime = DigitFormat.getDigit(errInfo);System.out.println(errInfo + "->sleep " + lateTime);Thread.sleep(Integer.parseInt(lateTime) * 1000);return retEntity;}}String gtInfo = (gtElement != null) ? gtElement.getText() : null;retEntity.setMsg("[imgCode:" + imgCode + "]->" + gtInfo);if (gtInfo != null && gtInfo.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 {if (driver != null)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. 测试返回结果:

在这里插入图片描述

三 丶测试报告 :

在这里插入图片描述

四丶结语

孔夫子网简称孔网,创建于2002年,是大型的二手旧货、古旧图书和商品交易平台,是传统文化行业结合互联网而搭建的C2C平台,是有传统文化价值的旧货市场。网站主要板块是书店区和拍卖区。网站秉承“网罗天下图书,传承中华文明”的理念,致力于发掘、抢救、保护和传播中国传统文化资源。作为旧古书二手市场平台的“独角兽”企业, 技术实力也应该不错,但采用的还是老一代的图形验证码已经落伍了, 用户体验一般,容易被破解, 一旦被国际黑客发起攻击,将会对老百姓形成骚扰,影响声誉。

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

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

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

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

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

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

相关文章:

  • 腾讯云SDK产品功能
  • 动态规划入门题目->使用最小费用爬楼梯
  • 【全新课程】正点原子《基于GD32 ARM32单片机项目实战入门》培训课程上线!
  • 一行代码,AI大模型训练成本再降30%,混合精度训练再升级
  • 不夸张、我就是这样考过PMP~
  • Python OpenCV精讲系列 - 计算机视觉应用深入理解(十五)
  • 宠物空气净化器希喂和352哪个好用?两大爆火机型哪款吸毛、除臭效果比较好?
  • C# winform s7.net 类读取 报错:数组不是一维数组。
  • 基于STM32和FPGA的射频数据采集系统设计流程
  • 8610 顺序查找
  • HTML基础用法介绍一
  • 基于Hive和Hadoop的电信流量分析系统
  • jmeter本身常用性能优化方法
  • python接口自动化——封装与调用
  • linux打开桌面软件(wps)、获取已打开的文件名(wps)
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Computed property XXX was assigned to but it has no setter
  • ES6简单总结(搭配简单的讲解和小案例)
  • extract-text-webpack-plugin用法
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 欢迎参加第二届中国游戏开发者大会
  • 聊一聊前端的监控
  • 《天龙八部3D》Unity技术方案揭秘
  • Linux权限管理(week1_day5)--技术流ken
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​Linux·i2c驱动架构​
  • # Kafka_深入探秘者(2):kafka 生产者
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (强烈推荐)移动端音视频从零到上手(上)
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (五)网络优化与超参数选择--九五小庞
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .a文件和.so文件
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @NotNull、@NotEmpty 和 @NotBlank 区别
  • @property括号内属性讲解
  • @SentinelResource详解
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • []error LNK2001: unresolved external symbol _m
  • [BUUCTF 2018]Online Tool(特详解)
  • [C++][opencv]基于opencv实现photoshop算法色阶调整
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分