【问题标题】:how to protect against Null Byte Injection in a java webapp如何在 java webapp 中防止空字节注入
【发布时间】:2012-04-28 06:18:59
【问题描述】:

如何在 java webapp 上完成空字节注入,或者更确切地说 - 如何防止它?

我是否应该查看请求参数的每个字节并检查其“字节”值是否为 0 ?我无法想象在请求参数中潜入一个 0 字节......可以吗?

我的主要目的是确保用于保存文件的文件名足够安全。现在,我没有寻找推荐的答案(例如):用下划线替换所有非单词字符。

【问题讨论】:

标签: java security web-applications xss


【解决方案1】:

允许用户以任意名称存储文件是危险的。如果用户提供"../../../WINDOWS/explorer.exe" 会发生什么?您应该将文件名限制为仅包含已知无害的字符。

'\0' 不知道是无害的。就 Java 而言,'\0' 与其他字符一样。但是,操作系统可能会将'\0' 解释为字符串的结尾。如果一个字符串从 Java 传递到操作系统,那么不同的解释可能会导致可利用的错误。考虑:

if (filename.endsWith(".txt") {
    store(filename, data);
}

其中文件名为“C:\Windows\explorer.exe\0.txt”,Java 以“.txt”结尾,操作系统以“.exe”结尾。

【讨论】:

  • 这用于将.jsp\0.html文件上传到jroller,并在服务器上执行代码。
  • @meriton 如何检查文件名?我们应该遍历字符串的 bytes[] 并查找 0 吗?
【解决方案2】:

我不确定您为什么担心空字节注入。 Java 不像 C/C++,其中的字符串是以 null 结尾的字符数组。

您应该绑定和验证来自 Web 层的参数和值。你如何定义“足够安全”?

【讨论】:

  • 但是 Java 是否对 null bute injection 敏感?我同意应该进行输入验证,但是 OP 有一个具体的问题。无论如何,这似乎是可能的。
  • 我不知道那是什么意思。如果它是一个文件路径,并且我将一个空字节“注入”到它的中间,会发生什么?听起来对我来说是一条无效的路径。
  • Java 空字节注入令人惊讶地被社区忽视了。这有充分的理由:毕竟,Java 不使用空字节作为字符串结束符号。但是,Java IO 库将字符串传递给底层操作系统,在大多数情况下,底层操作系统使用“C”引擎进行最终处理。并且“C”处理器总是拒绝空字节字符之外的任何内容。
【解决方案3】:

你有两个选择:

1 扫描字符串(首先将其转换为 char 数组)以查找空字节。

2 升级到 Java 8 或 Java 7u40,您将受到保护。 (是的,我测试过!,它的工作原理!)

1013 年 5 月,Oracle 修复了该问题:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8014846

【讨论】:

    【解决方案4】:

    文件名中的空字节注入已在 Java 7 更新 40(2013 年 9 月左右发布)中得到修复。所以,它现在已经修复了一段时间,但它是一个十多年的问题,它是 Java 中的一个 NASTY 漏洞。修复记录在这里:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8014846

    -戴夫·威彻斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-19
      • 2016-08-31
      • 1970-01-01
      • 2020-12-15
      • 2010-10-26
      • 2015-09-07
      • 2021-03-13
      • 1970-01-01
      相关资源
      最近更新 更多