业务逻辑漏洞——浅谈验证码漏洞
几个月前写的。。。居然一直待在草稿箱
已经忘了之前想用一些cms来复现常见的业务逻辑漏洞这回事了
最近有时间就继续慢慢弄吧~~
一、验证码漏洞
验证码机制主要用于用户身份识别,常见可分为图片验证码、数字验证码、滑动验证码、短信验证码、邮箱验证码等
根据形成原因可分为:
1.验证码暴力破解
1.1 漏洞成因
服务端未对验证时间、次数作出限制,存在爆破的可能性。验证码常用在批量注册,任意用户登录场景。
1.2 测试
1.2.1 测试流程
输入信息–>抓包爆破验证码–>查看爆破是否成功
1.2.2 PHPYunCMS漏洞演示
PHPYun后台验证码可爆破
(1)测试环境
系统:Win10
环境:PHPStudy集成环境
CMS版本:PHPYunv3.1
(2)测试过程
输入正确用户信息
爆破成功
1.3 漏洞修复建议
(1)提高验证码的长度、复杂度
(2)可限制错误登录次数、有效时间
2.验证码重复使用
2.1原因
在验证码首次认证成功后没有删除session中的验证码,使得该验证码可被多次成功验证,造成危害
2.2测试:
2.2.1 测试流程
填写正确登录信息和验证码–>抓取提交数据包–>重复提交该数据包–>查看是否登录成功–>登录成功则存在验证码重复使用问题
2.2.2 帝国CMS漏洞演示
帝国CMS后台验证码显示重复
(1)测试环境
系统:Windows10
PHPStudy集成环境:PHPv5.3.29+MYSQLv5.5.53
CMS版本:EmpireCMS_6.0
(2)安装CMS
访问http://yoursite/e/install/index.php
安装好后先登录后台页面修改后台验证码显示设置,步骤如图
同时将后台登录限制增大(eg:100),然后拉到最下方保存设置,退出登录
(3)测试过程
第一步,输入正确信息点击登录时抓包
第二步,通过修改imageField参数的大小来实现暴力提交,自设一个两位数数字字典作为payload
第三步,查看任意响应包是否登录成功
从结果来看,暴力重复提交的数据包均登录成功,说明存在验证码重复使用的问题。
经过暴力重复提交后,客户端显示登陆成功
PHP5.2.17下测试结果同5.3.29
2.2.3 CMS漏洞分析
(1)原因
自 PHP 4.2.0 起,不再需要用mt_srand() 给随机数发生器播种 ,因为现在是由系统自动完成的,导致帝国cms的验证码会显示一样的字符。
(2)解决方法
在每个文件中找到该行将其删除或注释即可。
Seay源码审计系统中全局搜索mt_srand函数,含有mt_srand的文件为:
2.3 漏洞修复建议
在一次认证成功后服务器端清空认证成功的ssesion
3.验证码回显
3.1 验证码直接由客户端生成,在回显中显示,可通过浏览器工具直接查看
3.2 分类
3.2.1 在源码中显示
F12审计大法,搜索源码中有无验证码
3.2.2 在COOKIE中显示
抓包时分析COOKIE中是否含有验证码
3.3 测试
3.3.1 测试流程
(1)在源码中显示
(2)在COOKIE中显示
3.3.2 在源码中显示
3.2.3 在COOKIE中显示
以某网站找回密码模块为例
第一步,填写好相关信息并确认提交
步骤二:确认提交时抓取数据包
可以看到str_code回显在请求包中
步骤三:forward发送请求包,跳转到输入验证码和新密码页面
步骤四:填写从请求包得到的验证码,成功修改用户密码
防范:验证码由服务端生成且保存在服务端,不能通过任何API获取
4.验证码绕过
4.1 漏洞成因
由于逻辑设计缺陷,可绕过验证,比如直接删除COOKIE或验证码参数可绕过、当验证不通过清空session时,验证码参数值为空时绕过等。
4.2 分类
4.2.1删除COOKIE绕过
4.3 测试
4.3.1 测试流程
4.3.2 测试环境
4.3.3 CmsEasy演示
CmsEasyv5.5删除COOKIE绕过验证
第一步,输入正确账户信息和错误验证码,登录时抓包
第二步,删除COOKIE
客户端登陆成功
74cms 设计缺陷导致全版本验证码绕过
https://www.secpulse.com/archives/26839.html
修复:在检测用户验证码时,先判断是否存在,是否为空,再判断是否正确
5.验证码自动识别
这类漏洞主要是指图片验证码,可以通过PKAV工具以及bp插件来识别,也可以用python
二、密码找回
1.敏感信息泄露
2.邮箱弱token
3.验证的有效性
4.注册覆盖
三、接口盗用
1.重放
四、账户越权
1、未授权访问
2、越权
五、支付漏洞
六、SSRF