发布于 2013-11-23 21:34:56
空字节是值为零的字节,即十六进制中的0x00。
存在与空字节相关的安全漏洞。之所以出现这种情况,是因为C使用空字节作为字符串终止符。其他语言(Java、PHP等)没有字符串终止符;它们分别存储每个字符串的长度。
现在,考虑一个接受文件上传的Java应用程序。也许我们想让用户上传.jpg文件,而不是其他任何东西。事实上,如果用户可以上传.jsp文件,这将是一个严重的安全漏洞。
黑客可能会尝试上传hack.jsp<NUL>.jpg。让我们考虑一下这将如何处理。首先,Java将查看文件名,看到它以.jpg结尾,并允许上传。然后调用用C编写的操作系统库,C将<NUL>字符看作字符串终止符,因此它将文件保存为hack.jsp。
许多语言通过显式禁止文件名中的<NUL>字节来解决这个问题。我知道Python和PHP会这样做。然而,如果你的语言不为你做到这一点,你必须自己去做。更多信息- OWASP:空字节注入
我不知道“序列化实例”究竟与此有何关联,但我认为这让您了解了发生了什么。
发布于 2013-11-24 06:28:31
每个字符都有一个由相应字符集指定的数字值。例如,通常情况下,A是65,a是97。但是如果数字是0,那么它不是真正的字符,它是一个"null";这基本上意味着不是一个字符。
在C和C++中,这个"null“字符用于表示字符串的结尾。所以"HELLO“是这样存储的:
H E L L O
72 69 76 76 79 00 最后的00说“停在这里”。但并非所有框架都使用C-字符串及其“空终止符”格式;事实上,大多数框架不使用。相反,字符串的长度是预先存储的,实际内容可以包含任何内容,包括这些空字符--其数值为0的字符。
因此,在这个实例中,如果名称包含这些空字符之一,那么大多数代码都不会介意;允许使用空字节。但是,当名称转换为FileUpload代码时,这个null最终会导致一些混乱。有些代码认为名称以空字节结尾,而其他位则认为空字节只是另一个字母。这种混淆,即两段代码在名称上不一致,就会导致安全漏洞。
https://security.stackexchange.com/questions/45955
复制相似问题