验证码客户端验证绕过
只在客户端用js做验证
验证码由客户端js生成并且仅仅在客户端用js验证。
实验条件:需要安装配置pikachu漏洞练习平台,需要安装Burp suite 2.0工具
pikachu例子:
抓包后发送到重发器,输入错误验证码查看响应的提示,没有提示验证码错误,说明是js验证。
测试器中设置变量和有效载荷
进行爆破密码:
验证码保存在响应html
例如:索尼验证码实现缺陷: http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2012-06634
将验证码放到写到html中,通过burp获取html中的验证码就可以进行爆破。
验证码输出在cookie中
有些系统默认不显示验证码,而是在用户输入错误一定次数之后再出现。那是如何判断用户已经错误几次呢?
- 在cookie中写入一个标记,例如loginErr = 1,后续错误累加。
- 在session中写入一个标记,例如loginErr = 1,后续错误累加。
问题在于,要是攻击者不带cookie提交HTTP请求呢?或者攻击者不断更新Cookie中loginErr的值反复提交呢?这样程序因为无法获取cookie/sessionID,会认为攻击者是首次访问,
无论什么时候,验证码都不会出现。
例子:5173验证码可被绕过 http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2012-05151
验证码服务端验证绕过
验证码不过期
验证码使用后,没有及时销毁会话导致验证码复用(php中默认有23分钟才能自动销毁验证码)。
pikach上面的例子:
源码解释:
实例:使用没有销毁的验证码,暴力破解密码
输入正确的用户名,错误密码,正确的验证码然后抓包,抓包成功后发到【重发器】-->点击【发送】响应中返回【用户名或密码错误,说明验证码输入正确。
将重发器中代码发送到【测试器】进行暴力破解设置
有效载荷中设置
爆破成功
没有进行非空判断
很多时候,遗留了验证过程中验证码为空的情况,例如去掉cookie中的某些值或者请求中验证码参数。
例子:输入cmseasy验证码绕过、ecshop验证码绕过、ecshop暴力破解几个关键字到乌云中查看具体例子。
token防爆破绕过
需求:输入正确(或错误)用户名,错误密码点击login,使用burp抓包爆破密码:
pikach中暴力破解--->token防爆破
已输入正确用户名,错误密码点击login,burp抓包发送到Intruder
Intruder中设置,清除全部选项--->变量只添加password和token,攻击方式选择音叉
有效载荷--->password密码第一个参数设置选择1,然后复制粘贴保存在本地的常用密码:
有效载荷--->token选择2,有效载荷类型选择【递归搜索】
选项中--->Grep-Extract(从响应在提取有用选项)--->添加在提取的grep项中设置返回响应中的匹配模式,然后点击OK。
匹配
需要将线程数设置为1
开始攻击如下图爆破成功: