DESSEG

Mitigating Insecure Cryptographic Storage Vulnerability with Strong Hashing Technique

Objetivo de la práctica:

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.

Duración aproximada:

Instrucciones

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:

imagen resultado

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 --

imagen resultado

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;
}
%>

imagen resultado

Paso 7. Reemplaza la línea n.º 69 con el siguiente código:

ps1.setString(7, securePassword);

imagen resultado

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);

imagen resultado

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!.