原来这样 4 步就能破解,再也不用手输验证码了!

2020-04-01 14:58:45 浏览数 (1)

解惑之术

• 解决方案 1

• 解决方案 2

• 具体实现

解决方案 1

还在为谷歌类验证码挠破头皮?

还在为滑块验证码感到头皮发凉?

谷歌的这种验证是reCaptcha(v2.0)该服务使用的简单算法如下:

• 目标网站开放凭据(验证码的“站点密钥”,站点url,可选:代理IP)由您(客户端)复制并提交给2captcha服务。您可以使用简单的Web开发人员工具找到它们。

• 服务端的工作人员使用提供的凭据解决reCaptcha。

• 在10到30秒钟内,您会以g-recaptcha-response令牌的形式请求答案。

• 您可以在带有recaptcha的目标网站[提交]表单内使用此g-recaptcha-response令牌。

另外,如果你想通过javascript逆向的方式去解决验证码方案,往往逆向的难度都是比较大的,例如某团的js逆向验证码:

虽然验证码是简单的英文字母验证码,可以使用简单的ocr进行字母识别,但是我们看看提交的表单:

这里的token参数有加密,让我们继续看看后面:

我们可以通过后缀看到==结尾,通常是通过base64的方式进行加密,而表单的最后一个参数是图片的字母。作者尝试过逆向其中的token参数,发现里面的js文件进行了混淆,难度瞬间升到顶级。所以我们对于验证码的绕过,使用第三方平台服务比较方便。

而对于滑块类验证码,我们需对样本数据进行数据标注,即将滑块的位置标注,用目标识别的模型,预测出滑块位置,最后通过轨迹方程,通过滑块验证。你可以自己搭建模型或者github上克隆别人的代码,通常项目作者与自己所使用的库版本不兼容,或者什么劈里啪啦的原因,导致使用的时候会报错(本人在学习yoloV3的时候深有体会…)。如果你想快速的开发上线功能的话,报错、准确率不高的情况就比较愁人。

解决方案 2

那么我再另外提供一个思路,在一天苦苦的在想还有什么破解方法的时候,我偶然间看到俄罗斯的一个服务商 2Captcha 提供的图像识别和一系列行为验证码的识别服务。他是通过图像识别算法和大量人力的支撑,相当于将我们的训练工作省去了,我们可以直接调用他们训练过的模型,或者其背后会有人来对验证码进行模拟,然后返回其验证成功后的秘钥,我们利用其结果便可以完成一些验证码的绕过。然后我们就可以猥琐、美滋滋地进行学习333。

当然这种网站肯定是要收费的,按照 1000 次识别为单位,其花费的费用为 0.5 美刀到 2.99 美刀不等,对于谷歌这类的验证码,具体的内容大家可以到其官方说明 https://2captcha.com/2captcha-api#rates 去查看。下面我们就来以谷歌验证码为例子,使用第三方平台,一起来体验一下其魅力。打开官网,看看使用该类型的验证码服务需要提供什么数据:

大概操作就是通过源码找到验证码元素里面的id信息。

具体实现

1.准备chromedriver、selenium,或者requests。

在准备登陆目标网站之前发现有这个东西阻拦着我们。

2.当打开目标网页的时候,发现有滑块类|谷歌类验证码。

• 让我们打开网页调试查看源代码,查看此验证的元素查找以www.google.com/recaptcha/api2/anchor开头的链接,或查找 data-sitekey参数。

• 让我们复制这个属性的值

• 让我们把这个属性的值发送至服务端,相当于告诉服务器我们遇到的哪一个验证。

3.让我们试下将验证发给服务器

请求接口:https://2captcha.com/in.php 让我们看看服务端需要我们发什么参数过去

那我们就照着要求发送吧。

代码语言:javascript复制
import requests
from urllib.parse import urlencode
from json import loads

url = "http://2captcha.com/in.php?"
params = {
    'key': 'c************************a48',  # 服务的密钥
    'method': 'userrecaptcha',  # 直接赋值
    'googlekey': '6LfxxxxxxxxxxxxxxxxxxxxxRMFJYMz8',    # 从元素里复制下来的sitekey
    'pageurl': 'http://google.com/recaptcha/api2/demo', # 当前的url
    'json': 1 # 拿到json形式的数据
}
response = request(method='get', url=url urlencode(params)).text
print(loads(response))

>>{“status”:1,“request”:2123279149} # 证明成功了,我门只需要拿到request的值就能拿到返回
结果接口:https://2captcha.com/res.php

我们再看一下这个接口要求的参数是什么:

我们照猫画虎,构造url

代码语言:javascript复制
url = "http://2captcha.com/res.php?"
params = {
    'key': 'c************************a48',  # 服务的密钥
    'action': 'get',  # 直接赋值
    'id': 2123279149,    # request值
    'json': 1
}
response = request(method='get', url=url urlencode(params)).text
print(response)

我们就拿到了类似这么长的一个东西。

03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB-50GQHPEBJUHNnhJyDzwRoRAkVzrf7UkV8wKCdTwrrWqiYDgbrzURfHc2ESsp020MicJTasSiXmNRgryt-gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3-egcplD1uLGh79wC34RF49Ui3eHwua4S9XHpH6YBe7gXzz6_mv-o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q

拿到这个怎么用呢??

找到ID为g-recaptcha-response的元素,并通过删除display:none参数使其可见 。

4.决胜之日

完成上面的操作后,就会出现一个文本框,然后通过元素定位,将res拿到一大串的东西输入.

我们再通过检查元素,定位至Submit的按钮元素;最后通过selenium语句实现自动化点击:find_element_by_id_name(‘recaptcha-demo-submit’).click()(注意:或者其他定位语句,例如:find_element_by_xpath等):图片出现如下就说明,已经验证通过了!!!

以上操作都可通过selenium自动化完成,且若不能成功返回数据的,请看官方文档,里面详细的介绍的出现错误的类型及其解决方式。

链接:https://2captcha.com?from=8995879

最后,我在这里说一下,对于开发周期太短,技术实现太复杂的情况我推荐用服务商的接口,因为如果花太多时间在绕过验证码这方面,还不如优化一下代码,使得代码运行速度更快、鲁棒性更强,(另外实在不行的情况下我们也可以让功能先上线再说…技术的东西慢慢不上),毕竟攻城狮能合理调配资源解决问题也是好攻城狮;还有说一句,破解完成后的感觉实在是太棒了!

0 人点赞