声明
本文注重解决实际生产环境问题,中间经历了正则匹配、编码解码、模拟请求、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对项目进行测试,把以往零零碎碎的知识点串在一起,在下班前完成了任务。现在安全门槛越来越高,验证码识别也越来越难,很多新人刚接触并不会测试相关问题,希望文章能给其他刚入坑的萌新一点帮助,在报告里多写出几个漏洞。
本人水平有限,非常感谢大家阅读!有问题评论区一起讨论!
来源:freebuf.com 2021-07-23 14:50:56 by: chanra
请登录后发表评论
注册