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