2009-10-02 18 views
5

Chciałbym najpierw zauważyć, że jest to próba edukacji w mojej bazie danych, aby lepiej zrozumieć zastrzyki MySQL w celu ochrony mojego własnego kodu.Jak zademonstrować SQL Injection w tym kodzie PHP i MySQL?

Muszę opracować kilka przykładów tego, jak można skonstruować wtrysk MySQL w oparciu o poniższy kod. Jest to podstawowy system logowania użytkownika, gdzie jestem przyjmując nazwę użytkownika i hasło bez ucieczki

$user = (!empty($_POST['user'])) ? $_POST['user'] : ''; 
$pass = (!empty($_POST['pass'])) ? $_POST['pass'] : ''; 

Kwerenda MySQL następnie próbuje znaleźć wprowadzoną nazwę użytkownika i hasło w moim tabeli o nazwie użytkowników, co następuje:

$res = mysql_query("SELECT * from users where user='{$user}' AND pass='{$pass}'"); 

to wejście un-uciekł, a ja staram się wymyślić zastrzyki MySQL:

  1. obwodnicy hasło znając login uzasadniony użytkownika (jeden użytkownik w moim tabeli użytkowników jest tester), a
  2. Wstrzyknięcie, które spadnie całkowicie w tabeli users.

Próbowałem kilka przykładów wtryskowych MySQL od Wikipedia, ale zgaduję się {} w moim zapytaniu jest zapobieganie zastrzyk, więc będę wdzięczny za pomoc ze strony tych, którzy są przekonani o tym, i dziękuję dla wszystkich.

+1

proszę wymienić te, które już próbował – Natrium

Odpowiedz

5

Coś jak to powinno zrobić:

  1. Aby zalogować się jako użytkownik "foo", należy ustawić nazwę użytkownika na "foo” -"

To sprawi, że wygląd zapytania jak

$res = mysql_query("SELECT * from users where user='foo' -- ' AND pass=''"); 

Znak "-" oznacza, że ​​reszta linii zakomentowany

  1. Nie wiem, czy to będzie działać, ale spróbuj ustawić nazwę użytkownika na „foo” lub (użytkownicy DROP tabela) -”

To sprawi, że wygląd zapytania jak:

$res = mysql_query("SELECT * from users where user='foo' OR (DROP TABLE users) -- ' AND pass=''"); 

nie może zaakceptować to jednak - myślę, że podzapytania mogą tylko WYBRAĆ.

Funkcja mysql_query będzie działać tylko jedno zapytanie - inni niech to zrobić:

$res = mysql_query("SELECT * from users where user='foo'; DROP TABLE users -- ' AND pass=''"); 
+0

wielu zapytań z użyciem mysql_query jest obsługiwana jak stwierdzono w dokumencie: mysql_query() wysyła unikalny zapytanie (wielokrotne zapytania nie są obsługiwane) do aktywnej bazy na serwerze, który jest powiązany z określonym identyfikatorem_połączenia. –

0

{} nie są powodem. Być może php to Magic Quotes (teraz przestarzałe) chroni cię przed raczej upraszczającymi atakami.

Można jednak switch them off, a następnie wykonać test ponownie.

3

Nie będą mogli DROP tabelę ponieważ używając mysql_query nie można wysłać wiele zapytań.

0

Spróbuj jeden i zobaczyć, czy to zrzuca całą tabelę:

For both username and password, I enter: 

' OR 1=1 AND '}' '= 

To oczywiście zakłada, że ​​wiem, że używasz nawias klamrowy zawinąć wartości danych.

Naprawdę nie jestem pewien, jak MySQL obsługuje mieszaną logikę w ten sposób, ponieważ nie jest ona zawarta w nawiasach, więc daj mi znać, czy to działa!

1
$user = (!empty($_POST['user'])) ? $_POST['user'] : ''; 
$pass = (!empty($_POST['pass'])) ? $_POST['pass'] : ''; 

$user = mysql_real_escape_string($user); 
$pass = msyql_real_escape_string($pass); 

$res = mysql_query("SELECT * from users where user='{$user}' AND pass='{$pass}'"); 

To będzie chronić kod dla ciebie. Wszyscy nie będą mogli DROP tabeli.