【Java代码审计】逻辑漏洞篇
- 逻辑漏洞概述
- 常见逻辑漏洞点
逻辑漏洞概述
逻辑漏洞一般是由于源程序自身逻辑存在缺陷,导致攻击者可以对逻辑缺陷进行深层次的利用。逻辑漏洞出现较为频繁的地方一般是登录验证逻辑、验证码校验逻辑、密码找回逻辑、权限校验逻辑以及支付逻辑等常见的业务逻辑
与普通的 Web 漏洞相比,逻辑漏洞的不同点在于其源代码本身可能并不存在漏洞,简单来说就是像一些零部件,这些零部件的做工都是没问题的,但是组装起来时可能会因为忽略了某些临界条件或环境而出现问题。逻辑漏洞也是如此,在一个完整的逻辑控制链中,每一个链的逻辑可能都没有问题,但是当串到一起时可能导致逻辑存在缺陷,进而出现逻辑漏洞
常见逻辑漏洞点
用户验证模块
1、“用户名不存在”,利用这个反馈信息来爆破获取用户名
2、若有攻击者针对大量用户进行密码爆破,则可能导致大量用户在短时间内无法登录自己的账号,从而影响业务。旧版本的腾讯 QQ 曾采用该机制,密码输错多次后会在 24h 内禁止登录,有不少恶意攻击者故意输错其他用户的密码,从而达到封禁他人 QQ账号的目的
3、登录时的验证码不变,验证码没有一个完整的服务请求,只有当用户刷新 URL 时才改变;拦截登录时验证码的刷新请求,可以使第一次验证码不会失效,从而绕过验证码的限制
4、一些使用短信验证码登录的站点,当验证短信验证码时返回 state 的成功值是 success,失败值是 false,然后客户端根据 state 的值来确定下一步的动作。这样,我们可以通过修改响应包,绕过短信验证
5、有的时候在短信验证码处随便输入验证数字会返回验证码错误,但是当我们将验证码置空提交请求时,服务端却不校验,从而通过置空绕过登录验证
6、验证码有效时间过长,导致不失效可被爆破
7、验证码找回界面未作校验,导致可以跳步找回,即直接访问密码修改界面页面
8、未对找回密码的每一步做限制,如找回需要 3 个步骤,第一步确认要找回的账号,第二步做验证,第三步修改密码。在第三步修改密码时,存在账号参数,因此可以尝试修改其他用户账号,达到修改任意账户密码的目的
9、有些密码找回时未做验证码功能,因而可能导致账号枚举
支付模块
10、未对价格进行二次验证,导致攻击者可以抓包修改价格参数后提交,实现修改商品价格的逻辑漏洞
11、存在两个订单,一个订单 1 元,另一个订单 1000 元,对于 1 元订单进行支付,支付后返回时存在 token,将这个 token 保存,然后再将订单号替换成贵的订单,这样就可能完成两个订单的同时支付
12、没有对购买数量进行负数限制,这样就会导致有一个负数的需支付金额,若支付成功,则可能购买了一个负数数量的产品,也有可能返还相应的积分/金币到用户的账户上
13、请求重放,当支付成功时,重放其中请求,可能导致本来购买的一件商品数量变成重放请求的次数,但价格只是支付一件商品的价格,更甚者多次下订单,会出现0 元订单情况