3

我对这个主题的初步理解是,我需要防止请求中提供一些垃圾字符以避免这些攻击。

我决定在使用之前通过对每个请求参数进行模式匹配来解决这个问题。互联网上的大多数帖子都讨论了 Null Byte,给出的示例显示了文件 IO 如何成为这种攻击的主要受害者。所以以下是我的问题

  1. 文件 IO 是唯一可以影响空字节的东西,还是其他操作也是这种攻击的受害者?
  2. 如果我想过滤我的请求参数以确保 null 再见攻击的安全,我需要注意哪些字符/字符串/模式?我有一份清单,我确信它不完整。%00 , \0 , 0x00 十六进制

我指的文章是:

http://projects.webappsec.org/w/page/13246949/Null%20Byte%20Injection

http://www.perlmonks.org/index.pl?node_id=38548

http://hakipedia.com/index.php/Poison_Null_Byte

提前致谢


所以为了更清楚:

第一篇文章指出了我正在谈论的 java 中的漏洞。字符串serverlogs.txt%00.db在 java 中是允许的,但对于 C/C++,这是serverlogs.txt,因为在 C %00 中将被空字节替换,导致字符串在 serverlogs.txt 之后终止。所以我们应该避免这样的字符。这就是我试图弄清楚我不应该允许哪些这样的字符。

String fn = request.getParameter("fn");
if (fn.endsWith(".db"))
{
File f = new File(fn);
//read the contents of “f” file
…
}
4

4 回答 4

4

你试过了吗?我写了这个快速单元测试:

@Test
public void test() throws Exception {
    FileOutputStream out = new FileOutputStream("test.txt");
    out.write("hello!".getBytes("utf-8"));
    out.close();
    String badPath = "test.txt\0foo";
    File file = new File(badPath);
    FileInputStream in = new FileInputStream(file);
    System.out.println(StreamUtils.copyToString(in, Charset.forName("utf-8")));
}

现在,如果空字符破坏了字符串,我希望将文件的内容打印到控制台。相反,我得到一个 FileNotFoundException。作为记录,这是在 Ubuntu 13.04 上使用 Java 1.7.0_40。

更新

进一步调查显示此代码File#isInvalid

final boolean isInvalid() {
    if (status == null) {
        status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
                                                   : PathStatus.INVALID;
    }
    return status == PathStatus.INVALID;
}
于 2013-09-25T04:51:32.020 回答
3

不是一个坏问题。我怀疑这是否是所有平台上的有效漏洞(例如,我相信 Windows 在其内核中使用 Pascal 样式的字符串,而不是空终止的字符串),但如果某些平台和 JVM,我一点也不感到惊讶事实上,他们很容易受到这种攻击。

要考虑的关键点是您的字符串来自哪里,以及在将它们作为字符串进行交互之前您对这些字节所做的操作。任何来自远程机器的字节都应该被认为是恶意的,除非另有证明。并且您永远不应该将来自 Internet 的字符串转换为本地计算机上的路径。是的,像 Apache 这样的网络服务器会这样做,但这也是他们拥有的最易受攻击的代码。正确的解决方案是:不要尝试将不良数据(如空字节)列入黑名单,只将好的数据列入白名单。

于 2013-09-25T04:46:11.667 回答
2

你也可以从另一个角度来解决空字节的问题!

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

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

如果指向我的个人博客的链接不被视为垃圾邮件,我会将其放在这里: http ://crocode.blogspot.ru/2015/03/java-null-byte-injections.html

于 2015-03-21T20:48:17.673 回答
1

如果我正确阅读了您的问题,您希望防止在字符串的终止空字节之后将可执行代码注入内存。

Java 不是 C。

Java 不为其字符串使用终止空字节,因此您无需对此进行保护。

于 2013-09-25T04:27:11.240 回答