图21-10 测试逻辑缺陷
(1)逻辑缺陷的形式多种多样,并且可能存在于应用程序功能的每一方面。为确保探查逻辑缺陷的效率,首先应该将受攻击面缩小到一个适当的范围,以方便手动测试。
(2)检查应用程序解析过程中获得的结果,确定以下情况。
多阶段过程。
重要的安全功能,如登录。
信任边界的转换(例如,登录时由匿名用户转变为自我注册用户)。
检查和调整交易价格或数量。
(1)如果一个多阶段过程需要按预定的顺序提交一系列请求,尝试按其他顺序提交这些请求。尝试完全省略某些阶段,几次访问同一个阶段,或者推后访问前一个阶段。
(2)这些阶段可能通过一系列指向特殊URL的GET或POST请求进行访问,或者需要向同一个URL提交不同的参数。被访问的阶段可通过在被请求的参数中提交功能名称或索引来指定。确保完全了解应用程序访问不同阶段所使用的机制。
(3)除了打乱操作步骤的顺序外,尝试提取在一个过程阶段提交的参数,并在另一个阶段提交这些参数。如果相关数据被应用程序更新,应当确定是否可以利用这种行为破坏应用程序的逻辑。
(4)如果在一个多阶段过程中,不同的用户对同一组数据进行操作,提取某一名用户提交的每一个参数,再由另一名用户提交这些参数。如果应用程序接受并处理这些参数,如前面所述,探索这种行为的衍生效果。
(5)根据执行功能的情形,了解开发者做出的假设以及主要受攻击面位于何处。设法找到违反这些假设以在应用程序中造成反常行为的方法。
(6)如果不按顺序访问多阶段功能,应用程序常常表现出一系列异常现象,如变量值为空字符或未被初始化,状态仅部分定义或相互矛盾,以及其他无法预料的行为。寻找有用的错误消息和调试结果,可以通过它们进一步了解该功能的内部机制,从而调整当前攻击,或者发动另一次攻击。
(1)应用程序的重要安全功能需要处理大量用户提交的输入,并根据这些输入做出决策。因此,应测试这些功能对不完整输入的适应性。
(2)轮流测试每一个参数,从请求中删除参数的名称与值。监控应用程序的响应,查找所有行为异常或错误消息,它们可能提供与应用程序逻辑有关的信息。
(3)如果所操纵的请求属于一个多阶段过程,应测试整个过程,因为应用程序可能将前一个阶段的数据保存在会话中,然后在后一个阶段处理。
(1)了解应用程序如何处理不同用户信任状态之间的转换。寻找功能,帮助一名拥有特定信任地位的用户累积一定量与其身份有关的状态,例如,匿名用户在自我注册过程中提供个人信息,或者完成旨在确认其身份的账户恢复过程。
(2)寻找办法,通过在一个区域积累相关状态,在信任边界之间进行不恰当的转换,然后以正常不被允许的方式切换到另一个区域。例如,完成部分账户恢复过程后,尝试切换到与某一名用户有关的通过验证的页面。当进行这种转换时,测试应用程序是否分配了一个不相称的信任级别。
(3)确定是否可利用更高权限的功能直接或间接访问或者猜测某些信息。
(1)如果应用程序设置交易限额,测试提交负值会造成什么影响。如果应用程序接受负值,就可以通过从反方向进行大额交易来规避这种限额。
(2)分析是否可以使用一连串的交易达成一种状态,然后利用它达到目的。例如,测试是否 可以在账户之间进行几次低额转账,就可以产生一种应用程序的逻辑将会阻止的较大余额。
(3)如果应用程序根据用户控制的数据或操作确定的标准调整价格或其他敏感价值,首先应了解应用程序使用的算法以及需要调整的逻辑。确定这些调整是一次性行为,还是需要根据用户执行的其他操作进行修改。
(4)努力想办法操纵应用程序的行为,使应用程序进行的调整与开发者最初设定的标准相互矛盾。