17

现在你可以阅读很多关于代码注入、漏洞利用、缓冲区、堆栈和堆溢出等导致注入和运行代码的信息。我想知道这些东西与 Java 有什么关系。

我知道,Java 语言中没有指针。但是JVM不是在堆和/或堆栈中组织数据吗?我知道没有 eval 函数(就像在 PHP 中一样),所以你不能轻易地将输入用作 Java 代码。我不太确定字节码级别发生了什么。

我认为 XSS 是可能的,例如在 Java EE 应用程序中,当没有过滤输入时。但这不是更多的 JavaScript 注入,因为注入的代码在浏览器中运行,而不是在 JVM 中?

那么哪些代码注入可以使用 java 而哪些不可以呢?其他 Java 平台语言也是如此吗?

提前致谢。

4

8 回答 8

18

Java 程序本身几乎不会受到代码注入的影响。但是,支持应用程序的所有本机代码都容易受到所有不同类型的代码注入的影响——这包括 JVM 和应用程序或其库中的所有本机代码部分。

此外,还有一些事情需要考虑:

任何使用 java 作为通往其他系统的网关的地方都是可能的:

SQL 注入

XSS(说到底无非就是 JavaScript 注入)

如果 java 程序本身是某种解释器/编译器,则可以将代码注入到您的解释语言/编译程序中(这包括将您的程序用作 java 编译器......)

当然,如果您可以让 java 程序将包含代码的文件写入磁盘(无论是本机代码、java 代码还是其他代码),您也许可以通过其他方式执行它(这可能是您的应用程序中的另一个漏洞,操作系统或其他应用程序) - 这不是直接代码注入,但效果非常相似。

于 2009-12-10T13:33:55.323 回答
5

如果服务器应用程序在运行时创建字节码(例如使用BCELJavassist),并且如果此创建可能受到用户输入的影响,那么代码注入是可能的。

但是,如果您的应用程序不使用任何魔法(这应该是所有应用程序的 99%),那将是不可能的。

于 2009-12-10T13:30:15.430 回答
4

有几种方法可以将 Java 代码注入应用程序,例如使用脚本 API 或动态 JSP 包含。

下面的代码允许用户将任意 Javascript 注入 Java 的脚本引擎。

import javax.script.*;

public class Example1 {
    public static void main(String[] args) {
        try {
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("JavaScript");
            System.out.println(args[0]);
            engine.eval("print('"+ args[0] + "')");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

在这种情况下,攻击者决定注入在文件系统上创建文件的代码。

hallo'); var fImport = new JavaImporter(java.io.File); with(fImport) { var f = new File('new'); f.createNewFile(); } //

查看owasp网站以获取更多示例

于 2016-12-12T23:16:06.927 回答
2

您可以编写一个接受 Java 代码片段的 Web 服务,将其包装在类/方法声明中,将其保存到磁盘,在其上运行编译器,然后动态加载并执行结果。所以代码注入当然是可能的。

但是对于典型的 Java 实现,由于相对重量级的编译过程,它可能不是很有效(尽管它对于某些应用程序可能仍然实用)。

代码注入与 SQL 高度相关,因为许多初学者的“第一个猜测”是使用字符串连接将变量插入到语句中。但它很少在 Java 程序员中作为一个想法出现。所以这就是它没有太大问题的原因。

如果 Java 编译器被暴露为轻量级库服务,那么您将拥有更接近于等价物的东西eval,因此它可能开始成为一个相关的问题。

于 2009-12-10T13:33:15.690 回答
2

如果可能的话,Java 早就死了。

另一方面,通过用于存储用户控制的输入很容易避免 SQL 注入,并且通过在网页上使用(重新)显示用户控制的输入PreparedStatement也很容易避免 XSS 。<c:out/>

于 2009-12-10T13:39:26.693 回答
1

除非你在服务器上做一些奇怪的事情(比如动态生成代码等),否则代码注入是不可能的。

虽然我可以想到一种(丑陋的)情况,即应用程序根据用户输入动态创建 JSP。该 JSP 将被转换为 Java 代码,由 Web 容器编译为字节码,然后执行。这可能会引入一个注入点。但是动态生成 JSP 通常没有任何意义。

于 2009-12-10T13:35:24.343 回答
0

你不能注入Java。但是,如果您不小心,人们可能会注入 Javascript(即您提到的 XSS)或 SQL。有堆和栈,但没有办法得到它们。

于 2009-12-10T13:30:24.897 回答
0

你不能注入 java,但是如果输入没有被正确过滤,所有的 web 应用程序都容易受到 XSS 的攻击。此外,任何与 sql 数据库交互的应用程序都可能容易受到 SQL 注入的攻击。为避免这种情况,您需要查看参数化查询。

于 2009-12-10T13:34:22.663 回答