动手实验验证码安全基础
Posted i春秋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动手实验验证码安全基础相关的知识,希望对你有一定的参考价值。
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。
验证码可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
今天,就由小爱带大家一起去学习一下有关验证码的安全的知识吧~
实验环境
操作机:Windows XP
IP:172.16.11.2
实验目的
了解验证码基础知识
学习验证码安全问题
学习使用burpsuite爆破表单
实验工具
Burp suite
Burp Suite 是用于测试web应用程序安全性的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快渗透应用程序的过程。
实验步骤
步骤1:验证码基础知识
无验证码的时代
在互联网刚出现的时候,网络上是没有验证码的,网上机器人程序横行,垃圾信息、垃圾邮件、垃圾广告、论坛灌水、恶意破解密码、恶意刷票等恶意行为众多。其中受影响最大的是电子邮件的提供商,邮件用户每天收到数以百计的垃圾邮件轰炸,严重地影响了正常的工作。
验证码的诞生
验证码程序的提出者:路易斯·冯·安(Luis von Ahn)。2002年,路易斯和他的小伙伴在卡内基梅隆第一次提出了CAPTCHA(验证码)这样一个程序概念。该程序是指,向请求的发起方提出问题,能正确回答的即是人类,反之则为机器。这个程序基于这样一个重要假设:提出的问题要容易被人类解答,并且让机器无法解答。
在当时的条件下,识别扭曲的图形,对于机器来说还是一个很艰难的任务,而对于人来说,则相对可以接受。yahoo在当时第一个应用了图形化验证码这个产品,很快解决了yahoo邮箱上的垃圾邮件问题,因此图形类验证码开始了大发展时期。
验证码的类型
图形验证码
图形验证码是出现最早也是使用最为广泛的验证码没有之一。
下面展示四家不同类型互联网公司的验证码,情况如下:
1.某招聘网站验证码 – 字母周围有噪点,字体扭曲
2.某电商网站验证码 – 不同样式,字母阴影,字母粘连,背景色干扰
3.某社交网站验证码 – 主体干扰线,背景色干扰,背景字母干扰,字体扭曲,字母粘连
4.某生活类网站验证码 – 背景干扰线,背景色干扰,背景字母干扰,字体扭曲,字母粘连,字体镂空
可见图形验证码种类多,干扰因素多。
短信验证码
短信验证码常出现在涉及到用户个人敏感行为的地方,例如注册,忘记密码,下单。为了确认操作是用户本人执行的通常会使用短信验证码进行二次认证。
语音验证码
滑动验证码
使用滑动验证码进行校验,只需简单的滑动操作。
步骤2:验证码安全问题
验证码一般与表单是紧密相连的,经常出现在后台登录账号与密码处,若让验证码的作用失效,则可以对后台账号与密码进行爆破,或者使用互联网上已有的社工库对其进行撞库,将对网站数据安全与用户个人信息安全造成很大损失。
大多数开发者对验证码的开发敷衍了事,验证码设计中常见的安全问题是:
验证码有逻辑缺陷,可被绕过,可被逆向
验证码太简单,容易被机器识别
下面举例一些常见的验证码安全问题:
问题一:验证码是否出现的判断逻辑放在客户端浏览器
有些系统默认不显示验证码,而是在用户校验错误一定次数之后再出现。 那如何判断用户已经错误几次了呢?没有经验的开发可能这样做: 在cookie中写入一个标记,比如loginErr = 1,后续错误累加 在session中写入一个标记,例如loginErr = 1,后续错误累加问题在于,要是恶意访问者不带Cookie提交HTTP请求呢?或者不更新Cookie中的loginErr的值反复提交呢?
程序因为无从获取Cookie/sessionID,会认为用户是首次访问。无论什么时候,验证码都不会出现!
问题二:验证码不过期,单个验证码反复可用
多数时候,验证码在web服务器上对应一个session值。
如果完成一次校验,不标记这个session已失效,就会造成同一验证码反复可用。
此时,验证码将不再有用。
恶意访问者在cookie中带固定的sessionID和固定的一个验证码字符串,即可轻松爆破。
还有一种很常见的代码实现,更新session的工作是通过重新下载验证码达到的。
而开发人员容易犯的一个失误,是把更新session的任务交给客户端浏览器。
比如302重定向,甚至是通过js、meta refresh重定向页面,来引导用户重新下载验证码。
这些做法实际是错误的,要是用户拦截了重定向,没有发出新的下载请求呢? 这样,上次的验证码是否还可以使用?
基本的认知是:一个验证码,只能使用一次。使用之后,立即过期,不可再次使用。
问题三:将验证码内容输出到客户端
无论出于什么考虑,都不应该把验证码的内容发送到客户端cookie、或输出到response headers的其他字段。
比如,写入验证码的MD5值、 Base64转码等,太容易被逆向破解,得到原值。
即便是加固定salt后输出,都是很不好的。
问题四:验证码太弱
一般,出现逻辑错误的验证码,同样存在太弱的通病,使用开源的tessertact OCR引擎,不经任何训练,不人工去噪处理,也能识别互联网上的大部分验证码!
步骤3:Burpsuite爆破表单
在有验证码安全问题的系统或网站中,验证码形同虚设,导致表单可以被暴力破解,我们将具体学习爆破表单的多种方法,让同学们感受验证码的重要性以及在发现验证码安全问题后,如何进一步利用该漏洞。
本节实验暂不涉及验证码,将系统性学习爆破表单的方法,为后面的验证码绕过及识别与利用课程打好基础。
表单爆破的原理
表单相信大家在上网过程中都会遇到,如下图所示:
表单用来接受用户的输入,并将用户的输入以name=value集合的形式提交到服务器进行处理。
在html语言中,表单用<form></form>标记定义,表单里面放置各种接受用户输入的控件。
演示代码:
<form id="login" name="login" method ="post" action="Get.aspx">
<p>用户名:<input id="UserName" name="UserName" type="text" /></p> <!--用户名文本框-->
<p>密 码:<input id="PWD" name="PWD" type="text" /></p>
<!--密码文本框-->
<p><input id="subLogin" name ="subLogin" type="submit" value="提交" /></p><!--提交按钮--></form>
表单form的属性:
id:表单的唯一标识
name:表单的名字
method:定义表单提交的方法,有两种方法:Post方法和Get方法
action:用于处理表单的服务器端页面(以URL形式表示)
每一个控件name属性和value属性将构成name-value对提交到action属性所定义的页面进行处理
在网站登录表单中,一般采取post方法,用post方法提交的表单,数据将以数据块的形式提交到服务器,表单数据不会出现在URL中。服务端将会接收数据块,并进行比对验证。
而若在安全测试时,需爆破账号与密码,我们可以手工在浏览器进行提交数据一一尝试,但是效率极低,若账号与密码比较复杂,只有依靠我们利用工具或脚本进行爆破。
爆破的原理就是模拟浏览器访问网页,并利用POST协议进行提交各参数与对应的值,根据网页返回结果判断登录成功与失败。
第一步:“验证码安全演示系统”靶场
打开桌面上的Mozilla Firefox浏览器
浏览器会自动进入到“验证码安全演示系统”靶场
第二步:拦截表单数据包
打开桌面Tools文件夹内的burpsuite.bat
等待几秒,会弹出提示框,点击I Accept
查看burpsuite的代理端口
在Mozilla Firefox浏览器进行设置代理端口
菜单栏 > 选项
高级 > 网络 > 手动配置代理
输入127.0.0.1、端口:8080
点击靶场左侧的“基于表单的暴力破解”
已知账号admin,先需要爆破密码
输入账号admin,密码随便输后,点击Login,登录失败
账号同样可以爆破出来,而且有时候可以通过登录尝试返回的信息判断账号是否存在
打开burpsuite,发现登录表单的数据包已被记录
第三步:intruder模块
将表单的数据包发送到intruder模块
选中数据包,右键点击Send to intruder
intruder模块:可以自动实施各种定制功能,包括资源枚举、数据提取、模糊测试等常见漏洞等。在各种有效的扫描工具中,它能够以最细化、最简单的方式访问它生产的请求与响应,允许组合利用个人智能与该工具的控制优点。
此处可利用burp中intruder模块模拟浏览器使用post协议发送网页参数与对应的值到服务端,再根据网页返回包的长度或包含的值进行判断,进而实现表单暴力破解。
对密码处添加标记
选择字典,存放在C:\Documents and Settings\ichunqiu\桌面\python脚本\password.txt
点击Load加载字典
开始爆破:
选择Lenth排序
发现密码为:888888返回包的长度与其他返回包不一样,经查看返回包,发现登录成功
至此,密码爆破成功,密码为88888
实验结果分析与总结
通过本实验我们了解了验证码基础知识,学习了验证码一些常见的安全问题,并知道了验证码与表单的关系,掌握了常用的burpsuite爆破表单。在接下来的实验,我们将进一步学习验证码绕过及识别与利用,并结合爆破工具或者Python编程去体验这一过程。
编辑:海州
责任编辑:小南瓜
校对:小林龙马、山雾草野
戳阅读原文,参与实验吧~
以上是关于动手实验验证码安全基础的主要内容,如果未能解决你的问题,请参考以下文章
EMS 动手实验2:用户自助密码重设&条件访问策略强制用户使用MFA二次验证&启用标识保护配置风险检测