暴力破解与验证码安全之——验证码安全

验证码安全

简介

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers
and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是
计算机还是人的公共全自动程序。

可以防止:恶意破解密码、刷票、论坛灌水,有效防止某
个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证
码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由
计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答 CAPTCHA 的问题,
所以回答出问题的用户就可以被认为是人类。

分类

Gif 动画验证码

主流验证码通过提供静态的图片,比较容易被 ocr 软件识别,有的网站提供 GIF 动态
的验证码图片, 使得识别器不容易辨识哪一个图层是真正的验证码图片,可以提供清晰的图片的同时,可以更有效得防止识别器的识别

手机短信验证码

某些验证码接入商提供手机短信验证码服务,各网站通过接口发送请求到接入商
的服务器,服务器发送随机数字或字母到手机中,由接入商的服务器统一做验证码的验证。

手机语音验证码

视频验证码

视频验证码是验证码中的新秀,视频验证码中随机数字、字母和中文组合而成的验证码动态嵌入到 MP4,flv 等格式的视频中,增大了破解难度。验证码视频动态变换,随机响应,可以有效防范字典攻击、穷举攻击等攻击行为。视频中的验证码字母、数字组合,字体的形状、大小,速度的快慢,显示效果和轨迹的动态变换,增加了恶意抓屏破解的难度
技术支持未公开

原理介绍

	1.客户端发起一个请求
	2.服务端响应并创建一个新的 SessionID 同时生成一个随机验证码。
	3.服务端将验证码和 SessionID 一并返回给客户端
	4.客户端提交验证码连同 SessionID 给服务端
	5.服务端验证验证码同时销毁当前会话(如果不进行设置,PHP默认过23分钟才会销毁,这是不安全的),返回给客户端结果

客户端验证绕过

客户端生成验证码

验证码由客户端 js 生成并且仅仅在客户端用 js 验证
南开大学案例
js这是一种前端验证方式,但是在中途传输过程这种验证就无效了,所以可以在burp中选择攻击方式清除变量添加变量进行暴破,或者关闭页面js功能也可以

补充

测试过程中右键查看源代码可以看是不是js验证,不只是验证码,很多过滤特殊符号,检测密码长度的js检测基本都可以绕过

验证码输出客户端

输出在 html 中,无论出于什么考虑,都不应该把验证码的内容发送到客户端 cookie 或输出到 response headers 的其他字段。比如,写入验证码的 MD5 值、Base64 转码等,太容易被攻击者逆向破解,得到原值。即便是加固定 salt 后输出,都是很不好的。
例如:
索尼验证码实现缺陷

验证码在cookie中问题

有些系统默认不显示验证码,而是在用户校验错误一定次数之后再出现。那如何判断用
户已经错误几次了呢?没有经验的开发可能这样做:
1.在 cookie 中写入一个标记,比如 loginErr = 1,后续错误累加
2.在 session 中写入一个标记,例如 loginErr = 1,后续错误累加
问题在于,要是攻击者不带 Cookie 提交 HTTP 请求呢?或者是,攻击者不更新 Cookie
中 loginErr 的值反复提交呢?这样程序会因为无从获取 Cookie/sessionID,会认为攻击者是
首次访问。无论什么时候,验证码都不会出现!
吉祥航空
5173 验证码可被绕过

更有可能直接把验证码写到了cookie里

服务端验证绕过

验证码不过期,没有及时销毁会话导致验证码复用(这个是最常见的,php 默认有 23 分钟才能自动销毁验证码)苏宁易购案例
多数时候,验证码在 web 服务器上对应一个 session 值。如果完成一次校验,不标记
这个 session 已失效,就会造成同一验证码反复可用。
此时,验证码将不再有用。
攻击者在cookie 中带固定的 sessionID 和固定的一个验证码字符串,即可轻松爆破。

操作如下

服务端验证一定要先输入一个正确的验证码
没有进行非空判断
遗留掉了验证过程中验证码为空的情况,比如去掉 cookie 中的某些值或者请求中验证码参数。
产生的验证码问题集内的答案非常有限

关于PHP session的销毁有三种写法:

<?php
/* session的销毁 */
@header('content-type:text/html;charset=utf-8');
session_start();
 
 
$_SESSION['username']='test1';
echo 'session没销毁时:'.$_SESSION['username'];
echo "<br>";
//方法一
// $_SESSION['username']=null;
//方法二
//session_unset();
//session_destroy();
//方法三
$_SESSION=array();
echo 'session销毁后:'.$_SESSION['username'];

原文链接:https://blog.csdn.net/u014796999/article/details/51872515

token防暴破绕过

由于 token 值输出在前端源代码中,容易被获取,因此也就失去了防暴力破解的意义,一般Token 在防止 CSRF 上会有比较好的功效。

操作如下

抓包后将密码,token都设为变量值,攻击方式音叉方式Pitchfork
线程数设为 1;
Grep-Extract 设置好开始 token" value=" 结束为" /> ;
有郊载荷设为递归搜索

验证码暴力识别(使用PKav HTTP Fuzzer与burp结合)

寻找一个有验证码的网站管理入口,打开网站后台输入用户名、密码、验证码之后、点击登陆,用 burp 抓包
把 burp 抓到的数据包复制到验证码识别工具里面去,设置好验证码识别工具里面的添加标记、添加验证码标记和外部字典
右键复制网站图片型验证码地址,复制到工具里面的验证码地址里面,识别模式与识别范围限定根据情况调整,点击识别测试
设置工具重放模式为多线程模式、重试规则把返回的数据中匹配如下表达式时重试勾选上、字符串匹配写上网站登录时出现错误的验证码提示字符串
设置发包器目标主机地址为要攻击的网站地址,点击启动,就开始暴力破解有验证码的密码了

验证码防御建议

  1. 强制要求输入验证码,否则,必须实施 IP 策略。 注意不要被 X-Forwaded-For (burp中使用,加上允许的IP)绕过了!(现例如思科和tomcat很多后台没有验证码)

  2. 验证码只能用一次,用完立即过期!不能再次使用

  3. 验证码不要太弱。扭曲、变形、干扰线条、干扰背景色、变换字体等。

  4. 大网站最好统一安全验证码,各处使用同一个验证码接口。

相关参考

	https://www.owasp.org/index.php/Testing_for_Captcha_(OWASP-AT-008)
	http://www.mcafee.com/uk/resources/white-papers/foundstone/wp-attacking-captchas-for-fun-profit.pdf 
	http://drops.wooyun.org/tips/141

今日小结:

今天将暴力拆解与验证码安全顺了一遍,大体都是一些工具的使用及之前学到的burp上的暴力拆解功能设置使用,今天还是有点问题的,一个是面对多次错误的IP封杀我们有没有什么手段应对呢?
第二个就是关于随机的思考,也就是说现在很多随机都是“伪随机”,面对一些简单的伪随机有没有可以利用到渗透中的呢

补充更新
问了老师,面对多次错误的IP封杀,我们可以利用请求消息头中的X_FORWARD_for 伪造自己的IP,将IP添加为变量,或者改成192.168.0.1伪装成本地访问试一试,这个功能在之后绕WARF也会用,或者使用爬虫代理(这个不太懂,学爬虫的时候学一下)。

发布了117 篇原创文章 · 获赞 11 · 访问量 6454

猜你喜欢

转载自blog.csdn.net/weixin_43079958/article/details/105523087