首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“序列化实例中的空字节文件名”意味着什么?

“序列化实例中的空字节文件名”意味着什么?
EN

Security用户
提问于 2013-11-23 20:17:56
回答 2查看 23.7K关注 0票数 8

我正在浏览此页,这使我重定向到漏洞,因为我是一个Java,并且知道受影响的库。

基本上,漏洞是这样写的:

我们发现Apache在序列化实例中错误地处理了带有空字节的文件名。攻击者可以利用此问题写入任意文件。

我只是不想知道这句话意味着什么?

序列化实例中具有空字节的...file名称。

EN

回答 2

Security用户

回答已采纳

发布于 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:空字节注入

我不知道“序列化实例”究竟与此有何关联,但我认为这让您了解了发生了什么。

票数 17
EN

Security用户

发布于 2013-11-24 06:28:31

每个字符都有一个由相应字符集指定的数字值。例如,通常情况下,A65a97。但是如果数字是0,那么它不是真正的字符,它是一个"null";这基本上意味着不是一个字符。

在C和C++中,这个"null“字符用于表示字符串的结尾。所以"HELLO“是这样存储的:

代码语言:javascript
复制
 H   E   L   L   O  
72  69  76  76  79  00 

最后的00说“停在这里”。但并非所有框架都使用C-字符串及其“空终止符”格式;事实上,大多数框架不使用。相反,字符串的长度是预先存储的,实际内容可以包含任何内容,包括这些空字符--其数值为0的字符。

因此,在这个实例中,如果名称包含这些空字符之一,那么大多数代码都不会介意;允许使用空字节。但是,当名称转换为FileUpload代码时,这个null最终会导致一些混乱。有些代码认为名称以空字节结尾,而其他位则认为空字节只是另一个字母。这种混淆,即两段代码在名称上不一致,就会导致安全漏洞。

票数 6
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/45955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档