当我在玩一些夺旗(CTF) 游戏时,由于这个波浪号 ~,我无法解决挑战。我正在玩,www.example.com/index.php
但是当我在末尾添加 (~) 时 www.example.com/index.php~
,一个名为 index.php 的文件开始下载。
你能向我解释一下这个波浪号(~)的作用是什么吗?
当我在玩一些夺旗(CTF) 游戏时,由于这个波浪号 ~,我无法解决挑战。我正在玩,www.example.com/index.php
但是当我在末尾添加 (~) 时 www.example.com/index.php~
,一个名为 index.php 的文件开始下载。
你能向我解释一下这个波浪号(~)的作用是什么吗?
它只是文件名的一部分,就像字母、数字和其他特殊字符可以是文件名的一部分一样。
通常在编辑文件之前通过附加波浪号来创建文件的“备份”,因此如果您搞砸了,您可以恢复以前的版本。在 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
),这可能会揭示其他漏洞的凭据或线索。
假设的系统管理员应该做两件事来避免这种情况:
您发现了 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~
。
为避免这种情况应采取的一些做法:
另一个重要提示是使用经过实战考验的构建工具来构建您的项目,这些工具强制执行合理的项目布局,并有一些关于如何识别哪些文件应该打包哪些不应该打包的好故事。例如,许多语言的构建工具不会盲目地归档源存储库中的所有内容,而是会选择性地将文件从其中复制到临时暂存目录中,然后将其归档,这样只有工具明确选择包含的文件才能获得包括。