前端安全中关于验证码的防护详解

截止到今天咸鱼以及写了很多期关于 Js 逆向的文章了,不过这么多的文章都有一个共通点,都是关于加密参数或者密码加密的解析,很多读者在后台私信希望能够出一些关于滑动验证或者人机验证的分析教程。

于是咸鱼总结了目前遇到过的的验证码类型以及总结出来的相关处理方式和大家聊一聊。

现在市面上的验证码的类型大致有下面几种类型。

图形验证码

比较常见的英文数字组合成的图形验证码,常常辅以各类干扰线和扭曲图片中的内容达到提高混淆难度的目的,并且通过加长图片中的文字长度提升识别成本。

像这类验证码的处理方案有很多种,简单给大家概括一下。

难度中低的两类验证码,安装 tesserocr,通过 OCR 技术结合 Python 的 tesserocr 库可以就可以完成识别。如果验证码中带有简单干扰线同样可以使用灰度和二值化的方法提高代码的识别率。

常用示例代码:

import tesserocr
from PIL import Image
image = Image.open('code2.jpg')
image = image.convert('L')
threshold = 127
table = []
for i in range(256):if i < threshold:table.append(0)else:table.append(1)
image = image.point(table, '1')
result = tesserocr.image_to_text(image)
print(result) 

难度较高的多位英数+扭曲图形验证码包括上面总结的中低难度的图形验证码,可以通过 Tensorflow 训练的方式达到识别验证码的目的。

之前我有一个系列文章介绍了整个训练流程,大家可以点击参考。

mp.weixin.qq.com/s/-BfjGC6KZ…

mp.weixin.qq.com/s/qVZtKveH8…

mp.weixin.qq.com/s/AfefH4b5H…

使用这个方式的朋友记得要先准备好足够用的验证码的样本,只要你的模型不是太差,通过足量的样本,不断调优是可以达到一个较为可观的是识别率的。

目前体验过最好的程序是冷月的四位英数识别成功率高达 99.99% ,不过据知情人透露整个训练的样本达到了 6000 W ,耗费的时间精力可想而知。

还有一类解决方法是使用打码服务,这个之后再说。

旋转验证码

这类验证码是将验证码的图片旋转并且需要用户拖动下方滑块完成将图片摆正的操作才可以完成验证。

目前国内市面的服务商还没有一个好的解决方案,不过某家的验证码有一些小小的 bug,依靠劳苦大众的智慧在 GitHub 上我发现了一个很 Nice 的项目。

项目地址:github.com/scupte/xuan…

因为图库的容量问题,没有超大的图库作为后盾,将全部的原图抓取下来对比完全可以得到旋转的角度了。

部分对比代码:

# -*- coding: utf-8 -*-
import cv2
import numpy as np

imagepath = '9_1.png'
img = cv2.imread(imagepath)
gray = cv2.cvtColor ( img , cv2.COLOR_BGR2GRAY )
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#cv2.drawContours(img,contours,-1,(0,0,255),1) 
for cnt in contours:# 最小外界矩形的宽度和高度width, height = cv2.minAreaRect(cnt)[1]if width* height > 100:# 最小的外接矩形rect = cv2.minAreaRect(cnt)box = cv2.boxPoints(rect)# 获取最小外接矩形的4个顶点box = np.int0(box)print boxif 0 not in box.ravel():#绘制最小外界矩形for i in range(4):cv2.line(img, tuple(box[i]), tuple(box[(i+1)%4]), 0)# 5theta = cv2.minAreaRect(cnt)[2]if abs(theta) <= 45:print('图片的旋转角度为%s.'%theta) # angle = theta
print thetacv2.imshow("img", img)cv2.waitKey(0) 

滑动验证码

说到滑动验证码,一定一定要提某验,虽然说市面上关于滑动验证码的产品有很多,但是某验的地位就像10年前脑白金在保健品市场的地位一样,业界标杆啊。

不过它越牛逼,市场上用它做防护的网站也越多,像国家企业信用信息公示系统、B 站、狗东等等。

像某验的解决方案也有很多,不过大同小异。

selenium 模拟滑动

使用 selenium 这个大家都听过,步骤大致是将缺口图和原图进行对比获取缺口的横坐标,并使用一定的计算完成轨迹模拟,之后再使用 selenium 滑动完成缺口的拼接。

这一类方法的优点是门槛低,原理简单,缺点是完成滑动耗时较长,成功率无法估计(同一轨迹计算使用多次后成功率迅速下降)

常见的轨迹生成代码:

import numpy as np
import math

def ease_out_expo(x):"""曲线函数:param x::return:"""if x == 1:return 1else:return 1 - pow(2, -10 * x)

def get_tracks(distance, seconds):"""轨迹生成函数:param distance: 滑动总距离:param seconds: 滑动总时间:return:"""tracks = [0]# 存放轨迹的数组offsets = [0]# 存放滑动总距离的记录数组for t in np.arange(0.0, seconds, 0.1):# 产生一个数列如[0.0, 0.1, 0.2, 0.3]offset = round(ease_out_expo(t/seconds) * distance)# 根据时间t计算在曲线上的滑动距离tracks.append(offset - offsets[-1])# 本次计算的距离减去上一次移动的距离,得到本次的轨迹offsets.append(offset)# 至本次滑动了的总距离return offsets, tracks


