渗透测试步骤

可以利用读取访问路径遍历漏洞从包含有用信息的服务器上获取有益的文件,或者帮助优化针对其他漏洞的攻击。如下所示。

img002 操作系统与应用程序的密码文件。

img002 服务器与应用程序配置文件,以发现其他漏洞或优化另一次攻击。

img002 可能含有数据库证书的包含文件。

img002 应用程序使用的数据源,如 MySQL 数据库文件或XML文件。

img002 服务器可执行页面的源代码,以执行代码审查,搜索漏洞(例如GetImage.aspx?file=GetImage.aspx)。

img002 可能包含用户名和会话令牌的应用程序日志文件等。

如果发现一个允许写入访问的路径遍历漏洞,那么渗透测试的主要目标应该是利用它在服 务器上执行任意命令。利用漏洞实现这一目标的方法包括以下几种。

img002 在用户的启动文件夹中创建脚本。

img002 当用户下一次连接时,修改in.ftpd等文件执行任意命令。

向一个拥有执行许可的Web目录写入脚本,从浏览器调用它们。

2.防止路径遍历漏洞

迄今为止,避免向任何文件系统API传送用户提交的数据是防止路径遍历漏洞的最有效方法。许多时候,包含在最初的GetIfile.aspx?filename=keira.jpg示例中,应用程序完全没有必要实施防御。因为大多数文件都没有采用访问控制,攻击者可将这些文件存入Web根目录中,再通过URL直接访问。如果以上方法行不通,应用程序可能会保存一个可由页面处理的硬编码图像文件列表,并使用不同的标识符(如一个索引号)指定需要的文件。任何包含无效标识符的请求都可能遭到拒绝,因为没有受攻击面可供用户利用,使其操纵页面提供的文件路径。

有时,与实现文件上传与下载的工作流程功能一样,应用程序可能需要允许用户通过名称指定文件,这时,开发者可能采用最简单的办法,将用户提交的用户名传送给文件系统API,从而达到这种目的。在这种情况下,应用程序应实施深层防御措施,为路径遍历攻击设立几层障碍。

以下是一些可能有用的防御方法,在应用过程中,最好将它们组合在一起使用。

img002 对用户提交的文件名进行相关解码与规范化之后,应用程序应检查该文件名是否包含路径遍历序列(使用反斜线或斜线)或空字节。如果是这样,应用程序应停止处理请求。不得尝试对恶意文件名进行任何净化处理。

img002 应用程序应使用一个硬编码的、允许访问的文件类型列表,并拒绝任何访问其他文件类型的请求(完成上述解码与规范化之后)。

img002 对用户提交的文件名进行一切必要的过滤后,应用程序应使用适当的文件系统 API 确认是否一切正常,以及使用该文件名访问的文件是否位于应用程序指定的起始目录中。

在Java中,可通过使用用户提交的文件名示例一个java.io.File对象,然后对这个对象调用getCanonicalPath方法,即可达到上述目的。如果这个方法返回的字符串并不以起始目录的名称开头,那么用户已通过某种方式避开了应用程序的输入过滤,因而应用程序应拒绝执行该请求。

在ASP.NET中,可以将用户提交的文件名传送给System.Io.Path.GetFullPath方法,并对返回的字符串执行和上述Java中一样的检查,从而达到相同的目的。

应用程序可以使用一个chrooted环境访问包含被访问文件的目录,减轻大多数路径遍历漏洞造成的影响。在这种情况下,chrooted目录就好比是文件系统根目录,任何试图从这个目录向上回溯的多余遍历请求都被忽略。大多数UNIX平台都支持chrooted文件系统。在Windows平台上,以新逻辑驱动器的形式安装相关起始目录,并且使用相应的驱动器字母访问目录内容,即可实现类似的效果(至少对遍历漏洞而言是这样)。

应用程序应将其路径遍历攻击防御机制与日志和警报机制整合在一起。任何时候,只要收到一个包含路径遍历序列的请求,提出请求的用户就可能心存恶意,应用程序应在日志中进行记录, 标明该请求企图违反安全机制,并终止该用户的会话。如有可能,应冻结该用户账户并向管理员发出警报。

10.2.2 文件包含漏洞

许多脚本语言支持使用包含文件(include file)。这种功能允许开发者把可重复使用的代码插入到单个的文件中,并在需要时将它们包含在特殊功能的代码文件中。然后,包含文件中的代码被解释,就好像它插入到包含指令的位置一样。

1.远程文件包含

PHP语言特别容易出现文件包含漏洞,因为它的包含函数接受远程文件路径。这种缺陷已经成为PHP应用程序中大量漏洞的根源。

以一个向不同位置的人们传送各种内容的应用程序为例。用户选择他们的位置后,这个信息通过一个请求参数传送给服务器,代码如下:

img301a

应用程序通过以下方式处理Country参数:

img301b

这使执行环境加载位于Web服务器文件系统中的US.php文件。然后,这个文件的内容被复制到main.php文件中,并得以执行。

攻击者能够以各种方式利用这种行为,最严重的情况是指定一个外部URL作为包含文件的位置。PHP包含函数接受这个位置作为输入,接着,执行环境将获取指定的文件并执行其内容。因此,攻击者能够构建一个包含任意复杂内容的恶意脚本,将其寄存在他控制的Web服务器上,并通过易受攻击的应用程序函数调用它然后执行。例如:

img301c

2.本地文件包含

有时,应用程序根据用户可控制的数据加载包含文件,但这时不可能给位于外部服务器上的文件指定URL。例如,如果用户可控制的数据被提交给ASP函数Server.Execute,那么攻击者就可以执行任意一段ASP脚本,只要这段脚本属于调用这个函数的相同应用程序。

在这种情况下,攻击者仍然可以利用应用程序的行为执行未授权操作。

img002 在服务器上可能有一些通过正常途径无法访问的文件,例如,任何访问路径/admin的请求都会被应用程序实施的访问控制阻止。如果能够将敏感功能包含在一个授权访问的页面中,那么就可以访问那个功能。

img002 服务器上的一些静态资源也受到同样的保护,无法直接访问。如果能够将这些文件动态包含在其他应用程序页面中,那么执行环境就会将静态资源的内容复制到它的响应中。

3.查找文件包含漏洞

任何用户提交的数据项都可能引起文件包含漏洞。它们经常出现在指定一种语言或一个位置的请求参数中,也常常发生在以参数形式传送服务器端文件名的情况下。