总体而言,本书根据不同主题之间的依赖关系将内容组织在一起。如果你还不了解黑客是如何攻击Web应用程序的,应该从头至尾读完本书,以了解在后续有关章节中需要用到的背景信息和技巧。如果你在这方面已经拥有一定的经验,可以直接跳到特别感兴趣的任何章节或部分。必要时,我们将提供其他章节的交叉参考,以帮助你弥补理解上的欠缺。
本书前3章介绍一些背景信息,描述当前Web应用程序的安全状况,说明它将来的发展趋势。然后将介绍影响Web应用程序的核心安全问题,以及应用程序为解决这些问题所采取的防御机制。同时还将介绍当前Web应用程序所使用的关键技术。
本书的主要部分重点讨论核心主题——渗透测试员在攻击Web应用程序时使用的技巧。我们根据实施全面攻击所需要完成的关键任务组织材料,这些任务依次为:解析应用程序的功能,检查和攻击它的核心防御机制,探查特殊类型的安全漏洞。
最后3章对本书涵盖的各种主题进行简要总结:描述如何在应用程序源代码中查找漏洞;回顾能够帮助渗透测试员攻击Web应用程序的工具;详细介绍攻击方法论,说明渗透测试员如何对一个目标应用程序实施全面而深入的攻击。
第1章描述当前在因特网上运行的Web应用程序的安全状况。尽管软件商常常保证Web应用程序是安全的,但绝大多数的应用程序并不真正安全,只要掌握一些技巧,就能够攻破它们。Web应用程序中的漏洞源于一个核心问题:用户可提交任意输入。这一章将分析造成当今应用程序安全状况不佳的关键因素,并说明Web应用程序中存在的缺陷如何导致组织庞大的技术基础架构非常易于受到攻击。
第2章描述Web应用程序为解决“所有用户输入都不可信”这个基本问题而采用的核心安全机制。应用程序通过这些机制管理用户访问、控制用户输入、抵御攻击者。这些机制还为管理员提供各种功能,帮助他们管理和监控应用程序自身。应用程序的核心安全机制还是它的主要受攻击面,在对它们实施有效攻击前,渗透测试员必须了解这些机制的工作原理。
第3章简要介绍渗透测试员在攻击Web应用程序时可能遇到的关键技术,包括相关HTTP协议、客户端与服务器端常用的技术以及各种数据编码方案。已经熟悉主要Web技术的读者可以跳过本章。
第4章描述渗透测试员在攻击一个新的应用程序时所需采取的第一步,即尽可能多地收集与应用程序有关的信息,以确定它的受攻击面,制订攻击计划。渗透测试员需要搜索并探查应用程序,枚举它的全部内容与功能,确定所有用户输入进入点并查明它所使用的技术。
第5章描述了存在漏洞的第一个区域。如果一个应用程序依靠在客户端实现的控件来保护它的安全,就可能造成这种漏洞。这种保护应用程序的方法往往存在缺陷,因为攻击者可轻易避开任何客户端控件。应用程序易于受到攻击的原因有两个:(1)通过客户端传送数据,认为这些数据不会被修改;(2)依赖客户端对用户输入进行检查。这一章将介绍一系列有用的技术,包括HTML、HTTP与JavaScript所采用的轻量级控件,以及使用Java applet、ActiveX控件、Silverlight和Flash对象的重量级控件。
第6~8章将主要介绍Web应用程序中最重要的防御机制——负责控制用户访问的机制。第6章描述应用程序确认用户身份的各种功能,包括主登录功能和更加外围的与验证有关的功能,如用户注册、密码修改和账户恢复功能。验证机制在设计和执行方面都包含大量漏洞,攻击者能够利用它们获得未授权访问。这些漏洞包括明显的缺陷,如保密性不强的密码和易于受到蛮力攻击,以及验证逻辑中存在的更微妙的问题。这一章还将详细分析许多安全性至关重要的应用程序所采用的多阶段登录机制,并描述这些机制中频繁出现的新型漏洞。
第7章介绍会话管理机制。大多数应用程序通过有状态会话这个概念补充无状态的HTTP协议,帮助它们在不同的请求中确定每个用户的身份。当Web应用程序受攻击时,这个机制是一个主要的攻击目标;因为如果能够攻破它,就能够有效避开登录机制,伪装成其他用户,而不必知道他们的证书。这一章还将分析生成和传送会话令牌过程中存在的各种常见漏洞,并描述发现和利用这些漏洞所需采取的步骤。
第8章说明应用程序如何实施访问控制。应用程序主要依靠验证与会话管理机制来完成这项任务。本章将介绍各种破坏访问控制的技巧,以及探查和利用这些弱点的方法。
第9章和第10章介绍大量相关漏洞。如果应用程序以不安全的方式在解释型代码中插入用户输入,就会造成这些漏洞。第9章首先详细介绍SQL注入漏洞,讨论各种攻击方法,从最明显、最简单的方法到一系列高级攻击技巧(如带外通道、推断和时间延迟)。对于每一种漏洞和攻击技巧,我们将描述3种常用数据库(MS-SQL、Oracle和MySQL)之间的相关差异,然后介绍一系列针对其他数据存储(包括NoSQL、XPath和LDAP)的类似攻击。
第10章介绍几种其他类型的注入漏洞,包括注入操作系统命令,注入Web脚本语言,文件路径遍历攻击,文件包含漏洞,注入XML、SOAP、后端HTTP请求和电子邮件服务。
第11章将介绍应用程序受攻击面的一个重要的、常被人们忽略的区域——实现其功能的内部逻辑。应用程序逻辑中的漏洞各不相同,它们比SQL注入与跨站点脚本之类的常见漏洞更难以辨别。为此,我们将列举一系列实例,其中存在的逻辑缺陷导致应用程序易于受到攻击,借此说明应用程序设计者与开发者所做出的各种错误假设。根据这些各不相同的缺陷,我们将进行一系列特殊测试,以确定许多常常难以探测的逻辑缺陷。
第12章和第13章介绍一类广泛存在且广受关注的相关漏洞,即应用程序的恶意用户利用Web应用程序中的缺陷攻击其他用户,并以各种方式攻破这些用户。第12章介绍这中最主要的漏洞——一种影响因特网上的绝大多数Web应用程序的广泛存在的漏洞。我们将详细分析各种类型的XSS漏洞,并介绍检测和利用即使是最难以察觉的XSS漏洞的有效方法。
第13章介绍针对其他用户的几种其他类型的攻击,包括通过请求伪造和UI伪装诱使用户执行操作、使用各种客户端技术跨域获取数据、各种针对同源策略的攻击、HTTP消息头注入、cookie注入和会话固定、开放式重定向、客户端SQL注入、本地隐私攻击以及利用ActiveX控件中的漏洞。最后,我们将讨论一系列不依赖任何特定Web应用程序中的漏洞、但可以通过任何恶意Web站点或处于适当位置的攻击者实施的针对用户的攻击。
第14章并不介绍任何新的漏洞,而是描述一种渗透测试员攻击Web应用程序时需要掌握的技巧。由于每种应用程序都各不相同,大多数攻击都经过某种方式的定制(或自定义),以针对应 用程序的特殊行为,以及发现对攻击有利的操纵方法。这些攻击还要求提出大量相似的请求,并监控应用程序的响应。手动执行这些请求非常费力,而且容易出错。要成为真正熟练的Web应用程序黑客,必须尽可能自动实施攻击步骤,使定制攻击更加简单、快捷而高效。本章将详细描述一种行之有效的方法,以完成这项任务。我们还将讨论在使用自动化技巧时遇到的各种障碍,包括防御性的会话处理机制和CAPTCHA控件。此外,我们还将介绍可用于克服这些障碍的工具和技巧。
第15章分析应用程序如何在遭受攻击时泄露信息。当实施本书描述的其他各种攻击时,渗透测试员应该始终监控应用程序,以确定其他可供利用的信息泄露来源。我们将介绍如何分析应用程序的反常行为与错误消息,以深入了解应用程序的内部工作机制,并细化攻击。我们还将介绍如何利用存在缺陷的错误处理机制,从应用程序中获取敏感信息。
第16章介绍在以C和C++等本地代码语言编写的应用程序中存在的一些重要漏洞。这些漏洞包括缓冲区溢出、整数漏洞和格式化字符串漏洞。这个主题涉及的内容非常广泛,我们将重点讨论如何在Web应用程序中探查这些漏洞,并分析一些实例,了解造成这些漏洞的原因,以及如何对它们加以利用。
第17章介绍一个常被忽略的Web应用程序安全领域。许多应用程序采用一种分层架构,无法恰当地隔离这些层面可能会导致应用程序易于受到攻击,导致攻击者能够利用在其中一个组件中发现的漏洞迅速攻破整个应用程序。共享托管环境带来另外一些严重的威胁,有时,攻击者可以利用一个应用程序中存在的缺陷或恶意代码攻破整个环境及其中运行的其他应用程序。本章还会介绍一种众所周知的共享托管环境“云计算”中出现的各种威胁。
第18章描述各种攻击技巧,说明如何通过攻击Web服务器进而攻击其中运行的Web应用程序。Web服务器中存在的漏洞主要包括服务器配置方面的漏洞以及Web服务器软件中的安全漏洞。这个主题属于本书的讨论范围,因为严格来讲,Web服务器是技术栈的另一个组件。但是,大多数Web服务器都与在它们之中运行的Web应用程序关系密切。因此,本书介绍针对Web服务器的攻击,因为攻击者常常可以利用它们直接攻破一个应用程序,而不是首先间接攻破基础主机,然后再攻击Web应用程序。
第19章描述另外一种查找安全漏洞的方法。这种方法与本书其他章节讨论的方法截然不同。许多时候,我们都可以对应用程序的源代码进行审查,并且不必得到应用程序所有者的协助。通常,审查应用程序的源代码可以迅速确定一些漏洞,但在运行的应用程序中探查这些漏洞可能极其困难,或者需要耗费许多时间。我们将介绍一种代码审查方法,并简要说明如何对以各种语言编写的代码进行审查,以帮助读者在编程经验不足的情况下进行有效的代码审查。
第20章详细介绍本书描述的各种工具。笔者在攻击真实的Web应用程序时使用的就是这些工具。我们将分析这些工具的主要功能,并详细描述充分运用这些工具的工作流类型。另外,讨论一些全自动工具能否有效地发现Web应用程序中存在的漏洞,并提供一些提示和建议,说明如何充分利用工具包。
第21章综合介绍本书描述的所有攻击步骤与技巧。我们将根据渗透测试员在实施攻击时所需完成的任务之间的逻辑依赖关系来组织这些步骤与技巧,并对它们进行排序。如果你已经阅读并 理解书中描述的各种漏洞和攻击技巧,就可以把这个方法当作一个完整的清单和工作计划,对Web应用程序实施渗透测试。