文档章节

[转] 验证码的几个常见漏洞

樂天
 樂天
发布于 2016/12/24 19:04
字数 587
阅读 43
收藏 1

原文:http://www.blogread.cn/it/article/5016

把验证码存储在Cookie中

一般来说,我们会把验证码的值用Session存储起来,通过对比用户提交的验证码和Session中的验证码,就可以知道输入是否正确。由于Session会占用服务器资源,我曾经想过是否可以把验证码的值加密后存储在Cookie中。不过事实证明,这只是异想天开罢了。

假设验证码的值是a,通过sha1加密后得到的值为b = sha1(a),并且把b存储在Cookie中。而用户提交的验证码值为c,通过判断sha1(c)是否与b相等,可以知道输入的验证码是否正确。然而,Cookie是受客户端控制的。如果用户事先通过肉眼看到验证码的值是a,又从Cookie中得知此时的加密值为b,那么,他只要在提交前把Cookie的值修改为b,提交的验证码值为a,就可以永远通过验证。

没有进行非空判断

这种情况可以直接用代码来说明:

if (Request["captcha"] == Session["captcha"] as string)
{
    // 验证通过,继续操作
}

假设用户绕过了系统提供的表单直接提交数据,此时验证码还没生成,Session["captcha"]为空。用户不提交验证码时,Request["captcha"]也为空。于是,验证通过了。

 要解决这个问题,其实只要加个非空判断就可以了:

if (!String.IsNullOrEmpty(Request["captcha"]) &&
    Request["captcha"] == Session["captcha"] as string)
{
    // 验证通过,继续操作
}

没有及时销毁验证码

使用验证码要遵循一个原则,在一次比对之后,无论用户输入正确与否,都要立刻将验证码销毁

如果不这样做,就可以出现以下情况:

  • 假设用户输入错误,且验证码没有重新生成,那么他就可以一直尝试,直到正确为止。虽然机器对图片的一次性识别率比较低,但是,如果同一张图片你给它无限次机会的话,它还是可以识别出来的。
  • 假设用户输入成功,且验证码没有销毁,那么在Session过期之前,他就可以一直用这个验证码通过验证。

本文转载自:http://www.blogread.cn/it/article/5016

共有 人打赏支持
樂天
粉丝 136
博文 674
码字总数 147858
作品 3
深圳
程序员
私信 提问
业务安全漏洞挖掘归纳总结

摘要: 0x00 索引说明 6.30在OWASP的分享,关于业务安全的漏洞检测模型。进一步的延伸科普。 0x01 身份认证安全 1 暴力破解 在没有验证码限制或者一次验证码可以多次使用的地方,使用已知用户...

商者
2016/07/04
24
0
记录一次利用业务设计缺陷漏洞的精彩实战测试

  * 本文作者:Ka1ier,本文属FreeBuf原创奖励计划,未经许可禁止转载   前言   上次的那篇文章《一名代码审计新手的实战经历与感悟》得到了不少读者的支持,也得到了FreeBuf这个平台的...

FreeBuf
05/07
0
0
小型网站渗透常规思路之抛砖引玉

首先,我们知道 。当我们得到一个目标后,当然目标只是针对小型网站的一个思路,大型网站又是另外一个思路了。 信息收集 首先要做的就是信息收集,正所谓磨刀不误砍柴功。 以下引用owasp 渗透...

首席安全砖家
2015/04/13
0
6
任意用户密码重置(一):重置凭证泄漏

  *本文作者:yangyangwithgnu,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。   在逻辑漏洞中,任意用户密码重置最为常见,可能出现在新用户注册页面,也可能是用户登录后重置密码的...

FreeBuf
01/22
0
0
如何修改订单金额实现 0.01 元买 iPhone X?

点击上方“CSDN”,选择“置顶公众号” 关键时刻,第一时间送达! 作者简介: 肖志华,rNma0y,信安自学,白帽子。(在安全圈子里,一直以来有“黑帽”、“白帽”的说法。黑帽子是指那些造成...

csdnnews
2017/12/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于MySQL 通用查询日志和慢查询日志分析

MySQL中的日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等等。这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志。 1)通用查询日志:记录建立的客户端连接和执行的...

瑞查德-Jack
10分钟前
0
0
Vue组件封装 参数传递和事件传递

参数传递 子组件先定义好接收的参数和事件 <div > {{title}} <div class="row"> <Button icon="md-refresh" @click="refresh()" >刷新</Button> </div>......

Carbenson
14分钟前
0
0
如何在10分钟内设置EOS钱包和帐户?

由于SuperNode超级节点社区建立在EOS之上,我们希望引导我们的社区成员设置EOS钱包和帐户,以便充分参与我们的生态系统。 虽然设置过程可能不如其他区块链系统那么简单,但不要担心。本指南旨...

笔阁
19分钟前
2
0
8.04-Win10非U盘重装系统

注意:最好准备一个你所需版本的秘钥(不能是数字0开头的) 【所需:Win10的ISO镜像、能够解压ISO格式的解压缩工具、最好准备你所需版本的秘钥(不能是数字0开头的)】 1、创建新的文件系统为...

静以修身2025
19分钟前
1
0
Docker的架构与自制镜像的发布

一. docker 是什么 大家都知道虚拟机吧,windows 上装个 linux 虚拟机是大部分程序员的常用方案。公司生产环境大多也是虚拟机,虚拟机将物理硬件资源虚拟化,按需分配和使用,虚拟机使用起来...

程序猿拿Q
36分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部