【发布时间】:2012-04-28 06:18:59
【问题描述】:
如何在 java webapp 上完成空字节注入,或者更确切地说 - 如何防止它?
我是否应该查看请求参数的每个字节并检查其“字节”值是否为 0 ?我无法想象在请求参数中潜入一个 0 字节......可以吗?
我的主要目的是确保用于保存文件的文件名足够安全。现在,我没有寻找推荐的答案(例如):用下划线替换所有非单词字符。
【问题讨论】:
标签: java security web-applications xss
如何在 java webapp 上完成空字节注入,或者更确切地说 - 如何防止它?
我是否应该查看请求参数的每个字节并检查其“字节”值是否为 0 ?我无法想象在请求参数中潜入一个 0 字节......可以吗?
我的主要目的是确保用于保存文件的文件名足够安全。现在,我没有寻找推荐的答案(例如):用下划线替换所有非单词字符。
【问题讨论】:
标签: java security web-applications xss
允许用户以任意名称存储文件是危险的。如果用户提供"../../../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,并在服务器上执行代码。
我不确定您为什么担心空字节注入。 Java 不像 C/C++,其中的字符串是以 null 结尾的字符数组。
您应该绑定和验证来自 Web 层的参数和值。你如何定义“足够安全”?
【讨论】:
null bute injection 敏感?我同意应该进行输入验证,但是 OP 有一个具体的问题。无论如何,这似乎是可能的。
你有两个选择:
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
-戴夫·威彻斯
【讨论】: