如何在 java webapp 上完成空字节注入,或者更确切地说 - 如何防止它?
我应该查看请求参数的每个字节并将其“字节”值检查为 0 吗?我无法想象在请求参数中潜入一个 0 字节......可以吗?
我的主要目的是确保用于保存文件的文件名足够安全。现在,我没有寻找推荐的答案(例如):用下划线替换所有非单词字符。
如何在 java webapp 上完成空字节注入,或者更确切地说 - 如何防止它?
我应该查看请求参数的每个字节并将其“字节”值检查为 0 吗?我无法想象在请求参数中潜入一个 0 字节......可以吗?
我的主要目的是确保用于保存文件的文件名足够安全。现在,我没有寻找推荐的答案(例如):用下划线替换所有非单词字符。
允许用户以任意名称存储文件是危险的。如果用户提供 会发生什么"../../../WINDOWS/explorer.exe"
?您应该将文件名限制为仅包含已知无害的字符。
'\0'
不知道是无害的。就 Java 而言,'\0'
它是一个和其他任何字符一样的字符。但是,操作系统可能会将其解释'\0'
为字符串的结尾。如果一个字符串从 Java 传递到操作系统,那么不同的解释可能会导致可利用的错误。考虑:
if (filename.endsWith(".txt") {
store(filename, data);
}
其中文件名是“C:\Windows\explorer.exe\0.txt”,Java 以“.txt”结尾,操作系统以“.exe”结尾。
我不确定你为什么关心空字节注入。Java 不像 C/C++,其中的字符串是以 null 结尾的字符数组。
您应该绑定和验证来自 Web 层的参数和值。你如何定义“足够安全”?
您有 2 个选择:
1扫描字符串(首先将其转换为 char 数组)以查找空字节。
2 升级到 Java 8 或 Java 7u40 并受到保护。(是的,我测试过!,它有效!)
1013 年 5 月,Oracle 修复了该问题:http ://bugs.java.com/bugdatabase/view_bug.do?bug_id=8014846
Java 7 更新 40(2013 年 9 月左右发布)中修复了文件名中的空字节注入。所以,它现在已经修复了一段时间,但它是一个十多年的问题,它是 Java 中的一个 NASTY 漏洞。修复记录在这里:http ://bugs.java.com/bugdatabase/view_bug.do?bug_id=8014846
——戴夫·威彻斯