首先,我们来看下整个验证码实现的原理
图一
1.客户端发起一个请求
2.服务端响应并创建一个新的SessionID同时生成一个随机验证码。
3.服务端将验证码和SessionID一并返回给客户端
4.客户端提交验证码连同SessionID给服务端
5.服务端验证验证码同时销毁当前会话,返回给客户端结果
0x01 安全问题及案例
根据上面的实现流程,我们大概可以从四个方面入手,客户端问题、服务端问题、验证码本身问题,还有一个验证码流程设计问题。
- 客户端问题
客户端生成验证码
验证码由客户端js生成并且仅仅在客户端用js验证
WooYun: 南开大学信息门户网站设计不当可以爆破用户密码(利用密码猜用户)
验证码输出客户端
输出在html中(神一样的程序员)
WooYun: 索尼验证码实现缺陷
WooYun: 某会考报名系统验证码绕过可暴力破解(可导致用户信息泄露)
验证码输出在cookie中,这个在乌云中案例也是比较多的。
WooYun: 吉祥航空任意客票遍历
WooYun: 5173验证码可被绕过
- 服务端
验证码不过期,没有及时销毁会话导致验证码复用
这个是最常见的,乌云上面有大量的案例。
WooYun: 苏宁易购某系统后台多个超级管理员弱口令(验证码可重复利用)
没有进行非空判断
很多时候,我们会遗留掉了