Inyección de SQL simple para omitir el inicio de sesión en MariaDB

2

Estoy probando SQL Injection en mi host local. Tengo un formulario HTML simple, con un nombre de usuario, contraseña y un botón de envío. Entonces, después de hacer clic en el envío, el usuario se redirige de login.html a una página llamada login.php :

<form method="post" action="login.php"> 

A continuación hay un fragmento de mi código PHP:

$connect = mysqli_connect($dbhost, $dbuser, $dbpass) or die("Unable to connect to '$dbhost'");
mysqli_select_db($connect,$dbname) or die("Could not open the database '$dbname'");

$message="";
$username = $_POST["uname"];
$pass_raw = $_POST["password"];
$password = md5($pass_raw);

$result = mysqli_query($connect,"SELECT *  FROM students WHERE uname='" . $username . "' and password = '". $password."'");
$row = mysqli_fetch_array($result);

if(is_array($row)) {
    echo "Congratulations! you have logged in!";
    printf("Your First Name %s and Last Name is %s", $row[3], $row[4]);
    printf("Your SSN is %s ", $row[5]); 
} else {
    $message = "Invalid Username or Password!";
    echo "invalid user ";
}

Puedo iniciar sesión en el si ingreso el usuario y la contraseña correctos. Estoy intentando realizar una inyección SQL, pero no puedo. He intentado usar ' or ''=' pero todavía no puedo iniciar sesión. Estoy probando esto en Kali, que viene preinstalado con MariaDB.

    
pregunta oceans25 13.04.2018 - 03:54
fuente

4 respuestas

5

En MariaDB, los comentarios deben ser seguido de un espacio :

  

Desde un '-' hasta el final de una línea. Se requiere el espacio después de los dos guiones (como en MySQL).

Por favor, intente ' OR 1=1 --[space] .

    
respondido por el bradbury9 13.04.2018 - 13:30
fuente
3

Lo primero que debes tener en cuenta es que solo puedes ingresar el nombre de usuario y no la contraseña. Cualquier carga útil que coloque en la varilla de paso se destruirá en el hashing.

Entonces, ¿qué pasa si configuro el nombre de usuario en ' OR '' = ' ? Vamos a escribirlo:

SELECT * FROM students WHERE uname='' OR '' = '' AND password = '$password'

Debido a que AND tiene precedence más alto que OR en SQL, se interpreta de la siguiente manera:

SELECT * FROM students WHERE uname='' OR ('' = '' AND password = '$password')

Como puede ver, tanto el lado izquierdo como el derecho de OR siempre serán falsos a menos que haya un usuario sin nombre o que proporcione una contraseña existente.

En su lugar, intente hacer una inyección para terminar con una consulta similar a una de estas, dependiendo de si desea especificar un nombre de usuario o no:

SELECT * FROM students WHERE uname='' OR uname='admin' -- ' AND password = '$password'
SELECT * FROM students WHERE uname='' OR 1=1 -- ' AND password = '$password'

Entonces, ¿cuál es la lección aquí? Siempre escribe la consulta en la que crees que resultará la inyección. Analízala y asegúrate de que el SQL haga realmente lo que quieres que haga.

    
respondido por el Anders 13.04.2018 - 12:14
fuente
1

Parece que tu nombre de usuario es vulnerable. La contraseña es segura.

Pruebe 'or 1=1-- , por lo que comenta la consulta después del nombre de usuario.

    
respondido por el Rama 13.04.2018 - 04:34
fuente
0

Cuando ingresa el carácter de comilla simple en un ataque de inyección de SQL, está escapando el código de la página para continuar con el procesamiento. Si ingresó inicialmente ' or ''=' , no ha insertado un SQL válido para permitir que su base de datos devuelva un resultado válido. La primera cita sale de la variable "nombre de usuario", que equivale a:

$result = mysqli_query($connect,"SELECT * FROM students WHERE uname=' 'o' '=' ' and password = '". $password."'");

Si, en cambio, utiliza ' or 1=1 -- , la expresión resultante es: $result = mysqli_query($connect,"SELECT * FROM students WHERE uname=' 'o 1 = 1 - ' and password = '". $password."'");

En SQL, todo después del doble guión es un comentario y se ignora, por lo que técnicamente podríamos omitir todo después de ellos. Pero la expresión significativa termina select * from students where uname='' or 1=1 . 1 = 1, por supuesto, se evalúa como "verdadero", por lo que entonces select * from students where uname is set .

La única razón por la que no ve todos los registros es porque esta aplicación vulnerable imprime la primera fila de sus resultados. Para recopilar más de un registro, deberá comenzar a modificar su consulta inyectada a ' or a* -- , ' or a% -- o similar, dependiendo del servidor SQL que esté probando.

    
respondido por el jth 18.04.2018 - 00:38
fuente

Lea otras preguntas en las etiquetas