参考:The Web Application Hackers Handbook Chapter 11
所有Web应用程序均采用逻辑来交付其功能。 用编程语言编写代码的根本目的只是将复杂的过程分解为简单而离散的逻辑步骤。 将对人类有意义的功能转换为可由计算机执行的一系列小操作,这需要大量的技巧和判断力。 以一种优雅和安全的方式进行操作更加困难。 当大量不同的设计师和程序员在同一个应用程序上并行工作时,很可能出现错误。
在除最简单的Web应用程序之外的所有应用程序中,每个阶段都会执行大量的逻辑。 此逻辑提供了一个复杂的攻击面,该攻击面始终存在,但经常被忽略。 许多代码检查和渗透测试仅将重点放在常见的“标题”漏洞(例如SQL注入和跨站点脚本)上,因为这些漏洞具有易于识别的签名和经过充分研究的利用向量。 相比之下,应用程序逻辑中的缺陷更难描述:每个实例似乎都是唯一的一次性事件,并且通常不会被任何自动漏洞扫描程序识别。 结果,它们通常未被很好地理解或理解,因此攻击者非常感兴趣。
本章描述了Web应用程序中经常存在的逻辑缺陷,以及您可以采取的实际步骤来探查和攻击应用程序的逻辑。 我们将提供一系列真实的例子,每个例子都表现出一种不同的逻辑缺陷。 它们共同说明了设计人员和开发人员所做的各种假设,这些假设可能直接导致错误的逻辑并使应用程序暴露于安全漏洞中。
逻辑缺陷的本质
Web应用程序中的逻辑缺陷千差万别。 它们的范围很广,从在几行代码中表现出的简单错误到由于应用程序的多个核心组件之间的互操作而产生的复杂漏洞。 在某些情况下,它们可能很明显并且易于检测。 在其他情况下,即使是最严格的代码审查或渗透测试,它们也可能非常微妙和容易被忽略。
与其他代码漏洞(例如SQL注入或跨站点脚本)不同,逻辑漏洞没有通用的“签名”。 当然,定义特征是在应用程序内实现的逻辑在某种程度上是有缺陷的。 在许多情况下,可以根据设计者或开发者明确或隐含地做出的特定假设来表示缺陷,该缺陷被证实是有缺陷的。 一般而言,程序员可能会推理出诸如“如果A发生了,那么B一定是这种情况,那么我就去做C”。 程序员没有问完全不同的问题“但是,如果X出现了怎么办?” 因此未能考虑违反假设的情况。 根据情况,这种假想的假设可能会打开一个重要的安全漏洞。
近年来,随着对常见Web应用程序漏洞的意识增强,某些类别的漏洞的发生率和严重性已明显下降。 但是,由于逻辑缺陷的本质,不可能通过安全开发,使用代码审核工具或正常的渗透测试。 逻辑缺陷的多样性和检测和预防它们通常需要对横向思考进行充分衡量的事实表明,它们将在相当长的一段时间内盛行。 因此,任何严重的攻击者都必须认真注意目标应用程序中采用的逻辑,以期弄清该漏洞。设计人员和开发人员可能做出的假设。 然后,他应该富有想象力地思考如何违反这些假设。
Chapter 10 Attacking Back-End Components(5)-Injecting into Mail Services
Chapter 11 Attacking Application Logic(2)-Real-World Logic Flaws(1)