Buscar en ELMED

jueves, 4 de octubre de 2012

Evitar Inyecciones SQL en java


Ya habiendo explicado lo importante que es evitar inyecciones SQL en este post, ahora veremos la forma más elegante de evitarlas desde el lenguaje de programación Java. Para ello haremos uso de los PreparedStatement  los cuales pertenecen al paquete java.sql y nos permiten construir una sentencia SQL precompilada, lo que nos hará ganar tiempo a la hora de ejecutar la sentencia y nos ayudara a evitar inyecciones SQL.
En este ejemplo veremos una  inyección SQL común la cual no se efectúa gracias a los PreparedStatement   y a si nos quitamos el engorroso trabajo de validar las cadenas que se envían a una consulta.


//Obtengo un estamento de una conexion hecha
 Statement estamento = conexion.createStatement();
//Creo una tabla de prueba
 estamento.execute("Create Table usuarios(id varchar(20),nombre                                      varchar(100),contrasena varchar(20));");
//Inserto datos de prueba
//Este es un insert de una sola line para mysql
 estamento.execute("Insert into  usuarios(id,nombre,contrasena)
           Values('1','LBVP','LBVP'),('3','juan','juan'),('4','ana','ana')");
//Creo la sentencia SQl precompilada
PreparedStatement pstmt = conexion.prepareStatement("SELECT * FROM usuarios WHERE nombre = ? AND contrasena=?");
//Relleno el parametro 1
pstmt.setString(1, "LBVP");
//Relleno el parametro 2
pstmt.setString(2, "' or 1=1--");
//Obtengo el resultado de la consulta
ResultSet rs = pstmt.executeQuery();
//Si encuentra algo imprime el primer campo de los registro
while (rs.next()) {
      System.out.println(rs.getString(1));
}

miércoles, 3 de octubre de 2012

Inyecciones SQL

Las inyecciones SQL es un tema muy poco conocido, para aquellos que comenzamos en el mundo de el desarrollo de software.
Segun Wikipedia "Inyección SQL es un método de infiltración de código intruso que se vale de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para realizar consultas a una base de datos."
En palabras mas comunes consiste en inserta código SQL malicioso, a traves de una consulta que reciba parámetros no validados correctamente.
Veamos un ejemplo del asunto:
Supongamos existe una ventana de login con dos cajas texto. La caja de texto txtusuario y la caja txtcontraseña.
Y que el botón aceptar exista una consulta SQL que se construye de la siguiente forma

 SELECT * FROM usuario WHERE nombre='"+txtusuario+"' AND pass='"+txtusuario+"';

En caso de que un usuario mal intencionado teclee en la caja de texto  txtusuario "anonimo" y en la caja de texto   txtcontraseña " ' OR '1'='1'--". La sentencia SQL quedaría a si:

 SELECT * FROM usuario WHERE nombre='anonimo' AND pass='' OR '1'='1'--;

Como los caracteres -- en la mayoría de los motores de base de datos significan comentario de fin de linea, esta sentencia traería todos los usuarios de esa tabla y permitirá que nuestro intruso burle la ventana de login posiblemente con los permisos del primer usuario registrado en la tabla.
Bueno este es uno de los usos mas sencillos de las inyecciones SQL, vale la pena mencionar que este ataque puede ser aun mucho mas peligroso por ejemplo si el atacante puede usar una sentencia DROP TABLE entre otras. 
También es importante decir que se pueden desarrollar sentencias especificas para explotar las vulnerabilidades de un motor de base de datos en especial.
Para finalizar y mostrarle lo importante que es cuidar nuestras aplicaciones de una inyección SQL, les voy a dejar un ejemplo de una pagina de carácter gubernamental en  mi país la cual es susceptible a este tipo de ataques y lo peor aun fue que lo reporte hace ya casi un mes y no han hecho nada para corregirlo.
http://www.fosyga.gov.co
Para evitar inyecciones SQL en java mira esta post SQL Inyeccion