渗透测试之特殊需求的图形验证码识别脚本快速开发 – 作者:chanra

声明

本文注重解决实际生产环境问题,中间经历了正则匹配、编码解码、模拟请求、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对项目进行测试,把以往零零碎碎的知识点串在一起,在下班前完成了任务。现在安全门槛越来越高,验证码识别也越来越难,很多新人刚接触并不会测试相关问题,希望文章能给其他刚入坑的萌新一点帮助,在报告里多写出几个漏洞。

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

来源:freebuf.com 2021-07-23 14:50:56 by: chanra

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论