逻辑漏洞是指应用程序的逻辑中存在缺陷,导致应用程序无法按照预期执行,可能被攻击者利用来执行未授权的操作或绕过安全措施。逻辑漏洞通常不依赖于常见的输入验证漏洞或技术漏洞,而是利用系统设计或实现中的问题;本文以两个例子举例常见的逻辑漏洞:
业务逻辑漏洞
业务逻辑漏洞(Business Logic Flaws)是指应用程序的业务流程或功能设计中存在缺陷,使得攻击者能够通过非预期的方式操纵系统,执行未授权的操作或绕过安全措施。业务逻辑漏洞不依赖于输入验证或技术漏洞,而是利用系统设计或实现中的问题;此处我们以dami CMS建立本地半场进行逻辑漏洞演示。
打开站点首页,我们可以点击产品展示查看当前站点售卖的商品列表;
此时我们可以随意点开一个产品进行购买,选定商品后我们打开BP进行抓包,获取商品购买请求数据包;
在数据包中可以看到商品对应信息:如商品ID、名称以及价格;如果此时我们修改请求包中的商品价格会发生什么事情呢?此时我将数据包中的price价格参数修改为0,接着发送数据包。
这个时候就产生了一个0元订单,这其实就是一个支付逻辑漏洞。
此时我们将付款方式选择为货到付款/或者站内付款提交订单就能够成功提交订单了:
除了修改价格之外,我们还可以通过修改其他的参数来白嫖,我们再次抓包;
在数据包中存在qty参数(因为后面一个参数就是价格,那么可以大概猜出这个参数传输的数据应该为产品的数量),此时所选择的产品数量为1,我们可以尝试将其改为负数(-1)查看生成的订单内容:
可以看到此时生成的订单中的价格为-5400,又可以白嫖了;还是将付款方式选择为站内扣款或者货到付款进行订单提交;依旧提交成功。
这个时候可以查看余额提现页面:发现余额增加了。
漏洞(修改price)的产生原因事实上就是因为软件开发者过于信任客户端提交的数据了,客户端只需要在请求的数据中稍微动下手脚就可以产生意想不到的攻击效果。而修改pty参数从而使得价格为负数则是由于开发者未考虑到恶意用户可能将数据改为负数而产生危害的情况。
相关代码:
$data['num'] = (int)$_POST['qty'][$i]; //程序接收产品数量所用到的代码
$total_fee += ($data['num'] * $data['price']) * 1; //计算总价格
开发者只是确保了上交上来的数量参数为整数,但是却没有考虑到数据为负数时的情况;
这个就导致了后续在扣款时扣了负数,从而账户的余额增加,相关代码如下:
M('member')->where('id=' . $_SESSION['dami_uid'])->setDec('money', $total_fee);
具体来说,这段代码从 member
表中查找用户ID等于 $_SESSION['dami_uid']
的记录,并将 money
字段的值减少 $total_fee
。(这个时候total_fee为负数)
在进行业务逻辑漏洞的测试时需要针对每个字段进行测试(没有程序源代码),测试时可以使用最小值、最大值、空值和特殊字符等边界值输入,检查系统是否正确处理这些输入,或者输入超长字符串、SQL注入代码或其他异常数据,测试系统的输入验证机制;若是手里已经有程序的源代码了就可以进行代码审计。