17

最近では、コード インジェクション、エクスプロイト、バッファ オーバーフロー、スタック オーバーフロー、ヒープ オーバーフローなど、コードのインジェクションと実行につながるものについて多くを読むことができます。このことの何が Java に関連するのだろうか。

Java言語にはポインターがありません。しかし、JVM はデータをヒープやスタックに編成しませんか? (PHPのような)eval関数がないことはわかっているので、入力をJavaコードとして簡単に使用することはできません。バイトコードレベルで何が起こっているのかよくわかりません。

たとえばJava EEアプリケーションで、入力がフィルタリングされていない場合、XSSは可能だと思います。しかし、これはむしろ JavaScript インジェクションではないでしょうか。インジェクトされたコードは JVM ではなくブラウザで実行されるからです。

では、Java ではどのコード インジェクションが可能で、どれが可能でないのでしょうか? これは、他の Java プラットフォーム言語にも当てはまりますか?

前もって感謝します。

4

8 に答える 8

18

Javaプログラム自体は、コードインジェクションに対してほとんど脆弱ではありません。ただし、アプリをサポートするすべてのネイティブコードは、さまざまな種類のコードインジェクションに対して脆弱です。これには、JVMと、アプリまたはそのライブラリ内のすべてのネイティブコード部分が含まれます。

また、考慮すべきことがいくつかあります。

Javaが他のシステムへのゲートウェイとして使用されている場合は何でも可能です。

SQLインジェクション

XSS(最終的にはJavaScriptインジェクションにすぎません)

Javaプログラム自体が何らかのインタプリタ/コンパイラである場合、解釈された言語/コンパイル済みプログラムにコードを挿入できる可能性があります(これには、プログラムをJavaコンパイラとして使用することも含まれます...)

そしてもちろん、Javaプログラムにコード(ネイティブ、Java、その他)を含むファイルをディスクに書き込むことができれば、他の方法で実行できる可能性があります(これはアプリの別の脆弱性である可能性があります) 、OSまたは別のアプリ)-これは直接のコードインジェクションではありませんが、事実上非常に似ています。

于 2009-12-10T13:33:55.323 に答える
5

サーバー アプリケーションが実行時に (たとえばBCELやJavassist を使用して)バイトコードを作成し、この作成がユーザー入力の影響を受ける可能性がある場合は、コード インジェクションが可能です。

ただし、アプリケーションが魔法を使用しない場合 (すべてのアプリケーションの 99% である必要があります)、それは不可能です。

于 2009-12-10T13:30:15.430 に答える
4

スクリプト API や動的 JSP インクルードの使用など、Java コードをアプリケーションに挿入する方法はいくつかあります。

以下のコードにより、ユーザーは任意の 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 Web サイトを確認してください

于 2016-12-12T23:16:06.927 に答える
2

Java コード スニペットを受け入れ、それをクラス/メソッド宣言でラップし、ディスクに保存し、コンパイラを実行し、結果を動的にロードして実行する Web サービスを作成できます。したがって、コード インジェクションは確かに可能です。

しかし、典型的な Java 実装では、コンパイル プロセスが比較的重いため、あまり効率的ではない可能性があります (一部のアプリではまだ実用的かもしれません)。

多くの初心者の「最初の推測」は、文字列連結を使用してステートメントに変数を挿入することであるため、コード インジェクションは SQL と非常に関連性があります。しかし、それが Java プログラマーの間でアイデアとして現れることはめったにありません。そのため、あまり気にする必要はありません。

Java コンパイラが軽量のライブラリ サービスとして公開されるようになると、Java コンパイラに相当するものがはるかに近くevalなり、関連する懸念事項になり始める可能性があります。

于 2009-12-10T13:33:15.690 に答える
2

もしそれが可能であったなら、Java はすでに長い間死んでいたでしょう。

一方、SQL インジェクションは、PreparedStatementユーザー制御の入力を保存するために使用することで非常に簡単に回避できます。また、XSS は<c:out/>、Web ページでユーザー制御の入力を (再) 表示するために使用することで非常に簡単に回避できます。

于 2009-12-10T13:39:26.693 に答える
1

サーバー上で奇妙なこと(動的にコードを生成するなど)を行わない限り、コードインジェクションに対して脆弱になることは不可能です。

アプリケーションがユーザー入力に基づいて動的にJSPを作成する(醜い)状況を考えることができますが。そのJSPはJavaコードに変換され、Webコンテナによってバイトコードにコンパイルされてから実行されます。これにより、注入ポイントが導入される可能性があります。ただし、通常、JSPを動的に生成しても意味がありません。

于 2009-12-10T13:35:24.343 に答える
0

Javaを挿入することはできませんが、入力が適切にフィルタリングされていない場合、すべてのWebアプリケーションはXSSに対して脆弱です。また、SQLデータベースと対話するアプリケーションは、SQLインジェクションに対して脆弱である可能性があります。これを回避するには、パラメータ化されたクエリを調べてください。

于 2009-12-10T13:34:22.663 に答える
0

Java を注入することはできません。しかし、注意を怠ると、人々は Javascript (つまり、あなたが言及した XSS) や SQL を注入する可能性があります。ヒープとスタックがありますが、それらに到達する方法はありません。

于 2009-12-10T13:30:24.897 に答える