¿Se podría "piratear" este formulario de inicio de sesión para permitir el acceso?

5

Tenemos este sitio web legado que tiene un código horrible en él. Acabo de revisar el código / formulario de inicio de sesión y puedo ver consultas de SQL sin desinfectar. P.ej. en pocas palabras:

$email=$_POST['email'];
$password = $_POST['password'];

$query = "SELECT aes_decrypt(password, 'asdasdasd') AS password FROM users WHERE email='$email'";
$result = mysql_query($query);
$row = mysql_fetch_array($result);

if($password == $row['password']){
    // set cookies and redirect user etc etc
}
else {
    // error not correct login details
}

Mi pregunta es, me doy cuenta de que esto es malo debido a la inyección de SQL. Y sé lo básico de eso. es decir, podría poner '; DROP ALL TABLES; -- y eso "causaría estragos".

¿Se puede hacer algo más "interesante" o "útil" (para el posible pirata informático)? Es decir, ¿puede generar una lista de contraseñas o descargar las tablas con esto? ¿O podría administrar iniciar sesión como usuario del sitio, por ejemplo, si solo conoce su dirección de correo electrónico?

Principalmente para el interés, pero también para una mejor comprensión (y por lo tanto, encontrar mejores enfoques para la codificación).

    
pregunta Thomas Clayson 18.06.2012 - 14:43
fuente

2 respuestas

5

Bueno, con esto, puedes iniciar sesión fácilmente con solo el correo electrónico, aquí tienes por qué:

La consulta predeterminada es:

SELECT aes_decrypt(password, 'asdasdasd') AS password FROM users WHERE email='$email';

Que significa, si:

$email = "[email protected]";
SELECT aes_decrypt(password, 'asdasdasd') AS password FROM users WHERE email='[email protected]';

Ahora, si hago esto en su lugar:

$email = "dontcare' UNION SELECT "mypass" AS password FROM users WHERE email='[email protected]' LIMIT 1, 1";
$pass = "mypass";
SELECT aes_decrypt(password, 'asdasdasd') AS password FROM users WHERE email='dontcare' UNION SELECT "mypass" AS password FROM users WHERE email='[email protected]' LIMIT 1, 1

Su código recibirá la segunda consulta, obtenga el password que coincidirá con "mypass", devuelva verdadero, así que me autenticará para la cuenta [email protected] .

Ahora, con "solo" el código que nos mostró, un atacante no puede mostrar una tabla completa, pero como el autor del código no se aseguró de asegurar la entrada del usuario, diría que si no lo está en ese fragmento de código, existe una alta probabilidad de que aún sea posible en otro lugar.

    
respondido por el Cyril N. 18.06.2012 - 14:54
fuente
4

La respuesta de cx42net es incorrecta. La función mysql_query () solo procesa una sola declaración MySQL, por lo que para llevar a cabo una inyección de SQL, debería usar un UNION.

El verdadero WTF aquí es que si la consulta no devuelve filas y la contraseña está en blanco, el usuario se autentica como el usuario que presentó.

    
respondido por el symcbean 18.06.2012 - 16:32
fuente

Lea otras preguntas en las etiquetas