L'iniezione di Sql non funziona sul mio sito?

1

Ho impostato una pagina e un database in modo da poter praticare l'iniezione SQL. Ho provato alcuni esempi e non sembra funzionare. Sembra aggiungere il nome utente e la password a quel database, anche se inserisco un'iniezione nel campo del nome utente. Ecco il mio codice:

include "Connection.php";

<form method="post" action="sqltest.php">
<fieldset>
    <label for="username">Username: </label>
    <input type="text" name="username"/>
    <label for="passwd">Password: </label>
    <input type="password" name="passwd"/>
</br>
    <input type="submit" value="Submit" />
    <input type="reset" value="Clear" />
</fieldset>
</form>
            </div>

        </div>



$username = $_POST["username"];
$password = $_POST["passwd"];

if (!empty($_POST)){
if (empty($username) || !isset($username)) {
echo "Please enter a valid username";
   } else if (empty($password) || !isset($password)) {
echo "Please enter a valid password";
} else {
if (strlen($password) >= 6 && strlen($password) <= 8)
    {
        if (is_numeric($password))
        {
            echo "Password cannot be a number<br/>";
        }
        else{
                $encrypted_mypassword=md5($password);
                $query =  "INSERT INTO sqltest (name,password) VALUES ('$username', '$password')";
                $result = mysqli_query($connection,$query);

                echo "You have successfully registered";
        }
    }
    else {
        echo "Password must be between 6 and 8 characters in length<br/>";
    }

 }
}

Qualcuno può dirmi degli esempi che potrebbero far cadere la tabella o inserire un utente? Mi sono appena reso conto che i suoi personaggi in fuga automaticamente. Sicuramente questo non impedisce tutta l'iniezione SQL. C'è qualcosa che posso iniettare per superare questo? Grazie!

    
posta user3511462 18.04.2014 - 16:53
fonte

2 risposte

3

In questo particolare esempio c'è ben poco che potresti fare, anche se non avessi magic_quotes .

Questo perché un'iniezione SQL normalmente può solo aggiungere alla stringa di query. Poiché la stringa è un comando INSERT , puoi solo INSERT qualcosa.

In teoria, se il server SQL dietro supporta "comandi concatenati", potresti trasformare un comando in due:

INSERT INTO ... VALUES ('...','...'); DROP TABLE Students; -- ');
                               |<--- injected code --------->|

Ma per fare questo, il codice originale deve utilizzare mysqli_multi_query , non mysqli_query .

Una cosa che puoi fare è modificare lo script in mostra la query invece di eseguirlo. In questo modo puoi controllare più facilmente cosa sta succedendo.

E una cosa che potresti provare con mysqli (che è il motivo per cui si dovrebbero usare istruzioni preparate e parametri vincolati) è giocare con la codifica. Le virgolette viranti definiscono virgolette singole, ma possono essere contrastate da sequenze UTF8 errate (e talvolta corrette ) o doppie fughe.

Inoltre, le virgolette non sono perfette.

Ad esempio, se hai provato con

username:      hello\
password:      ,XXX); --

e la query è diventata

INSERT INTO sqltest (name,password) VALUES ('hello\', ',XXX);--')

che proverebbe davvero ad inserire

username:      "hello', "
password:      XXX

Ora XXX non può contenere virgolette né; . Ma potrebbe contenere una funzione, come SLEEP() , che consente comunque una certa misura di "attacco" contro un sito (blocca una connessione SQL).

In alcune circostanze puoi costruire una stringa usando CONCAT e CHR : invece di 'foo' (contiene virgolette), puoi usare CONCAT(CHAR(102),CHAR(111),CHAR(111)) che non lo è.

È anche possibile (ma devi essere in grado di eseguire dichiarazioni arbitrarie , come PREPARE e EXECUTE , non solo dirottare un INSERT ) per costruire una query quotata e eseguilo senza usare virgolette:

PREPARE bobby FROM CONCAT(CHAR(68),CHAR(82),CHAR(79),CHAR(80),CHAR(32)...)
EXECUTE bobby; -- D,R,O,P, ,T,A,B,L,E, ,S,t,u,d,e,n,t,s,...
    
risposta data 18.04.2014 - 18:53
fonte
1

L'iniezione SQL non funziona sul tuo server potrebbe essere dovuta a citazioni magiche , che sfuggire determinati caratteri nei dati in arrivo con le sequenze di escape backslash:

[…] all ' (single-quote), " (double quote), \ (backslash) and NULL characters are escaped with a backslash automatically. This is identical to what addslashes() does.

Questi sono esattamente i caratteri che ti servono per uscire dalla stringa letterale MySQL.

Sebbene questa mitigazione possa funzionare nel tuo esempio, non si deve fare affidamento su di essa come virgolette magiche potrebbe essere disabilitato o addirittura non più disponibile:

Warning This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.

Utilizza invece le tecniche conosciute per prevenire le iniezioni SQL in PHP .

    
risposta data 18.04.2014 - 17:54
fonte

Leggi altre domande sui tag