Identificar las vulnerabilidades del algoritmo de hashing MD5 en el almacenamiento de contraseñas, demostrar la facilidad con la que los hashes pueden ser comprometidos mediante ataques de inyección SQL, e implementar salting para mejorar la seguridad criptográfica de las contraseñas, reduciendo su previsibilidad y resistencia frente a ataques de cracking.
Paso 1. Haz clic en el menú REGISTER
para registrarte como un nuevo usuario.
Paso 2. Rellena el formulario de registro y haz clic en el botón SUBMIT
.
Confirmación del cifrado de contraseñas:
Paso 3. Para comprobar la seguridad del hash de la contraseña, haz clic en el menú LOGIN
e inicia sesión con las siguientes credenciales:
Nombre de usuario: tester1
Contraseña: test
Paso 4. Intenta acceder a los detalles del cliente mediante una inyección SQL. Introduce la siguiente cadena de inyección SQL en el campo From Date
:
'union select USERNAME,FNAME+LNAME,PASSWORD, 1 from CUSTOMERLIST order by DESCRIPTION --
Paso 5. Haz clic en el botón Get Transactions
.
Además:
Prevención de vulnerabilidades en el almacenamiento criptográfico con MD5:
Para proteger los datos, implementa salting. Salting consiste en agregar un dato aleatorio a la contraseña antes de aplicar el hashing, lo que genera un resultado menos predecible y más difícil de descifrar.
Paso 6:
Para implementar salting, ve a la pestaña BackendReg.jsp
y crea la siguiente función getSecurePassword() en la línea n.º 118:
<%!private static String getSecurePassword(String passwordToHash, byte[] salt) {
String generatedPassword = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(salt);
byte[] bytes = md.digest(passwordToHash.getBytes());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
generatedPassword = sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return generatedPassword;
}
%>
<%!private static byte[] getSalt() throws NoSuchAlgorithmException, NoSuchProviderException {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
byte[] salt = new byte[16];
sr.nextBytes(salt);
return salt;
}
%>
Paso 7. Reemplaza la línea n.º 69 con el siguiente código:
ps1.setString(7, securePassword);
Paso 8. Reemplaza las líneas n.º 56 a 59 con el siguiente código:
String passwordToHash = upassword;
byte[] salt = getSalt();
String simplePassword = SimpleGeneratedPassword(upassword);
String securePassword = getSecurePassword(upassword, salt);
Paso 9. Haz clic en el botón Save
en la parte superior del editor para guardar los cambios.
Paso 10. Repite los pasos 1 y 2 para crear un nuevo usuario.
Paso 11. Repite los pasos 3 al 6. Realiza la inyección SQL introduciendo la siguiente cadena de inyección SQL en el campo From Date
:
'union select USERNAME,PASSWORD,SALTPASSWORD, 1 from CUSTOMERLIST order by DESCRIPTION --
Paso 12. Haz clic en el botón Reset
para restaurar el laboratorio al estado anterior y haz clic en OK
en el mensaje emergente que indica ¡Restablecimiento exitoso!
.