过 去,在本地执行环境中运行的编译型软件一直受到缓冲区溢出与格式化字符串(format string)等漏洞的困扰。如今,绝大多数的Web应用程序都是使用在托管执行环境中运行的语言和平台编写的,这个环境中不存在上述典型漏洞。使用C#和Java这类语言的一个主要优点在于,程序员不必再担心缓冲区管理与指针算法等问题;这些问题曾给以本地语言(如C和C++)开发的软件造成重大影响,并且是这些软件中绝大多数严重漏洞的根源所在。
但是,有时也会遇到用本地代码编写的Web应用程序。而且,许多主要使用托管代码编写的应用程序同样包含本地代码或调用在非托管环境中运行的外部组件。除非渗透测试员确切地知道所针对的应用程序并不包含任何本地代码,否则就有必要对它进行一些基本的检查,查明其中是否存在任何常见的漏洞。
在打印机与交换机等硬件设备上运行的Web应用程序常常使用某种本地代码。其他可能的目标包含:任何其名称(如dll或exe)表示它使用了本地代码的页面或脚本,以及任何已知调用遗留外部组件的功能(如日志机制)。如果认为所攻击的应用程序包含大量的本地代码,那么就有必要对应用程序处理的每个用户提交的数据进行测试,包括每个参数的名称与参数值、cookie、请求消息头及其他数据。
本章主要介绍3种典型的软件漏洞:缓冲区溢出、整数漏洞和格式化字符串漏洞。对每一种情况,我们将首先描述一些常见的漏洞,然后说明在Web应用程序中探查这些漏洞所需采取的实际步骤。这个主题涉及的内容非常广,它不在本书讨论的范围之内。关于本地软件漏洞,要想了解更多详细信息及如何发现它们,我们推荐以下参考书。
The Shellcoder's Handbook
, 2nd Edition, by Chris Anley, John Heasman, Felix Linder, and Gerardo Richarte (Wiley, 2007)
The Art of Software Security Assessment
by Mark Dowd, John McDonald, and Justin Schuh(Addison-Wesley, 2006)
Gray Hat Hacking
, 2nd Edition, by Shon Harris, Allen Harper, Chris Eagle, and Jonathan Ness(McGraw-Hill Osborne, 2008)