(1)向每一个目标数据提交一系列稍大于常用缓冲区大小的长字符串。例如:
(2)一次针对一个数据实施攻击,最大程度地覆盖应用程序中的所有代码路径。
(3)可以使用 Burp Intruder 中的字符块有效载荷来源自动生成各种大小的有效载荷。
(4)监控应用程序的响应,确定所有反常现象。无法控制的溢出几乎可以肯定会在应用程序中引起异常。在远程进程中探测何时出现这种异常相当困难,需要寻找的反常现象包括以下几项。
HTTP 500状态码或错误消息,这时其他畸形(而非超长)输入不会产生相同的结果。
内容详细的消息,表示某个本地代码组件发生故障。
服务器收到一个局部或畸形响应。
服务器的 TCP 连接未返回响应,突然关闭。
整个Web应用程序停止响应。
(5)注意,如果一个堆溢出被触发,这可能会在将来而非立即导致系统崩溃。因此,必须进行实验,确定一种或几种造成堆“腐化”的测试字符串。
(6)“一位偏移”漏洞可能不会造成系统崩溃,但可能会导致反常行为,如应用程序返回意外的数据。
有些时候,测试字符串可能会被应用程序自身或其他组件(如Web服务器)实施的输入确认检查所阻止。在URL查询字符串中提交超长数据时通常会出现这种情况,应用程序会在针对每个测试字符串的响应中以“URL过长”之类的常规消息反映这一点。在这种情况下,应当进行实验,确定URL允许的最大长度(一般约为2000个字符),并调整缓冲区大小,以使测试字符串符合这个要求。但是,即使实施了常规过滤,溢出可能依然存在;因为长度足够短、能够避开这种过滤的字符串也可能触发溢出。
其他情况下,过滤机制可能会限制在一个特定参数中提交的数据类型或字符范围。例如,当将提交的用户名传送给一个包含溢出漏洞的功能时,应用程序可能会确认该用户名是否仅包含字母数字字符。为实现测试效率最大化,渗透测试员应当设法确保每个测试字符串仅包含相关参数允许的字符。满足这种要求的一个有效方法是,截获一个包含应用程序所接受的数据的正常请求,然后使用其中已经包含的相同类型的字符,创建一个可能通过任何基于内容的过滤的长字符串,再使用这个字符串轮流测试每一个目标参数。
即使确信应用程序中存在缓冲区溢出漏洞,但是,要远程利用它执行任意代码仍然极其困难。NGSSoftware公司的Peter Winter-Smith就盲目缓冲区溢出利用的可能性进行了一些有趣的研究。欲知详情,请参阅以下内容:www.ngssoftware.com/papers/NISR.BlindExploitation.pdf。