0

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

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

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

4

4 回答 4

3

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

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

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

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

于 2012-04-16T22:41:54.913 回答
1

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

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

于 2012-04-16T21:59:55.743 回答
0

您有 2 个选择:

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

2 升级到 Java 8 或 Java 7u40 并受到保护。(是的,我测试过!,它有效!)

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

于 2015-03-21T20:52:21.740 回答
0

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

——戴夫·威彻斯

于 2016-08-22T14:22:09.053 回答