a, b = get_tracks(138, 3)
print(a, b)

def get_tracksb(distance):"""根据物理的先加速再减速规律计算:param distance::return:"""distance += 20# 加上20是为了滑动超过缺口再回滑v = 0# 初速度t = 0.2# 以0.2秒为一个计算周期forward_tracks = []# 轨迹记录数组current = 0# 初始移动距离mid = distance * 3 / 5# 减速阀值即五分之三的距离加速剩下距离减速while current < distance:# 总移动距离等于输入距离时结束if current < mid:# 加速状态a = 2# 加速度为+2else:# 减速状态a = -3# 加速度-3s = v * t + 0.5 * a * (t ** 2)# 计算0.2秒周期内的位移v = v + a * t# 计算本次周期后的速度current += s# 将之前移动的总距离,加上本次0.2秒周期内移动的距离forward_tracks.append(round(s))# 记录本次0.2秒周期内的移动距离为轨迹back_tracks = [-3, -3, -2, -2, -2, -2, -2, -1, -1, -1]# 手动将开头加上的20,生成减去轨迹,即回滑轨迹return {'forward_tracks': forward_tracks, 'back_tracks': back_tracks} 
Js 破解关键的参数

这类方法的门槛就比较高了,通过断点调试 Js,逆向分析滑动后提交的参数的生成逻辑完成参数的生成,之后构造请求完成提交,当然这中间也是需要分析图片的缺口位置与模拟轨迹,不过没有使用到模拟所以速度快成功率高。

缺点是风险高,代码维护成本高,更新一个新版本就要重新分析而且逆向相关产品的代码是有一定的法律风险的,免费包吃住也不是开玩笑的,所以很多能够商业化的大佬们都闷声发大财不会到处张扬。

使用现有的服务

上面两种方法各有各的优缺,很多人就想把这一块的工作量与风险分出去,这就要使用到第三方的服务商了。

不过目前国内市场上的服务商并没有这类服务,目前咸鱼在使用的是一家俄罗斯的服务商 - 2Captcha

这个服务商提供的验证码服务有很多种,其中包含了我们比较关心的 GeeTest 。

下面咸鱼给大家简单介绍下如何使用服务。(不要问为啥收费,人家服务商也要吃饭,况且这个价格实在很便宜了)

首先,注册一个账号,官网是 2captcha.com/zh

完成注册之后会跳转到控制台界面,这里最重要的是获取到属于你的 API Key 。

好,拿到这个 API Key 之后就可以上手使用服务完成滑动的破解了。

通过参考官方的 API 文档,我们只需要构建 Get 请求就可以了。

第一个 Get 请求的组成是这样的:

https://2captcha.com/in.php
?key= 上面获取的API KEY 
&method=geetest
&gt= 极验参数
&challenge= 极验参数
&api_server=api-na.geetest.com(可选)
&pageurl= 滑动验证码所在的网页地址 

参数列表:

参数名参数介绍
keyAPI KEY
method表示验证码类型
gt极验参数1
challenge极验参数2
api_serverapi-na.geetest.com(选填)
pageurl滑动验证码所在的网页地址

这里解释下关于 gtchallenge 这两个参数的获取。

第一个请求中这两个参数其中 gt这个参数是固定的,找一个使用某验的网站就可以获取。例如:

challenge这个参数是有一个 Get 请求返回,你找到这个请求之后按照请求重新获取一次,如果是 XHR 的话也可以直接 reply XHR 。

提交完第一个请求之后,会返回类似下面的结果。

OK|2122988149 or as JSON {"status":1,"request":"2122988149"} 

这里面的一串数字就是会话 ID。

有了这个会话 ID 之后我们就可以构建下一个请求了,这中间需要等待一些时间。

https://2captcha.com/res.php
?key=API KEY
&action=get
&id=2122988149 

参数列表:

参数名参数介绍
keyAPI KEY
actionGet
id上一个请求返回的会话ID

这个请求返回的结果就是我们需要的加密参数了。

{"challenge":"1a2b3456cd67890e12345fab678901c2de","validate":"09fe8d7c6ba54f32e1dcb0a9fedc8765","seccode":"12fe3d4c56789ba01f2e345d6789c012|jordan"
} 

常见的几类验证码,已经全部介绍完了。

肯定有有人问像 google 家的 ReCaptcha 以及和他相似的 hCaptcha 的解决方案没有提到啊?

像以上两类验证码,刚刚提到的服务商也同样有提供接口打码,至于其他的解决方案,目前咸鱼还没有接触过,毕竟这两类验证码,咸鱼手动点击都没办法做到一次通过,目前也只能依赖服务商了。接下来我将给各位同学划分一张学习计划表!

学习计划

那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:

阶段一:初级网络安全工程师

接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。

综合薪资区间6k~15k

1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?

阶段二:中级or高级网络安全工程师(看自己能力)

综合薪资区间15k~30k

7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。

零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;

Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完

用Python编写漏洞的exp,然后写一个简单的网络爬虫

PHP基本语法学习并书写一个简单的博客系统

熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)

了解Bootstrap的布局或者CSS。

阶段三:顶级网络安全工程师

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

学习资料分享

当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值