Iniezione SQL per accedere quando non ci sono record nel database

4

Ho una domanda da risolvere. Bene, non ci sono record di username e password nel database e quindi non è possibile accedere senza inserire alcun record. C'è comunque da sfruttare il seguente codice e inserire i record in modo che possiamo accedere.

<?php   
        $con = mysqli_connect("localhost", "root", "pass", "database");
        $username = $_POST["username"];
        $password = $_POST["password"];
        $logged_in = false;
        $query = "SELECT * FROM users WHERE username='$username'";
        $result=mysqli_query($con, $query);
          if(mysqli_num_rows($result) === 1) {
                $row = mysqli_fetch_array($result);
                if($row["password"] === $password){ 
                       $logged_in = true;
                }

        if(!$logged_in)
                echo("Failed to login");
?>

Ho provato quanto segue  username = 'OR 1 = 1 LIMIT 1; INSERISCI NEGLI UTENTI (nome utente, password) VALORI ('utente', 'pass') -  username = 'OR 1 = 1 LIMIT 1 -

Dimmi anche se esiste un altro modo per sfruttare il codice.

    
posta Sushant 21.07.2016 - 10:17
fonte

2 risposte

8

Questo sembra essere un caso di UNION SELECT piuttosto che inserire i propri record. Quello che devi fare è capire quante colonne vengono selezionate (per tentativi ed errori .. SELEZIONA 1,2,3 ... n fino a quando non smetti di ricevere un errore).

Successivamente, si inserisce la query in modo che la prima parte restituisca false (nessun nome utente trovato). La parte difficile: Immetti ' OR 1 = 0; UNION SELECT 'banana' AS username, '123456' AS password FROM users LIMIT 1;# nel campo del nome utente e nel campo della password immetti 123456 .

In pratica si forza la query SQL a restituire qualsiasi password che si desidera e quindi a ignorare le loro condizioni:)

    
risposta data 21.07.2016 - 10:37
fonte
-1

Stai consentendo l'immissione diretta dell'utente nella query, quindi è iniettabile per definizione.

Usa istruzioni parametriche preparate (da non confondere con le stored procedure) e filtra i tuoi input.

Ecco un cheat sheet per la gestione sicura delle query

Ti aggiornerà sulla mitigazione dell'iniezione SQL.

link

Anche le procedure memorizzate aiutano in modi importanti. È possibile digitare e dimensionare strongmente i parametri di input e di solito sono sicuri perché sono parametrizzati internamente. Tuttavia con grande flessibilità arriva il pericolo. Se crei dinamicamente delle query al loro interno, puoi metterti nei guai. Puoi anche limitare i privilegi di un utente DB di un'applicazione, in un'app per tutte le stored procedure, per eseguire solo, non selezionare, aggiornare, eliminare e / o concedere (!).

Spero che questo sia stato di aiuto!

    
risposta data 22.07.2016 - 06:04
fonte

Leggi altre domande sui tag