2015-08-05 68 views
5

Nie rozumiem problemów składni sql, które otrzymuję podczas uruchamiania iniekcji, więc każda pomoc wyjaśniająca je jest bardzo doceniane. Mam docelowy skrypt logowania php, który pobiera komendę nazwa użytkownika/hasło, a następnie po prostu działa.SQL Inline Boilean Składnia

Select * FROM users WHERE username='$username' AND password='$password' 

Kiedy dostarczamy podstawowe

$username = ' OR '1=1 
$password = ' OR '1=1 

system loguje mnie jako admin, ponieważ ocenia się

Select * FROM users WHERE username='' OR '1=1' AND password='' OR '1=1' 

i dostaje coś pasującego do pierwszego wpisu użytkownika w bazie danych (Admin). Teraz próbuję pobrać skrypt, aby zalogować mnie jako dowolnego użytkownika o nazwie adrian. Moja myśl była dostarczyć

$username = adrian 
$password = ' OR (1=1 AND username='adrian') -- 

które myślałem, że ocenia się

Select * FROM users WHERE username='adrian' AND password='' OR (1=1 AND username='adrian') -- ' 

Myślałem, że logiczna kolejność operacji została lewej do prawej strony, gdy nie nawiasy są wliczone:

Select * FROM users WHERE [[[username='adrian'] AND password=''] OR (1=1 AND username='adrian')] -- ' 

ale to nie rejestruje mnie jako kogoś (i nie daje mi żadnych błędów). Nawet jeśli ORAZ są oceniane jako ostatnie, to oświadczenie będzie oceniać jako

Select * FROM users WHERE [username='adrian'] AND [password='' OR (1=1 AND username='adrian')] 

Co nadal będzie prawdziwe dla użytkownika adrian. Tymczasem

$username = adrian 
$password = 'or(1=1 and username='adrian') -- 

loguje mnie jak Adrian prawidłowo, co ocenia się

Select * FROM users WHERE username='adrian' AND password=''or(1=1 AND username='adrian') -- ' 

Więc dlaczego moje podejście z „LUB” nie działa, gdy moje podejście z „lub” nie działa?

SOLVED: Dziękuję za wskazówki. Rozumiem sql teraz lepiej, ale moim prawdziwym problemem było to, że autofill było usunięcie spacji po „-” Musiałem zawiedli po raz pierwszy, a potem głupio powoływać się na Autouzupełnianiu Odtąd poza

enter image description here

+2

Przepraszam, że ... został on ponownie otwarty. – Orangepill

+0

Pierwszeństwo operatora to: '=', następnie 'AND', następnie' OR'. – Gumbo

+0

Oto jedna z porad: Jeśli twoja platforma (w tym przypadku [PHP] (https://secure.php.net/manual/en/pdo.prepared-statements.php)) obsługuje przygotowane instrukcje i powiązanie parametrów, możesz powinien ich użyć. Zasadniczo rozwiązuje to wszystkie problemy uciekające dla ciebie. – Powerlord

Odpowiedz

3

Kolejność operacji nie jest tylko od lewej do prawej. W rzeczywistości od lewej do prawej (lub pierwszeństwo pozycji) jest ostatnią rzeczą braną pod uwagę przy ocenie takiego wyrażenia. Musisz także zrozumieć operator , ponieważ jest to najważniejszy aspekt przy określaniu zachowania takiego oświadczenia. W tym przypadku AND ma wyższy priorytet niż OR.

Oznacza to, że Twój rachunek będzie zachowywać się w sposób następujący:

Select * FROM users WHERE (username='adrian' AND password='') OR (1=1 AND username='adrian') 

Więc, co można uzyskać wiersz zwrócony tak długo jak nie był użytkownik o nazwie adrian.

Zapoznaj się z dokumentacją MySQL na precendence operatora - https://dev.mysql.com/doc/refman/5.6/en/operator-precedence.html