Inyección en Hibernate con SQL

RECU-0578 (Recurso Ejemplo)

Descripción

En ocasiones usar Hibernate para la ejecución de instrucciones dinámicas de SQL construidas a partir de las entradas controladas por el usuario puede permitir al atacante modificar el significado de la ejecución arbitraria de los comandos SQL.

Ejemplos

En el siguiente ejemplo, se utiliza la sintaxis HQL para construir una consulta dinámica de SQL que es vulnerable a la inyección.

String street = getStreetFromUser();
Query query = session.createQuery("from Address a where a.street='" + street + "'");

Para mitigarlo es recomendable el uso de una lista blanca de control sobre cualquier entrada de usuario que se puede utilizar en un comando SQL. Una manera segura de construir la consulta anterior sería:

String street =getStreetFromUser();
//validateWhiteList -> método que valida que el parámetro que se le pasa, encaja con la lista blanca.
if(validateWhiteList(street)){
Address address = (Address) session.find("from Address as a where a.street = ?", street, String);
}else{
//Lanza un error si street no encaja la lista blanca
}

En lugar de filtrar meta-caracteres, es más seguro no permitirlos en su totalidad. Esto es debido a que el uso posterior de los datos que han sido inscritos en la base de datos puede descuidar el filtrar los meta-caracteres antes de su uso.

Definir el conjunto de caracteres de seguridad basado en el valor esperado del parámetro en la petición.

Contenidos relacionados