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

时间:2019-01-15 18:45:48

标签: bash null filenames

为了进行安全测试,我需要传递一个文件,该文件的内容和文件名包含空字符。

对于正文内容,很容易使用printf

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

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

注意:如果可能,最好使用bashpythonnodejs的解决方案

3 个答案:

答案 0 :(得分:3)

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

作为应用程序程序员,就安全性而言,这意味着您不必担心包含空字节的文件名,只要您确定拥有的就是文件名。另一方面,如果为您提供了一个字符串并被告知将其用作文件名,例如,如果您正在对服务器进行编程并让客户端选择文件名,则需要确保该字符串不包含null个字节。这只是其中的一个要求,包括字符串长度,是否存在目录分隔符(/\),保留名称(...,保留Windows文件名在大多数Unix系统上,在其本机文件系统上,文件名的约束为:无空字节或斜杠,长度在1到某个最大值之间,以及保留了两个名称nul.txtprn。 Windows和Unix上的非本机文件系统还有其他限制(可以在Windows上通过直接内核调用在文件名中放置.

要在文件内容中放置一个空字节,只需使用允许在字符串中包含空字节的任何语言向文件中写入一个字符串即可。在bash中,您不能在字符串中存储空字节,因此需要使用其他方法,例如../

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:0)

试试$'\u000d'

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

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