Semplice iniezione SQL per evitare l'accesso in MariaDB

2

Sto provando SQL Injection sul mio localhost. Ho un semplice modulo HTML, con un nome utente, una password e un pulsante di invio. Quindi, dopo aver fatto clic sull'invio, l'utente viene reindirizzato da login.html a una pagina chiamata login.php :

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

Di seguito è riportato un frammento del mio codice 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 ";
}

Sono in grado di accedere a se inserisco l'utente e la password corretti. Sto cercando di eseguire SQL Injection, ma non ci riesco. Ho provato a utilizzare ' or ''=' ma non riesco ancora ad accedere. Sto provando questo in Kali, che viene preinstallato con MariaDB.

    
posta oceans25 13.04.2018 - 03:54
fonte

4 risposte

5

In MariaDB i commenti devono essere seguiti da uno spazio :

From a '-- ' to the end of a line. The space after the two dashes is required (as in MySQL).

Prova ' OR 1=1 --[space] .

    
risposta data 13.04.2018 - 13:30
fonte
3

La prima cosa da notare qui è che puoi inserire solo il nome utente e non la password. Qualsiasi carico utile che metti nella passwrod verrà distrutto nell'hashing.

Quindi cosa succede se si imposta lo username su ' OR '' = ' ? Scriviamolo:

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

A causa del fatto che AND ha precedenza più alta di OR in SQL, viene interpretato come questo:

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

Come puoi vedere, entrambi i lati sinistro e destro di OR saranno sempre falsi a meno che non ci sia un utente senza nome o tu fornisca una password esistente.

Invece, prova a fare un'iniezione così finisci con una query simile a una di queste, a seconda se vuoi specificare un nome utente o meno:

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

Quindi qual è la lezione qui? Scrivi sempre la query che ritieni che la tua iniezione comporterà. Analizza e assicurati che l'SQL esegua effettivamente ciò che vuoi che faccia.

    
risposta data 13.04.2018 - 12:14
fonte
1

Sembra che il tuo nome utente sia protetto da password vulnerabile.

Prova 'or 1=1-- , quindi commenta la query dopo il nome utente.

    
risposta data 13.04.2018 - 04:34
fonte
0

Quando si inserisce il carattere di quota singola in un attacco di iniezione SQL, si sta eseguendo l'escape del codice della pagina per continuare l'elaborazione. Se inizialmente immessi ' or ''=' , non hai inserito SQL valido per consentire al database di restituire un risultato valido. La prima citazione esce dalla variabile "username", che equivale a:

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

Se invece usi ' or 1=1 -- , l'espressione risultante è: $result = mysqli_query($connect,"SELECT * FROM students WHERE uname=' 'o 1 = 1 - ' and password = '". $password."'");

In SQL, tutto ciò che segue il doppio trattino è un commento ed è ignorato, quindi potremmo tecnicamente omettere ogni cosa dopo di loro. Ma l'espressione significativa finisce con select * from students where uname='' or 1=1 . 1 = 1 ovviamente è "vero", quindi select * from students where uname is set .

L'unica ragione per cui non vedi tutti i record è perché questa applicazione vulnerabile stampa la prima riga dei risultati. Per raccogliere più di un record, è necessario iniziare a modificare la query iniettata in ' or a* -- , ' or a% -- o simili, a seconda del server SQL che si sta testando.

    
risposta data 18.04.2018 - 00:38
fonte

Leggi altre domande sui tag