Al enviar parámetros especialmente diseñados a uno o más scripts CGI alojados en el host evaluado, fue posible obtener una respuesta muy diferente, lo que sugiere que pudo haber modificado el comportamiento de la aplicación y acceder directamente a la base de datos subyacente.
Un atacante puede aprovechar esta vulnerabilidad para evadir la autenticación, leer datos confidenciales, modificar la base de datos remota o incluso tomar el control del sistema operativo remoto.
CVE: NA
Factor de Riesgo: Alto
Valor CVSS Base: 7,5
Vector de ataque (AV): La red
Complejidad del ataque (AC): Bajo
Privilegios Requeridos (PR): Ninguna
Interacción del usuario (IU): Ninguna
Alcance (S): Sin alterar
Confidencialidad (C): Alto
Integridad (I): Alto
Disponibilidad (A): Alto
Solución:
Modifique los scripts CGI afectados para que escapen correctamente de los argumentos.
La solución más simple es usar PreparedStatement en lugar de Statement para ejecutar la consulta.
En lugar de concatenar el nombre de usuario y la contraseña en la consulta, los proporcionamos para consultar a través de los métodos de establecimiento de PreparedStatement.
Ahora, el valor del nombre de usuario y la contraseña recibidos de la solicitud se tratan solo como datos, por lo que no se producirá una inyección SQL.
Veamos el código del servlet modificado.
String query = "select * from tbluser where username=? and password = ?";
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user", "root", "root");
stmt = conn.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
// Login Successful if match is found
success = true;
}
rs.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
stmt.close();
conn.close();
} catch (Exception e) {
}
}
Referencias:
