czwartek, 18 marca 2010

Atak Sql injection dla zielonych ! Obrona przed atakiem sql injection ! Jak włamać się na stronę internetową ....? Błąd, luka sql injection !

Rozbudowany artykuł o ataku SQL Injection - dla zielonych ....

 flickr,  john_a_ward
Już co prawda był temat poświęcony błędowi sql injection - występującemu na stronach internetowych, ale pokazywał on głównie wykorzystanie tej luki w konkretnym systemie cms. Chciałbym teraz nieco rozszerzyć ten artykuł i pokazać w jaki sposób znajdować słabe zabezpieczenie (luki) na swojej własnej stronie internetowej. Należy pamiętać o przestrzeganiu prawa ! Nie można łamać cudzych stron internetowych - jest to karalne - natomiast można sprawdzić zabezpieczenia na własnej stronie internetowej. Artykuł służy wyłącznie celom edukacyjnym !

Przykład ataku SQL INJECTION : 

Po pierwsze znajdujemy jakąś stronę i sprawdzamy czy jest podatna na atak. Strona powinna mieć w adresie takie coś jak "id", po którym następuje numer np. artykułu. Wygląda to mniej więcej w ten sposób :
www.pececik.blogspot.com/index.php?id=1 
Aby sprawdzić czy strona jest podatna na atak wystarczy wprowadzić apostrof na końcu, a więc :
www.pececik.blogspot.com/index.php?id=1'
Jeżeli wyskoczy błąd to znaczy, że strona może być podatna na atak sql injection.
Błąd może wyglądać w ten sposób : "Warning: mysql_fetch_row(): supplied argument is not a valid MySQ"

Kolejną rzeczą jest sprawdzenie liczby kolumn, robimy to za pomocą polecenia union select, a więc :
www.pececik.blogspot.com/index.php?id=-1 union select 1--
Jeżeli nic się nie dzieje to zwiększamy 1 na końcu, dodając kolejne cyfry po przecinku a więc:
www.pececik.blogspot.com/index.php?id=-1 union select 1,2--       błąd
www.pececik.blogspot.com/index.php?id=-1 union select 1,2,3--        błąd
www.pececik.blogspot.com/index.php?id=-1 union select 1,2,3,4--     bez błędu 

Oznacza to, że liczba kolumn wynosi 3 - ponieważ przy czwartej pojawia się błąd.
Powinna pojawić się teraz jakaś mała cyferka, np. w nazwie artykułu albo gdzieś na stronie - będzie to albo 1 albo 2 albo 3 - ponieważ tyle kolumn liczy nasza baza danych w tym przypadku. 
Jest ona o tyle istotna, ponieważ właśnie do tej cyferki spróbujemy się dostać :)


Przypuszczalnie pojawiła się nam mała 2 - teraz musimy wpisać zapytanie właśnie w to pole ! Nim się do tego zabierzemy warto sprawdzić z jakiej tabeli wyciągnąć konkretne informacje. Przykładowo będziemy chcieli uzyskać nasz login i hasło do strony. 
Najczęściej informacje te są zapisane w bazie danych pod nazwami : 
users, user, member, members, osoby, uzytkownicy - dla listy uzytkownikow
pass, password, login, nick, nicks, passwd, name, username - dla konkretnego uzytkownika 


Przykładowo sprawdźmy czy istnieje tabela o nazwie members :
www.pececik.blogspot.com/index.php?id=-1 union select 1,2,3 from members--

Jeżeli taka tabela istnieje to powinna pojawić się nam ponownie gdzieś na stronie taka mała cyferka :)
Dobrze, a więc pojawiła się nam mała dwójeczka - teraz dzięki tej 2 spróbujemy wyciągnąć konkretne informacje np. nazwę użytkownika i hasło. 


www.pececik.blogspot.com/index.php?id=-1 union select 1,concat(nick,char(58),pass),3 from members--

Teraz objaśnię o co chodzi :D W miejsce 2 - wstawiłem nasze zapytanie : concat(nick,char(58),pass)

Concat - oznacza łączenie, dzięki temu będziemy mogli wyciągnąć dwie informacje w jednym zapytaniu.
W nawiasie dałem co chcę wyciągnąć w tym przypadku : nick oraz pass (nazwę użytkownika i hasło) - oczywiście te nazwy zależą od bazy danych na stronie może to być np. login i haslo (tak mogą być podpisane). Pomiędzy nick a pass znajduje się coś takiego jak char(58) - jest to nic innego jak zamiana liczby 58 na znak w kodzie ASCII - dzięki temu uzyskamy znak dwukropka. Jest to zabieg czysto estetyczny - aby pomiędzy nazwą użytkownika a hasłem znajdował się jakiś odstęp, separator, który oddzieli te dwie wartości.

Po zastosowaniu kodu powyżej powinniśmy uzyskać coś ala :



przemo:pececik
tomek:123456
dom:ala


Albo w postaci zakodowanej md5 np :


przemo:93e834de5ae9c81bc0e429317ad399c1

Jeżeli mamy taką postać, to musimy znaleźć w internecie sposób na rozkodowanie md5 - są pewne strony, które umieszczają popularne kody md5 i na ich podstawie możemy znaleźć co kryje się pod takim kodem.

Rozszerzenie !!!

