Aggiunta di condizioni dopo LIMIT in MySQL

0

C'è un modo per aggiungere qualsiasi condizione dopo LIMIT, ad esempio OR o AND ?

Mi chiedo se possiamo aggiungere qualsiasi query dopo LIMIT che non restituisce nulla.

per esempio la query è:

SELECT * FROM table WHERE email = '$email' AND pwd = MD5('$pwd');

e dopo l'iniezione sql la query sarebbe:

SELECT * FROM table WHERE email = '$email' AND pwd = MD5('') or 1 limit 1;
    
posta Innocent 30.06.2016 - 14:18
fonte

1 risposta

1

Questa domanda ha avuto risposta nella sezione commenti, ma questa è una risposta esplicativa per chiunque voglia guardare. Quindi, guardando lo snippet di codice potremmo effettivamente vedere

$login = "SELECT fName,lName FROM great WHERE email= '$email' AND pwd = MD5('$pwd')";

Come puoi vedere alla fine di pwd = MD5('$pwd') , il codice accetta effettivamente una password immessa dall'utente e la converte in MD5 e la confronta nel database. Ora, il piano prevede di interrompere il pwd nella query MYSQL. Per questo, è possibile fornire ') in modo che assomigli a pwd = MD5('')') in questo caso l'ultimo ') non ha alcun utilizzo e fornirebbe Errore di sintassi SQL poiché la Query non identificherà due ')') Quindi il nostro il prossimo Piano è di commentare l'ultimo ') dalla Query, per questo ho usato il Tip Two Hyphens -- - . Ora il Magic qui è se fornisci solo -- rispetto alla Query alla fine non verrà commentato perché risulterebbe in --') Fornendoti un Errore di Sintassi! Quindi, per questo motivo, ho fornito lo spazio Intentional dopo -- e aggiunto un altro trattino per la dimostrazione. Poiché in molti casi di Blackbox SQL Injection non è possibile prevedere ed Exact Syntax error è l'unica speranza, quindi in questo commento di -- - l'ultimo trattino non ha alcun significato ma lo SPAZIO tra di essi contiene il chiave per commentare ') out dal retro.

Ora, la query funzionerebbe come al solito e, a causa della mancanza di sanitizzazione dell'ingresso, possiamo sempre VERO la query di or '1'='1' . Ma, questo da solo non risolverà il problema poiché or '1'='1' selezionerebbe Ogni RIGA dal database e il frammento di codice indicato qui sotto fa un controllo aggiuntivo qui

            if($exe){
            $num = mysqli_num_rows($exe);
            if($num == 1){
                  //You are in
                }

Aha, Now mysqli_num_rows > 1 Che non ti permetterebbe di andare alla parte if e non verrebbe ignorata. Quindi nel Payload iniziale, questo è l'unico motivo per cui stiamo aggiungendo LIMIT 1 per evitare le nostre righe > 1. Il LIMIT 1 seleziona la prima riga del loro database back-end e VOILA che hai visitato.

Quindi, unendo tutti questi piccoli pezzi, potremmo costruire il nostro payload finale come ') or '1'='1' LIMIT 1-- - quindi la query finale sarebbe

 $login = "SELECT fName,lName FROM great WHERE email= '$email' AND pwd = MD5('') or '1'='1' LIMIT 1-- -')";

Questo è tutto! :)

    
risposta data 01.07.2016 - 05:11
fonte

Leggi altre domande sui tag