Witaj użytkowniku niezalgowany!
Zarejestruj się na forum uż dziś - nie będziesz widzieć żadnych reklam! |
Sql Injection pentestering |
||
Sql Injection pentesteringSQL Injection Poradnik mini kozaczonko taki maly !
W tym tutorialu pokażę wam jak działa SQL Injection i jak z niego korzystać
w celu pozyskania pożytecznych informacji.
Po pierwsze: Co to jest SQL Injection?
Jest to jeden z najczęciej występujšcych błędów w aplikacjach sieciowych.
Pozwala atakujšcemu na wykonanie zapytania do bazy danych ( najczęciej MySQL )
w adresie URL i zdobycie poufnych informacji. ( w wielkim skrócie )
1. SQL Injection ( klasyczny błšd lub jakkolwiek go nie nazywać)
2. Blind SQL Injection ( częć trudniejsza )
Bierzmy się więc do dzieła
a). Sprawdzanie podatnoci.
Powiedzmy, że mamy stronę takš jak ta:
Teraz aby sprawdzić, czy strona jest podatna, dodamy ' na koniec url'a.
Będzie to wyglšdać tak:
I dostajemy błšd podobny do tego:
"You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right etc..."
lub co podobnego
To znaczy, że strona jest podatna na SQL Injection
B). Znajd liczbę kolumn.
Aby znaleć liczbę kolumn, użyjemy klauzuli ORDER BY ( mówi bazie danych jak
uporzšdkować wynik ). Więc, jak tego używać? Po prostu, zwiększamy liczbę,
dopóki nie otrzymamy błędu.
podobnš do tego: "Unknown column '4' in 'order clause'" lub co podobnego.
To oznacza, że strona ma 3 kolumny, bo dostajemy błšd przy 4 - nieistniejšcej.
c) Sprawdzanie funkcjš UNION.
Z unionem możemy otrzymać więcej danych w jednym zapytaniu.
Więc mamy:
( znalelimy już przedtem liczbę kolumn w podpunkcie 2 )
Jeli zobaczymy jakie liczby jak 1, 2, 3 to znaczy, że UNION działa
d) Sprawdzanie wersji MySQL.
| WAŻNE: jeli /* nie zadziała lub dostaniesz jaki błšd, to spróbuj --
Jest to komentarz i jest ważny, aby nasze zapytanie działało poprawnie.
Powiedzmy, że mamy numer 2 na ekranie, aby teraz sprawdzić wersję zamienimy
numer 2 na @@version lub version() i dostaniemy co podobnego do 4.1.33-log
lub 5.0.45 lub co podobnego.
Powinno to wyglšdać tak:
Jeli dostaniesz błšd podobny do tego: "union + illegal mix of collations (IMPLICIT + COERCIBLE) ..."
( nie widziałem żadnego tuta wyjaniajšcego ten błšd, więc muszę napisać )
Potrzebujemy funkcji convert().
np.
lub z hex() i unhex()
np.
i dostaniesz wersję MySQL.
e). Zdobywanie tabeli i nazwy kolumny.
Więc jeli wersja MySQL jest mniejsza niż 5 (np. 4.1.33, 4.1.12... póniej
napisze o wersjach wyższych niż 5 ), to musimy odgadnšć nazwę tabel i kolumn
( w większoci przypadków ).
Wspólne nazwy tabel to: user/s, admin/s, member/s...
Wspólne nazwy kolumn to: username, user, usr, user_name, password, pass, passwd, pwd, etc...
Np.
| (tak jak wczeniej, widzimy numer 2 na ekranie, więc jest dobrze )
Wiemy, że tabela admin istnieje...
Teraz sprawdmy nazwy kolumn.
| ( jeli dostaniesz błšd, spróbój innej nazwy kolumny ).
Po takim zapytaniu, otrzymujemy nazwę userów na ekranie, dla przykładu
admin, superadmin itp...
Teraz sprawdmy czy istnieje kolumna z hasłami.
| ( jeli dostaniesz błšd, spróbuj innej nazwy kolumny ).
I naszym oczom ukazujš się zakodowane hasła lub zwykły tekst, zależne od
tego jak jest ustawiona baza danych.
Np. md5 hash, mysql hash, sha1... <-- to tylko niektóre przykłady kodowania haseł .
Teraz musimy dokończyć zapytanie aby ładnie wyglšdało
Do tego możemy użyć funkcji concat() ( łšczy ona stringi ).
Np.
Zauważ, że gdy piszę 0x3a, to tak jakbym w hexach napisał dwukropek
( można to zastšpić tym: char(58), wartoci ascii )
Teraz informacje zostajš wywietlane tak: username:password
lub admin:admin lub adminomehash
Kiedy masz już co takiego, możesz się zalogować jako admin
lub superuser
Jeli nie możesz zgadnšć właciwej nazwy tabeli, możesz zawsze
spróbować mysql.user (domylnie).
Ta ma kolumny użytkownika i hasła, więc przykładem może być:
f). MySQL 5.
Tak jak powiedziałem przedtem, zamierzam teraz wytłumaczyć jak zdobyć nazwy kolumn
i tabel w wersji MySQL wyższej niż 5. Będziemy potrzebowali information_schema. Zawiera
ona wszystkie tabele i kolumny w bazie danych.
Aby zdobyć tabele użyjemy table_name i information_schema.tables.
Np.
Tutaj zamieniamy ansz numer 2 z table_name aby otrzymać pierwszš tabelę z information_schema.tables
i wywietlić jš na ekranie. Teraz musimy dodać LIMIT na koniec zapytania, aby móc wywietlić inne tabele.
Np.
Zauważ, że wpisałem 0,1 ( pierwszy wynik zaczynam od 0 ).
Np.
I druga tabela zostaje wywietlona.
Trzeciej tabeli przydzielimy limit 2,1.
Np.
Próbuj do tej pory, aż zostanš wywietlone ważne tabele np. db_admin, poll_user, auth, auth_user itp...
Metoda na zdobycie nazw kolumn jest taka sama. Używamy column_name i information_schema.columns.
Metoda jest taka sama jak wyżej więc przykładem będzie:
I pierwsza kolumna zostaje wywietlona.
Druga kolumna ( zmieniamy limit z 0,1 na 1,1)
Np.
Druga kolumna wywietlona, próbować trzeba dotšd, aż otrzymasz co takiego:
username,user,login, password, pass, passwd etc...
Jeli chcesz wywietlić nazwy kolumn dla danej tabeli użyj tego zapytania.
Powiedzmy, że znalelimy tabele users.
Np.
I mamy wywietlone nazwy kolumn z tej tabeli . Używajšc LIMIT możemy wywietlić całš
listę kolumn z tej tabeli.
Zauważ, że to nie działa gdy uruchomione sš magic quotes.
Powiedzmy, że znalelimy kolumny user, pass i email.
Teraz zakończmy nasze zapytanie, i wypiszmy je wszystkie razem
Do tego użyjemy concat(), opisałem to wczeniej.
Np.
I mamy user:pass:email z tabeli users.
przykład: admin:hash:whatever@blabla.com
To już koniec tej częci, przejdmy teraz do częci trudniejszej
2. Blind SQL Injection.
Blind Injection jest trochę bardziej skomplikowane niż zwykłe wstrzykiwanie kodu,
ale może być zrobione . Muszę wspomnieć, że jest jeden bardzo dobry tutorial, napisany
przez xprog'a, więc polecam go przeczytać ( będę go tłumaczył ).
Zacznijmy rzeczy zaawansowane.
Będę używać naszego starego przykładu.
Gdy to wstukamy, zobaczymy jakš stronę z artykułami, zdjęciami itp.
Teraz chcemy przetestować atak Blind SQL Injection.
i strona ładuje się normalnie, to dobrze.
Teraz prawdziwy test.
Więc, jeli jaki tekst, zdjęcie lub inna treć jest brakujšca na zwróconej stronie,
to oznacza że strona jest podatna na Blind SQL Injection.
a). Sprawdzanie wersji MySQL.
Aby zdobyć wersję MySQL w Blind SQLInj, użyjemy substring'a
Np.
Powinno zwrócić TRUE jeli wersja MySQL to 4.
Zamień 4 na 5, i jeli zapytanie zwróci TRUE, wtedy wersja MySQL to 5.
Np.
B). Sprawd czy działa subselect.
Jeli nie działa SELECT, użyjmy SUBSELECT
Np.
Jeli strona załaduje się normalnie to znaczy, że SUBSELECT działa.
Teraz sprawdzimy czy mamy dostęp do mysql.user
Np.
Jeli strona ładuje się normalnie to mamy dostęp do mysql.user i póniej możemy
wycišgnšć jakie hasła używajšc funkcji load_file() i OUTFILE.
c). Sprawdzanie nazw kolumn i tabel.
To jest częć, kiedy zapytanie jest twoim najlepszym przyjacielem
Np.
( z LIMIT'em 0,1 nasze zapytanie zwraca jeden wiersz danych, ponieważ
SUBSELECT zwraca tylko 1 wiersz, to bardzo ważne )
Teraz, jeli strona załaduje się normalnie, bez żadnej zgubionej treci,
to tabela users istnieje. Jeli dostałe FALSE ( brakuje jakiej częci
tekstu), po prostu zmieniaj nazwy tabel dopóki nie odgadniesz tej poprawnej
Powiedzmy, że odgadłe te tabelę o nazwie users, teraz potrzebujesz nazwę kolumny.
Sprawdmy najpierw nazwę takš jak tablicy. Jak powiedziałem wczeniej, próbuj
wspólnych nazw dla kolumn.
Np.
Jeli strona ładuje się normalnie, wiemy że nazwa kolumny to password ( jeli
dostaniemy FALSE próbuj innych wspólnych nazw, lub po prostu zgaduj)
d). Pobierz dane z bazy danych.
Znalelimy w tabeli users kolumny username i password, więc teraz wycišgniemy
z nich dane.
Ok tutaj wycišgamy pierwszy znak od pierwszego użytkownika w tabeli użytkowników.
SUBSTRING zwraca nam pierwszy znak i pierwszy znak długoci (?) ascii() konwertuje
ten pierwszy znak do wartoci ascii a następnie porównuje go znakiem >.
Więc, jeli ASCII char jest większy niż 80, strona ładuje się normalnie (PRAWDA)
Próbujmy dalej, aż dostaniemy fałsz.
dostajemy PRAWDA, dalej zwiększamy
znowu PRAWDA, wyżej.
FAŁSZ!!
Więc pierwszym znakiem w username jest char(99). Używamy konwertera ascii i dowiadujemy się, że char(99) to litera 'c'.
Teraz poszukajmy drugiego znaku.
Zauważ to, że zmieniłem ,1,1 na ,2,1 aby zdobyć drugi znak. ( teraz zwraca drugi znak )
PRAWDA, strona ładuje się normalnie, lecimy wyżej.
FAŁSZ, numer niżej
PRAWDA, wyżej
FAŁSZ!!
I już wiemy, że druga litera to char(105) czyli 'i'. Więc mamy już 'ci'. Nie przestawaj
dopóki nie dojdziesz do końca ( jeli> 0 zwraca FALSE wiemy, że dotarlimy do końca).
Sš pewne narzędzia do Blind SQL Injection, myslę że sqlmap jest najlepsze, ale zawsze robię wszystko sam, bo to pozwala mi stać się lepszym SQL INJECTOR'em
Mam nadzieję, że czego się nauczyłe.
Miłej zabawy.
kozaczonko@hacking.pl
Pozdrawiam, Kozaczonko
Sql Injection pentesteringSzczerzę to jestem mile zaskoczony takim poradnikiem w tym dziale. Jednak przyznaj mi rację, estetyka mogłaby być lepsza? :-) Wielki lajk.
Sql Injection pentesteringNo mogła ale nie dbam o estetyke wale na pałe |
||
« Starszy wątek | Nowszy wątek »
|
Użytkownicy przeglądający ten wątek: |
1 gości |