Teraz wersja dla nieco bardziej zaradnych :P Pamiętacie jak u góry pisałem o nazwach typu : members, uzytkownicy, login, pass, nick, user, itp.. - to nazwy, które najczęściej są spotykane. A co gdybym nazwał sobie listę z użytkownikami jako : pececik_lista_osob - wątpie czy ktoś wpadły na pomysł aby wstrzelić się właśnie z takim zapytaniem.

Chciałbym teraz przedstawić sposób na znalezienie, sprawdzenie jaka nazwa jest zapisana w naszej bazie danych.


Wystarczy posłużyć się zapytaniem Information Schema, w tym celu w oknie przeglądarki wpisujemy zapytanie :


www.pececik.blogspot.com/index.php?id=-1 union select 1,table_name,3 from information_schema.tables limit 1 offset 1--

Zmieniając ostatnią jedynkę na liczbę o jeden wyższą itd.. dostajemy nazwy kolejnych tabel. Warto poszukać tych, które będą wskazywały o zawartości np. listy osób np. members, users itp...
Dzięki temu zapytaniu pojawi się nam lista nazw tabel w bazie danych np: members, users, articles albo właśnie pececik_lista_osob, dzięki temu będziemy wiedzieć do jakiej tabeli się odnieść. 


Teraz sprawdzimy jaką nazwę przyjmuje kolumna - w przypadku gdy nazwa tabeli to members. 
Po pierwsze warto wejść na stronę www.asciitable.com i odpowiednio zakodować słowo members - będzie to odpowiednio (109,101,109,98,101,114,115) a nassz kod będzie się prezentował :


www.pececik.blogspot.com/index.php?id=-1 union select 1,column_name,3 from information_schema.columns where table_name=char(109,101,109,98,101,114,115) limit 1 offset 1--


Teraz pojawi się lista nazw kolumn, gdyby to była tylko jedna kolumna to zmieńmy ponownie wartość 1 na końcu na np. 2 a później 3 itd....

Teraz przykładowo jako nazwę kolumny dostaliśmy : nick - tzn. taką znaleźliśmy i nas zaciekawiła. Wtedy aby przejrzeć jej zawartość - czyli najprawdopodobniej loginy robimy zapytanie :

www.pececik.blogspot.com/index.php?id=-1 union select 1,nick,3 from members--

Oczywiście w ten sposób wyciągniemy z tabeli members kolumnę nick - czyli wyświetli się nam lista osób - ich nicków. 


Ciekawy artykuł na ten temat na stronie : http://hackme.pl/articles.html?article_id=387

 Skuteczna obrona przed tego typu atakami została opisana w osobnym artykule : http://pececik.blogspot.com/2010/06/ochrona-przed-sql-injection-obrona.html

10 komentarze:

Anonimowy pisze...

potrzebuje twojej pomocy napisz do mnie na gg 5514715

Przemo pisze...

Bardzo chętnie pomogę ale może napisz tutaj - gdybym nie był w stanie to ktoś inny z przeglądających stronę odpowie.

Anonimowy pisze...

Pececik, witaj . Mam problem:przy próbie"przywracania systemu" komputer nie przeprowadza operacji ponieważ 1 plik nie może otworzyć. Proszę, poradż mi jak moge odnależć ten plik, i co z nim zrobić. Wyłączyłam antywirusa, więc to nie o niego chodzi. Pozdrawiam i z góry dziękuję.

Anonimowy pisze...

Pececiku, zapomniałam dodać że program to windows 7, Nina

Anonimowy pisze...

Nie mogę pojąć dlaczego wykonując działania dokładnie w/g Twoich zaleceń, ani jedno mi nie wychodzi. Problem w tym, że po naciśnięciu enter na ekranie są pokazane strony jak w wyszukiwarce przez google- dlaczego? Proszę o pomoc. Antek

Przemo pisze...

Jeżeli wszystko działa (nie wyświetla się błąd) - to oznacza, że żadne zapytanie nie działa - czyli inaczej mówiąc strona jest dobrze chroniona.
Nic dodać nic ująć.

Nie ma tutaj prostych rozwiązań - powtarzam to kolejny raz, każda strona może być zbudowana w różny sposób - ponadto sprawdzamy to tylko i wyłącznie na własnej witrynie - żadnych cudzych stronach !

Anonimowy pisze...

Co za .... to pisal? xD

W

www.pececik.blogspot.com/index.php?id=-1 union select 1,table_name,3 from information.schema_tables limit 1 offset 1--

po pierwsze to nie

information.schema_tables

tylko

information_schema.tables

Przemo pisze...

Faktycznie w artykule pojawiła się literówka, która została poprawiona - faktyczny układ to :

information_schema.tables

Więcej informacji można znaleźć na stronie : http://dev.mysql.com/doc/refman/5.1/en/information-schema.html

Anonimowy pisze...

Witam.Z poradników na temat SQL można wyczytać,że sprawdzanie na podatność ataku jest bardzo proste,wystarczy do linku dopisać ' a co oznacza komunikat,nie odnaleziono serwera (Firefox nie może odnaleźć serwera www ...

Razer pisze...

Dobrze wiedzieć jak się bronić przed takim atakiem, z tego co widzę to coraz bardziej popularna metoda/.

Prześlij komentarz