渗透测试步骤

(1)在一个需要隔离水平权限或垂直权限的复杂应用程序中,设法确定个体用户能够在会话中“聚积”大量与其身份有关的状态信息的所有情况。

(2)尝试浏览一个功能区域,然后转换到另一个完全无关的区域,确定任何聚积的状态信息是否会对应用程序的行为造成影响。

11.2.6 例6:规避交易限制

我们在一家制造公司使用的基于Web企业资源规划的应用程序中发现过这种逻辑缺陷。

1.功能

财务人员有资格在公司拥有的银行账户与公司关键客户和供应商的账户之间进行转账。为防止金融欺诈,应用程序将大多数用户的转账金额限制在10 000美元之内。如果转账金额超出这个限制,就需要得到高级经理的批准。

2.假设

应用程序中负责金额检查的代码极其简单:

img327a

开发者认为这种透明的检查非常安全。如果转账金额超出预先设定的限制,只有得到高级经理的许可交易才能进行。

3.攻击方法

开发者的假设存在缺陷,因为他完全忽略了用户用负金额进行转账的可能性。由于任何负值都小于转账金额限制,因此不需要得到进一步的批准。但是,应用程序的银行模块接受负值转账,并以反向正值转账的形式对其进行处理。因此,如果用户希望从A账户转账20 000美元到B账户,他只需从B账户转账-20 000美元到A账户,即可得到相同的效果,并且不需要经过批准。应用程序实施的反欺诈防御措施也被轻易避开!

img001  注解  许多Web应用程序在它们的交易逻辑中采用数字限额,例如:

img002 零售应用程序禁止用户订购超出其库存量的商品;

img002 银行应用程序禁止用户支付超出其当前账户余额的账单;

img002 保险应用程序根据年龄限制调整报价。

找到规避这个限额的方法通常并不表示应用程序存在安全漏洞。但是,这样做会造成严重的商业后果,并表示所有者依赖应用程序实施的控制存在缺陷。

在发布应用程序前执行的用户验收测试过程中,我们通常可以检测出最明显的漏洞。然而,隐藏较深的漏洞依然存在,特别是操纵隐藏参数造成的漏洞。