【问题标题】:How can I create a file with null bytes in the filename?如何创建文件名中包含空字节的文件?
【发布时间】:2019-01-15 18:45:47
【问题描述】:

对于安全测试,我需要传递一个在其内容和文件名中包含空字符的文件。

对于正文内容,使用方便printf

$ printf "Hello\00, Null!" > containsnull.txt
$ xxd contains.null
0000000: 4865 6c6c 6f00 2c20 4e75 6c6c 21         Hello., Null!

但是如何创建名称中包含空字节的文件?

注意:如果可能,首选bashpythonnodejs 中的解决方案

【问题讨论】:

  • NUL 是我所知道的每个文件系统的文件名中的非法字符。
  • @MichaWiedenmann, en.wikipedia.org/wiki/Filename posix 不允许空字符。
  • @MichaWiedenmann: NUL 是一个非法字符吗? 由于大多数操作系统使用 C 样式字符串(与 RL 字符串或 Pascal 字符串相反),因此文件名字符串使用 NUL 来确定文件名字符串的结尾。您可能能够强制字符串包含 NUL,但您不太可能能够处理生成的文件。
  • 变量名或文件名不能包含NUL

标签: bash null filenames


【解决方案1】:

通过 POSIX 或 Windows API 创建包含空字节的文件名是不可能的。在我知道的所有 Unix 系统上,即使使用绕过正常 API 的不良应用程序,也不可能创建包含空字节的文件名,因为内核本身将其所有文件名输入视为空- 终止的字符串。我相信这在 Windows 上也是如此,但我不完全确定。

作为应用程序程序员,就安全性而言,这意味着如果您确定所拥有的是文件名,则无需担心文件名包含空字节。另一方面,如果给您一个字符串并告诉您将其用作文件名,例如,如果您正在编写服务器并让客户端选择文件名,则需要确保该字符串不包含 null字节。这只是其他要求之一,包括字符串长度、是否存在目录分隔符(/\)、保留名称(...、保留 Windows 文件名,例如 nul.txt 或 @987654326 @),等等。在大多数 Unix 系统上,在它们的本地文件系统上,文件名的约束是:没有空字节或斜线,长度在 1 和某个最大值之间,并且两个名称 ... 被保留。 Windows 和 Unix 上的非本地文件系统有额外的限制(可以通过 Windows 上的直接内核调用将 / 放在文件名中)。

要在文件内容中放入空字节,只需使用任何允许字符串中包含空字节的语言将字符串写入文件即可。在 bash 中,不能在字符串中存储空字节,因此需要使用另一种方法,例如 printf '\0'echo "abc" | tr b '\0'

【讨论】:

    【解决方案2】:

    您不必担心 Unix 和 Windows 上的文件名包含空字节,因为它们不能。

    但是,被视为 UTF-8 的文件名可以使用无效的“超长”序列指定 NUL 字符 (U+0000):两个、三个或四个字节的 UTF-8 序列,它们的全零代码点有效载荷位。

    这可能是一个安全问题。例如,不检查这一点的 UTF-8 解码器最终会生成一个 wchar_t 字符值 0,然后意外终止宽字符串。

    例如,the byte sequence C0 80 是 NUL 的超长编码。这显然被称为“Modified UTF-8”的东西专门用于编码不终止用于保存 UTF-8 的 C 字符串的 NUL 字符。

    如果您正在进行安全测试,这很重要;您可以通过超长编码测试程序是否容易受到 NUL 字符(和其他)注入的影响。

    【讨论】:

      【解决方案3】:

      试试$'\u000d'

      实际上不是空字节,但可能足够接近以使人们感到困惑,因为您必须非常接近才能看到最后一个字符是 D 而不是 0,因为它通常会打印(如果不只是空白)为里面有十六进制代码的小盒子。

      当我在我的 $HOME 中找到一个目录时发现了这个,命名为...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 2022-10-23
        • 2016-12-23
        • 2016-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多