freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

渗透测试之特殊需求的图形验证码识别脚本快速开发
2021-07-23 14:50:56

声明

本文注重解决实际生产环境问题,中间经历了正则匹配、编码解码、模拟请求、api调用等多方面知识结合,注重思路与方法,笔者刚接触安全半年实习不到半个月,理论和思路有所欠缺,欢迎大佬们补充。

文章针对小白安服而写,诣在类似环境时,可以帮助小白立马开发出针对此环境的脚本。

渗透场景

距离下班还3小时,争取不加班!项目有一个登录框的页面,登录框验证码真的太抢眼了。

1627018425_60fa54b9bfc64279c5b2d.png!small?1627018429227

我按照以往的思路:

1、抓验证码图片的包。

2、把包丢到captcha-killer。

3、设置好api,然后自动化爆破。

问题来了:

当我点击验证码的时候,首先web会向验证码接口发起请求,随后接口返回验证码图片的base64编码,客户端接收到之后,在登录框显示出来验证码。并不是我想象中的那样,可以直接抓到图片。

1627019715_60fa59c3b5852025169e7.png!small?1627019719278

1627019583_60fa593fbc3fbf418d52b.png!small?1627019587235

我的解决方案

当时我有4个选择:

1、用captcha-killer。因为第一个接口数据包返回的不是图片,插件就不能使用。所以排除。

2、我准备python发起请求访问验证码,但是登录框需要点击才会弹出,python发起请求后返回内容并没有登录框标签。

1627020251_60fa5bdb5bd65c82c7b53.png!small?1627020254921

我特地去请教了qax开发大佬,谈了一会发现以我的资质,项目截止之前(24小时内)很难学会,所以排除。

3、用python脚本抓到接口验证码的base64编码,转为图片进行识别。但是py库识别效果一言难尽。哪怕是github找到的轻量级二值化、降噪、去斜线脚本,依然难以胜任。所以排除。

4、因为第三方验证码识别接口也可以接收base64编码的图片,所以我决定用python获取验证码的base64的编码,一方面解码存储为图片。另一方面调用第三方接口识别出验证码,输出结果并呈现给客户。

开搞

先贴代码:

for i in range(1,10): #这里我需要识别10次示范给客户。
    url = "项目返回验证码地址"
    content = requests.get(url).content  #读取验证码页面
    #print(content)
    content = str(content)
    result = re.findall(r'png;base64,(.+?)"',content) #正则匹配验证码的base64编码
    result = str(result)
    result = result.replace("'",'').replace('[','').replace(']','')  #处理成所需要的格式
    data ='{"username":"接口用户名","password":"接口密码","typeid":"1","image":"'+ result +'"}'  #将base64的验证码存进data。
    #print(data)
    result = (base64.b64decode(result))  #base64解码,准备输出图片
    #print(result)
    name = str(i)+'.png' #从1-10分别命名图片,方便排序
    name =str(name)
    with open(name,'wb') as a:  #生成图片
        a.write(result)

    api = '验证码识别接口'  #验证码识别接口
    page = requests.post(api,data=data).content  #将data发送到识别api
    page = str(page)
    code = re.findall(r'ult":"(.+?)"',page)  #正则匹配api中的识别结果
    code = str(code)
    print('验证码可以识别,识别结果为:'+code)

萌新难点讲解:

1、不会正则匹配:

不要怕,大胆尝试学。假如验证码返回结果为:{“result”:"1234",“success”}

1234左侧的部分写在(.+?)左侧,1234右侧的部分写到(.+?)的右边。

2、api识别服务找不到:

百度搜索验证码识别服务即可,建议花20买个api,虽然收费但是比百度免费的要好许多,准确率也高,最主要的是使用简单。

3、不会接口调用:

在每个验证码服务平台,都可以查到相关文档,如果买的第三方收费服务,模仿我的代码就可以。先模仿,再学会。

尾声

虽然文章内并没有太多高深的技术,但是也是笔者实习以来第一次用python对项目进行测试,把以往零零碎碎的知识点串在一起,在下班前完成了任务。现在安全门槛越来越高,验证码识别也越来越难,很多新人刚接触并不会测试相关问题,希望文章能给其他刚入坑的萌新一点帮助,在报告里多写出几个漏洞。

本人水平有限,非常感谢大家阅读!有问题评论区一起讨论!

# 验证码 # python脚本
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录