文件扩展名末尾的波浪号 (~) 是什么意思?

信息安全 Web应用程序 网络服务
2021-09-06 17:44:15

当我在玩一些夺旗(CTF) 游戏时,由于这个波浪号 ~,我无法解决挑战。我正在玩,www.example.com/index.php但是当我在末尾添加 (~) 时 www.example.com/index.php~,一个名为 index.php 的文件开始下载。

你能向我解释一下这个波浪号(~)的作用是什么吗?

4个回答

它只是文件名的一部分,就像字母、数字和其他特殊字符可以是文件名的一部分一样。

通常在编辑文件之前通过附加波浪号来创建文件的“备份”,因此如果您搞砸了,您可以恢复以前的版本。在 Bash 中,这可以很容易地cp index.php{,~}扩展为cp index.php index.php~.

它可能在 CTF 上,因为人们经常忘记这些文件并让它们不受保护。特别是像 index.php 这样的文件可能包含数据库凭据。

在 bash 中,参数开头的波浪号也扩展为主文件夹:~变为$HOME(例如/home/yourusername),或~username变为该用户的主文件夹(例如~root,通常扩展为/root)。但是,这里不是这种情况,因为它不是一开始的。

~是添加到文件名的常用后缀,用于文件的备份或临时副本。这可能是手动备份或由编辑器或其他工具创建的备份。

尽管大多数文件系统没有“文件扩展名”的概念,但许多软件使用文件名中第一个或最后一个之后的部分.来确定文件类型以及如何处理它。

在这种情况下,Web 服务器将被配置为执行以 结尾的文件.php,但提供其他文件类型的内容由于.php~似乎是不同的“文件扩展名”,它与要执行的规则不匹配,并且为您提供源代码。这反过来又允许您查看应该执行的 PHP 脚本的可能内容(即,它可能index.php~具有与 类似的内容index.php),这可能会揭示其他漏洞的凭据或线索。

假设的系统管理员应该做两件事来避免这种情况:

  1. 没有留下备份文件位于映射到 Web URL 的目录中。
  2. 将 Web 服务器配置为对无法识别的文件扩展名做出响应,而不是文件内容。

您发现了 Web 应用程序的潜在安全漏洞。

场景是这样的:

  • Web 服务器被配置为使用脚本解释器(例如,用于文件的 PHP)来解释特定的文件扩展名.php
  • 一些文本编辑器将您正在编辑的文件的备份或“工作”副本存储为相同的文件名,但末尾带有波浪号 ( ~)。波浪号通常表示“这是系统生成的,不用担心”。
  • 这些文件有时可能会在您完成编辑后保留,因为编辑器未配置为删除它们,或者编辑器在没有正确关闭的情况下被杀死。
  • 通过在 URL 的末尾添加波浪号,您可能会很幸运地偶然发现网站管理员意外离开(或上传到)其实时生产站点的其中一个备份副本。
  • Web 服务器不会使用脚本解释器对其进行解释,因为扩展名不同(例如,它不是“.php”),因此它会退回到未知文件扩展名的默认行为,即作为文件下载服务。
  • 你可以阅读他们脚本的源代码。

这是否有用是可变的。有时源代码可能包含数据库或外部服务的身份验证详细信息。

我正在玩,www.example.com/index.php但是当我在末尾添加 (~) 时 www.example.com/index.php~,一个带有名称的文件index.php开始下载。

正如其他人所提到的,许多文本编辑器(我想说的是 Emacs)通过创建另一个名称与原始文件相同但附加了波浪号的文件来备份您处理的文件的早期版本。

然而,其他答案没有得到足够强调的是,您可以访问这样的文件是不正确的版本控制不正确的构建和部署的某种混合的结果。

不正确的版本控制(忽略“忽略”文件)

版本控制系统 (VCS) 具有配置存储库的机制,以便忽略与指定模式匹配的 VCS 文件名。当今最流行的版本控制系统是 Git,其机制是名为.gitignore. 大多数源代码 Git 存储库应该有一个顶级.gitignore文件,其中包含以下行:

*~

这是一种告诉 Git 忽略名称以波浪号结尾的文件的模式。开发人员的一个常见错误是不努力维护这些文件,或者完全忽略它们。例如,许多 IDE 在您的源代码树中发现未跟踪的文件时会弹出警告,并让您选择告诉 IDE 忽略它们。您几乎不应该使用该选项;相反,弄清楚要在 repo 的“忽略”文件中放入什么,以便自动签出它的每个人都设置为永远不会签入这些文件。

严格使用此类“忽略”文件对保护您免受许多其他安全问题大有帮助。例如,它们可以帮助保护您免受开发人员意外签入秘密凭据的常见问题。我发现一种有用的做法是采用标准布局,您的项目有一个指定目录供开发人员放置此类文件。然后,您可以设置您的 VCS 存储库,以便忽略该目录中的文件,并设计您的应用程序,以便开发构建将从那里获取其配置。

不正确的构建和部署过程

可能导致此类问题的另一件事是构建和部署过程会错误地传播相关文件index.php~

为避免这种情况应采取的一些做法:

  • 如上所述,让您的版本控制系统首先忽略文件。
  • 拥有一个自动构建系统,该系统会定期从源代码控制中检查您的项目,构建并打包它以进行部署。
  • 永远不要编辑构建系统的工作目录中的文件,以便它的源存储库副本始终是干净的。始终遵守开发人员环境与自动构建环境分开的原则。
  • 永远不要从开发人员自己的环境中构建版本。

另一个重要提示是使用经过实战考验的构建工具来构建您的项目,这些工具强制执行合理的项目布局,并有一些关于如何识别哪些文件应该打包哪些不应该打包的好故事。例如,许多语言的构建工具不会盲目地归档源存储库中的所有内容,而是会选择性地将文件从其中复制到临时暂存目录中,然后将其归档,这样只有工具明确选择包含的文件才能获得包括。