渗透测试步骤

(1)如果所攻击的应用程序功能只拥有文件读取访问权限,那么尝试访问相关操作系统上的一个已知任何用户均可读取的文件。提交下面其中一个值作为受控制的文件名参数:

img295a

幸运的话,浏览器将显示请求的文件的内容,如图10-5所示。

img295b

图10-5 成功的路径遍历攻击

(2)如果所攻击的功能拥有文件写入访问权限,那么要最终确定应用程序是否易于受到攻击,可能会更困难。通常,一种有效的测试是尝试写入两个文件,一个文件可被任何用户写入,另一个文件即使是根用户或管理员也禁止写入。例如,在Windows平台上可以尝试写入下面两个文件:

img295c

在UNIX平台上,禁止根用户写入的文件取决于使用的平台版本,但尝试用一个文件重写一个目录绝不可能取得成功,因此可以进行以下尝试:

img295d

在上面的每对测试中,如果应用程序在响应两个请求时表现出行为差异(例如,响应第二个请求时返回一条错误消息,而响应第一个请求时不返回错误消息),那么应用程序可能易于受到攻击。

(3)还有另一种方法可通过写入访问确定遍历漏洞,即尝试在Web服务器的Web根目录中写入一个新文件,然后尝试通过浏览器获得这个文件。但是,如果并不知道Web根目录的位置,或者访问文件的用户并不拥有写入权限,这种方法可能不会成功。

img001  注解  几乎每一种文件系统都接受试图向上回溯到文件系统根目录的多余遍历序列。因此,当探查漏洞时,像在上面的示例中一样,最好提交大量的遍历序列。附加数据的起始目录可能位于文件系统的“深处”,因此使用大量的序列有助于避免错误警报。

而且,Windows平台接受斜线(/)和反斜线(\)作为目录分隔符,而UNIX平台只接受斜线作为分隔符。另外,一些Web应用程序过滤两者之一。即使完全确信Web服务器运行的是UNIX操作系统,但应用程序仍然可能被Windows后端组件调用。为此,当探查遍历漏洞时,最好两者都进行测试。

img007  避开遍历攻击障碍

最初的遍历攻击尝试(如前所述)并未成功,并不意味着应用程序不容易受到攻击。许多应用程序开发者意识到路径遍历漏洞,并执行各种输入确认检查尝试防止这种漏洞。但是,这些防御措施往往存在缺陷,可被技术熟练的攻击者轻易避开。

第一种常见的输入过滤方法如下,首先检查文件名参数中是否存在任何路径遍历序列,如果存在,要么拒绝包含遍历序列的请求,要么尝试删除该序列,以对输入进行净化。这种类型的过滤往往易于受到各种攻击,它们使用编码或其他方法来避开过滤。这类攻击全都利用输入确认机制所面临的规范化问题,我们在第2章已经讲过。