• 注册
  • 网络安全 网络安全 关注:3469 内容:7137

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

  • 查看作者
  • 打赏作者
    • 网络安全
    • 声明

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

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

      渗透场景

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

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

      我按照以往的思路:

      1、抓验证码图片的包。

      2、把包丢到captcha-killer。

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

      问题来了:

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

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

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

      我的解决方案

      当时我有4个选择:

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

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

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

      我特地去请教了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对项目进行测试,把以往零零碎碎的知识点串在一起,在下班前完成了任务。现在安全门槛越来越高,验证码识别也越来越难,很多新人刚接触并不会测试相关问题,希望文章能给其他刚入坑的萌新一点帮助,在报告里多写出几个漏洞。

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

      请登录之后再进行评论

      登录
    • 发布
    • 设置
    • 帖子间隔 侧栏位置: