Возможна ли инъекция кода в Java?

В настоящее время вы можете много узнать о введении кода, эксплойтах, буферах, стеках и переполнениях кучи и т.д., что приводит к внедрению и запуску кода. Интересно, что из этого относится к Java.

Я знаю, на языке Java нет указателей. Но не собирает ли JVM данные в кучи и/или стеки? Я знаю, что нет функции eval (например, в PHP), поэтому вы легко можете использовать ввод как Java-код. Я не уверен, что происходит на уровне байт-кода.

Я думаю, что XSS возможен, например, в приложении Java EE, когда никакие входы не фильтруются. Но не больше ли это инъекции JavaScript, потому что введенный код работает в браузере, а не в JVM?

Итак, какие инъекции кода возможны с java, а какие нет? И это верно и для других языков платформы Java?

Спасибо заранее.

Ответы

Ответ 1

Сама программа java практически не уязвима для инъекций кода. Тем не менее, весь собственный код, поддерживающий приложение, уязвим для всех типов инъекций кода - это включает в себя JVM и все собственные части кода в приложении или его библиотеках.

Кроме того, есть еще несколько вещей, которые следует учитывать:

Все, где java используется как шлюз для других систем, возможно:

SQL Injection

XSS (в конце концов это не что иное, как JavaScript Injection)

Если программа java сама по себе является интерпретатором/компилятором какого-либо типа, возможно, вам будет добавлен код в вашу интерпретированную язык/скомпилированную программу (сюда входит использование вашей программы в качестве java-компилятора...)

И, конечно, если вы можете заставить java-программу записать файл на диск, содержащий код (будь то native, java или что-то еще), вы можете получить его с помощью других средств (что может быть другой уязвимостью в вашем приложении, os или другом приложении) - это не прямая инъекция кода, но совершенно аналогичная по сути.

Ответ 2

Если приложение-сервер создает байт-код во время выполнения (например, BCEL или Javassist), и если на это создание может влиять пользовательский ввод, возможна инъекция кода.

Однако, если приложение не использует магию (это должно быть 99% всех приложений), это будет невозможно.

Ответ 3

Вы можете написать веб-сервис, который принял фрагмент кода Java, завернул его в объявлении класса/метода, сохранил его на диске, запустил на нем компилятор, а затем динамически загрузил и выполнил результат. Таким образом, инъекция кода, безусловно, возможна.

Но с типичными реализациями Java это, возможно, не очень эффективно из-за относительно тяжелого процесса компиляции (хотя это может быть и практичным для некоторых приложений).

Вставка кода очень важна для SQL, потому что "первая догадка" многих новичков заключается в использовании конкатенации строк для вставки переменных в оператор. Но он редко появляется в качестве идеи среди программистов на Java. Так что причина этого не вызывает большого беспокойства.

Если компиляторы Java становятся доступными в виде облегченных библиотечных сервисов, то у вас будет нечто гораздо более близкое к эквиваленту eval, и поэтому оно может стать актуальной проблемой.

Ответ 4

Если бы это было возможно, Java уже давно умерла.

С другой стороны, SQL-инъекции очень легко избежать, используя PreparedStatement, чтобы хранить управляемый пользователем вход, а XSS также очень легко избежать, используя <c:out/> для (re) отображения пользовательского ввода на веб-странице.

Ответ 5

Существует несколько способов, которыми Java-код можно вводить в приложение, например, используя API-интерфейс сценариев или динамический JSP.

В приведенном ниже коде пользователь может ввести произвольный Javascript в Java script.

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 для получения дополнительных примеров

Ответ 6

Если вы не делаете странные вещи на сервере (например, динамически генерируете код и т.д.), невозможно использовать команду для инъекций кода.

Хотя я могу думать о (уродливой) ситуации, когда приложение динамически создает JSP на основе пользовательского ввода. Этот JSP будет переведен на Java-код, который компилируется в байтовый код веб-контейнером, а затем выполняется. Это может ввести точку впрыска. Но генерация JSP динамически нормально не имеет никакого смысла.

Ответ 7

Вы не можете вводить Java. Но если вы не будете осторожны, люди могут добавить Javascript (т.е. XSS, как вы упоминаете) или SQL. Есть кучи и стеки, но нет способа добраться до них.

Ответ 8

Вы не можете вводить java, но все веб-приложения уязвимы для XSS, если вход не фильтруется должным образом. Также любое приложение, которое взаимодействует с базой данных sql, может быть уязвимо к SQL-инъекции. Чтобы этого избежать, вы захотите ознакомиться с параметризованными запросами.

Ответ 9

Java позволяет себе взламывать себя, я не уверен, правильно ли я читаю все эти ответы, но я считаю, что Java очень слабая. Впрыск очень возможен