业务逻辑漏洞
概述
-
由于开发者的逻辑不严谨造成的程序功能异常
-
扫描器无法扫描出业务逻辑漏洞
常见场景
- 暴力破解
- 短信/邮箱轰炸
- 固定会话
- 用户名枚举(如 显示用户名不存在)
- 验证码绕过/爆破/重放/回传
- 越权登录(如修改数据包中用户 ID)
- 商品金额/数量篡改
- 整数溢出,int 最大值为 2147483647
整数溢出漏洞
原理
整数溢出是指在计算机中使用固定大小的整数类型(如 int、short、long 等)进行运算时,结果超出了该整数类型所能表示的范围,导致结果不准确甚至出现错误的现象。
计算机中通常使用固定的位数来表示,如32 位的 int 类型能表示的范围是 -231 到 231-1。当进行加减乘除等运算时,如果结果超出了该范围,就会发生整数溢出。
整数溢出的发生是由于计算机采用的是有限位数的二进制表示,超出了这个范围就会丢失高位信息,导致结果不准确。
漏洞验证
以 Java 中的 int 类型数据为例
int 类型的数据最大值为 2147483647,当小于等于最大值时,程序无误可以正常运行
假设攻击者恶意增加订单的数量,从而使订单金额超过 int 类型数据的最大值,而后端使用的 int 型存储订单金额而无任何安全措施。当攻击者提交订单后,显示要支付的金额发生错误,从而导致此逻辑漏洞发生
例: pay1 为 int 类型数据的最大值(在允许的范围内),可以正常输出支付金额。而当支付金额大于 int 类型的最大值时(pay2),则输出的支付金额变为负数!!!
public class test {
public static void main(String[] args) {
int pay1 = 2147483647;
int pay2 = pay1+1;
System.out.println("未溢出的支持支付的最大金额:"+pay1);
System.out.println("溢出后要支付的金额:"+pay2);
}
}
pikachu 水平越权漏洞
漏洞点
没有针对具体身份的验证
漏洞验证
有三个账户,lucy,lili,kobe
当一个用户如 lucy 登录后,可以查看登录的用户的信息
当在 url 中更改用户名时,无需再次经过密码验证,即可查看其他用户的信息(该操作本应拥有其他用户密码,登陆后才可完成,但此处未经验证)
此处存在逻辑漏洞
在 op1_mem.php 页面的验证逻辑中,没有针对具体身份的验证,只要成功登录该页面即可实现对任意用户的信息查询
水平越权危害很大,使用其他人的账户进行汇款操作也属于水平越权逻辑漏洞的一种
pikachu 后台验证码验证
漏洞点
验证码在后台不过期,导致可以长期被使用
漏洞验证
验证码 rzditv
用户名密码随便输入,点击登录,抓包
发送到 Repeater 模块重放
当验证码,用户名和密码都错误时,显示验证码错误
将验证码输入正确的值,用户名和密码错误时,显示用户名或密码错误
而当再次使用上次使用的验证码,验证其他用户名和密码时,验证码依旧可以验证成功
此处存在逻辑漏洞
服务端验证验证码时比较输入的验证码与前端显示的验证码是否相同,只要使用者不主动更改前端验证码,验证码可重复使用。当 bp 多次爆破时不会触发改变前端验证码的操作,所以可以实现验证码的复用
验证码的作用是为了防止暴力破解,而此处存在的漏洞使验证码的存在完全失去了意义,攻击者可以爆破用户名和密码