2009-12-10 32 views
13

hoy en día puede leer mucho sobre inyección de código, exploits, buffer-, stack- y heap-overflows etc. lo que lleva a inyectar y ejecutar código. Me pregunto qué de estas cosas es relevante para Java.¿Es posible la inyección de código en Java?

Lo sé, no hay punteros en el lenguaje Java. Pero, ¿la JVM no organiza los datos en montones y/o pilas? Sé que no hay una función eval (como en PHP) por lo que no puede usar fácilmente una entrada como código Java. No estoy tan seguro de lo que está pasando en el nivel de bytecode.

Creo que XSS es posible, por ejemplo en una aplicación Java EE, cuando no se filtran las entradas. ¿Pero no se trata más de una inyección de JavaScript, porque el código inyectado se ejecuta en el navegador y no en la JVM?

Entonces, ¿qué inyecciones de código son posibles con java y cuáles no? ¿Y esto también es cierto para otros lenguajes de plataforma Java?

Gracias de antemano.

Respuesta

15

Un programa java en sí no es vulnerable a la inyección de código. Sin embargo, todo el código nativo que admite la aplicación es vulnerable a todos los diferentes tipos de inyección de código: esto incluye la JVM y todas las partes de código nativas en la aplicación o sus bibliotecas.

Además, hay algunas cosas más a tener en cuenta:

Cualquier cosa en Java se utiliza como puerta de entrada a otros sistemas es posible:

inyección SQL

XSS (que está en el final nada más que inyección de JavaScript)

Si el programa Java es en sí mismo un intérprete/compilador de algún tipo, podría ser posible insertar código en su lenguaje interpretado/programa compilado (esto incluye usar su programa como jav un compilador ...)

Y, por supuesto, si puede obtener el programa java para escribir un archivo en el disco que contiene código (ya sea nativo, java u otra cosa) puede ser ejecutado por otros medios (que puede ser una vulnerabilidad diferente en su aplicación, el sistema operativo u otra aplicación): no se trata de una inyección directa de código, pero tiene un efecto bastante similar.

4

Si la aplicación de servidor crea bytecode en tiempo de ejecución (por ejemplo con BCEL o Javassist), y si esta creación puede ser influenciada por la entrada del usuario, entonces es posible una inyección de código.

Sin embargo, si su aplicación no usa magia (que debería ser el 99% de todas las aplicaciones), no será posible.

0

No se puede inyectar Java. Pero si no tiene cuidado, las personas podrían inyectar Javascript (es decir, XSS como usted menciona) o SQL. Hay montones y montones, pero no hay forma de llegar a ellos.

3

Puede escribir un servicio web que acepte un fragmento de código Java, lo envuelva en una declaración de clase/método, lo guarde en disco, ejecute el compilador y luego cargue y ejecute dinámicamente el resultado. Entonces la inyección de código es ciertamente posible.

Pero con las implementaciones típicas de Java, quizás no sea muy eficiente debido al proceso de compilación relativamente pesado (aunque aún podría ser práctico para algunas aplicaciones).

La inyección de código es muy relevante para SQL porque la "primera suposición" de muchos principiantes es utilizar la concatenación de cadenas para insertar variables en una instrucción. Pero rara vez surge como una idea entre los programadores de Java. Esa es la razón por la cual no es una gran preocupación.

Si los compiladores de Java se exponen como servicios de biblioteca livianos, entonces tendría algo mucho más cercano al equivalente de eval y por lo tanto podría comenzar a ser una preocupación relevante.

+0

La observación acerca de la eficiencia no parece terriblemente relevante en este contexto, la inyección de código no necesariamente tiene que ser eficiente. La mayoría de los exploits no requieren un alto rendimiento ... El punto es que no muchas aplicaciones hacen la cosa de "aceptar código, compilarlo, ejecutarlo", pero las que lo hacen serían vulnerables. – sleske

+0

"Si los compiladores Java se exponen como servicios de biblioteca livianos": bueno, ya lo están (echa un vistazo a javax.tools.JavaCompiler, http://java.sun.com/javase/6/docs/api/javax/tools /JavaCompiler.html). Pero, de nuevo, para que funcione la inyección de código, la aplicación bajo ataque necesita * usar * JavaCompiler, que afortunadamente no lo hace. – sleske

+1

-1 porque la discusión de vulnerabilidades es bastante confusa ... – sleske

0

No se puede inyectar java, pero todas las aplicaciones web son vulnerables a XSS si la entrada no se filtra correctamente. Además, cualquier aplicación que interactúe con una base de datos sql puede ser vulnerable a la inyección SQL. Para evitar esto, querrá consultar las Consultas parametrizadas.

1

A menos que esté haciendo cosas raras en el servidor (como la generación dinámica de código, etc.), es imposible usar la inyección de código.

Aunque puedo pensar en una situación (fea) donde la aplicación crea dinámicamente un JSP basado en la entrada del usuario. Ese JSP se traducirá al código de Java, que se está compilando a byte-code por el contenedor web, y luego se ejecutará. Esto podría introducir un punto de inyección. Pero generar JSP dinámicamente normalmente no tiene ningún sentido.

2

Si fuera posible, Java ya habría estado muerto por mucho tiempo.

Por otro lado, las inyecciones SQL son muy fáciles de evitar mediante el uso de PreparedStatement para almacenar la entrada controlada por el usuario y XSS es también muy fácil de evitar mediante el uso de <c:out/> para (re) presentar de entrada controlada por el usuario en la página web.

2

Hay varias maneras en que el código de Java se puede inyectar en una aplicación, como el uso de la API de scripting o el JSP dinámico.

El siguiente código permite a un usuario inyectar Javascript arbitrario en el motor de scripts de 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(); 
     } 
    } 
} 

En este caso, el atacante decide inyectar el código que crea un archivo en el sistema de archivos.

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

cheque owasp sitio web para más ejemplos

Cuestiones relacionadas