Najbardziej lamerskie forum w polsce
Nawet dość taki tekscior
+=============================================
|index:
+=============================================
|0. Disclaimer
|1. O czym artykul
|2. Co to jest blind sql injection
|3. Jak rozpoznawac podatnosc
|4. Filtrowanie
|5. Komentarze
|6. Omijanie filtrowania
|7. Co daje sql injection
|8. Podsumowanie
|9. Autor
|10. Info
+=============================================
==============================================
0. Disclaimer.
==============================================
Artykul powstal w celach edukacyjny , ukazujac bledy i niedopatrzenia webmasterow , programistow php ,
cgi etc podczas tworzenie aplikacji sieciowych korzystajacych z zasobow bazy danych.
Autor nie namawia czytelnikow do uzywania tych technik niezgodnie z prawem.
Autor nie bierze odpowiedzialnosci za to jak czytelnicy wykorzystaja zawarte tu informacje.
==============================================
1. O czym artykul.
==============================================
Jedynym sposobem exploracji zasobow serwera jest wyszukanie w uslugach jakie pelni , bledy i niedopatrzenia programistow.
Jedna z najprostrzych metod jest 'sql injection'.
Metoda ataku polega na odpowiednim spreparowaniu ciagow znakow ktore tworza logiczny ciag zapytania sql do bazy danych.
Aby zrozumiec na czym polega blind sql injection , potrzebna jest wiedza o podstawach jezyka sql.
Nie bylem w stanie umiescic w jednym artykule tych wszystkich informacji naraz. W rozdziale 10'tym 'Info' zamiescilem niezbedne
linki ktore pomoga wszystko zrozumiec.
==============================================
2. Co to jest blind sql injection.
==============================================
Jedna z odmian ataku sql injection jest blind sql injection ,
bardziej zaawansowana technika polegajaca w gruncie rzeczy na tym samym.
Jedyna roznica miedzy nimi jest to ze atak przeprowadzamy niemal na slepo, kierujac sie wlasna wiedza do celu.
Podczas stosowania tej metody wykorzystuje sie operatory logiczne zapytan sql ,
ktore sprawiaja bardziej wiarygodne zrodlo informacji o stanie bazy danych jak i jej tabelach.
Atak na slepo ? , ale jak ? juz tlumacze.
Zwykle zle spreparowane wartosci przekazywane w zmiennych do aplikacji sieciowych powoduja wyswietlenie bledu bazy danych ,
co sprawia ze latwo jest spreparowac odpowiednie zapytanie.
A co jesli programista wkorzysta wyjatki wynikow z bazy danych powodujace ich zamaskowanie ?
Luka nadal istnieje , jestesmy w stanie ja wykorzystac lecz rozpoznanie typowego bledu sql juz nie jest takie proste ,
trzeba przypatrywac sie na dzialanie aplikacji sieciowych pod katem programisty , badac jej zachowanie.
==============================================
3. Jak rozpoznawac podatnosc.
==============================================
Mozna rozpoznawac w dwa sposoby , klasyczny i logiczny.
(w rzeczywistym swiecie nie ma takiego podzialu , stworzylem go sam aby latwo zobrazowac dwie metody)
*Klasyczny (wykorzystywany przy atakach metoda sql injection):
Polega na odpowiednim spreparowaniu wartosci zmiennych przekazywanych do aplikacji sieciowych zazwyczaj za pomoca metody GET
(ciag umiejscowiony w zwyczajnym adresie url) , jednakze mozna takze szukac bledow za pomoca metody POST
(spreparowany ciag w zmiennych przekazywanych przez formularze), co staje sie juz bardziej zaawansowana technika.
Aby zorientowac sie czy badana aplikacja sieciowa podatna jest na ataki sql injection metoda klasyczna nalezy
odpowiednio spreparowac wartosci zmiennych przekazywanych do serwera.
Jesli beda blady w zapytaniu sql ktore nie tworzy logicznej calosci (nie zwraca porzadanego wyniku) ,
apliakcje sieciowe 'wypluja' odpowiednie logi na badanej stronie (niekiedy w zrodle html w postaci komantarza!).
Aby tego dokonac mozna stosowac sie do tych regul:
http://adres_url/index.php?id=(wartosc)
(wartosc) - moze przybierac rozne wartosci lub takze inny rodzaj zmiennej.
przyklad:
(-1) //wartosc -1 id klucza tabel bazy danych , zazwyczaj nie ma takiego klucza wiec powinien wyskoczyc blad.
(-999999999999) //to samo co wyzej , tylko z ta pewnoscia ze napewno nie ma tak wysokiego klucza o wartosciach ujemnych.
(999999999999999999999) //zazwyczaj w bazach danych malych witryn sieciowych nie ma tak duzego klucza w tabeli ,
powinien wyskoczyc blad.
(ssssssssssssssssssssssssssssssss) //powoduje przypisanie do klucza ( zmiennej rodzaju integer ) , zmiennej rodzaju vchar ,
powinien wyskoczyc blad zapytania sql do bazy danych.
(1') //powoduje blad w logicznym zapytaniu sql do bazy danych , jesli zauwarzymy blad wyswietlony na otrzymanej stronie
bedziemy pewni ze strona nie posiada odpowiedniego filtrowania znakow , strona jest podatna na sql injection.
Analizujac dane posuniecia jestesmy w stanie stwierdzic:
-zmienna integer przekazywana do skryptu nie jest filtrowana poprzez wartosc tj:
aplikacja nie widzi roznicy miedzy wartosciami 1 a -1 , traktuje je jako wartosc integer , przekazuje do zapytania sql.
-ze w tabeli nie ma tak duzego klucza jak: (999999999999999999999)
-nie sa filtrowane znaki vchar , sa traktowane jako integer i do tej wartosci przypisywane. swiadczyc to moze o tym
ze strona moze nie posiadac zadnego filtrowania wartosci wejsciowych.
-jesli (1') zwroci blad to jestesmy przekonani ze skrypt nie posiada najprawdopowdobniej zadnego filtrowania ,
strona najprawdopodobniej jest calkowicie podatna na ataki sql injection.
*logiczny (wykorzystywany podczas atakow blind sql injection)
Polega na wykorzystaniu odpowiednich warunkow logicznych w zapytaniach kierowanych do bazy danych.
Manipulacja na warunkach logicznych moze pozwolic nam na okreslenie:
-czy wartosc badanej zmiennej nie jest filtrowana
-nazwy kolumn danej tabeli w bazie danych
-nazwy tabel w bazie danych
-ilosc kolumn zwracanych w wyniku zapytania sql z bazy
-ilosc wierszy zwracanych w wyniku zapytania sql z bazy
Jak wczesniej napisalem , wszystko jest robione wedlug okreslonych regul i na slepo ,
czesto stawiajac na wlasna intuicje i szczescie.
Niekiedy programista piszac aplikacje sieciowe zamieszcza odpowiedni kod do wykrywania zauwazonych bledow
poprzez analize wynikow bazy danych. Jesli aplikacja 'zauwazy' blad to moze:
-zwrocic go na strone glowna (lub jako komentarz w kodzie html)
-pozostawic szczegulne znaki w kodzie programu (dodatkowe spacje , nowe linie ,
znaki ktorych nie bylo podczas zwyklego zapytania)
-moze przekierowac na strone bledu (na inna podstrone strony)
-moze wyswietlic blad ze 'czegos' nie znalazlo w bazie.
http://adres_url/index.php?id=(wartosc)
Oryginalna wartosc to np 100 , (wartosc)=100
Teraz spreparowanie odpowiednich warunkow logicznych
przyklad:
(wartosc)=100 and 1=1
Jesli zauwazymy ten sam wynik strony (tj. te sama tresc strony wynikowej) mozliwe ze strona jest:
-odpowiednio filtrowana (z wartosci 100 and 1=1 jest wyciagana tylko pierwsza wartosc integer tj: 100)
-podatna na blind sql injection
Nastepna czynnosc to:
(wartosc)=100 and 1=2
Jesli zauwazymy ten sam wynik strony (tj. te sama tresc strony wynikowej) mozliwe ze strona jest:
-odpowiednio filtrowana (z wartosci 100 and 1=2 jest wyciagana tylko pierwsza wartosc integer tj: 100)
-nie podatna na sql injection
Jesli zauwazymy jakies zmiany w tresci strony wynikowej tj. brak zawartosci strony , przekierowanie na
bledna strone , dziwne znaki na stronie lub tez calkowity brak zawartosci strony to znaczy ze strona jest podatna na
sql injection , aby jednak dowiedziec sie czegos wiecej o ewentualnym filtrowaniu badz innych udziwien
programistow mozna stosowac dalsze czynnosci.
Nastepna czynnosc to:
(wartosc)=100 and 1=2 or 1=1
Jesli zauwazymy zupelnie inna zawartosc strony (np inny artykul , inny news) swiadczyc to moze
ze strona jest calkowicie podatna na sql injection.
Nastepna czynnosc to:
(wartosc)=100 and 1=2 or id=100
(wartosc)=100 and 1=2 or ids=100
(wartosc)=100 and 1=2 or uid=100
Czynnosci te sluza do wykrywania nazw kolumn w tabeli bazy danych (mozna stosowac rozne popularne nazwy kolumn ,
czasem polskie , czasem angielskie) do pomocy przychodzi na szczescie nam kod strony , analizujac kod html mozna ustalic
jakim programista sieciowym byl autor strony , czy pisal strone szybko , czy wolno i doklanie , jakie nazwy stosowal do
opisywania obiektow jak i nazw parametrow w formularzach. Analizujac jego kod mozna postawic sie w jego miejscu ,
pomyslec o czym myslal piszac dany kod ...).
Nastepna czynnosc to:
(wartosc)=100 or 1=1 order by id desc/*
(wartosc)=100 or 1=1 order by id asc/*
Jesli bedziemy widziec inna zawartosc strony wynikowej bedziemy pewni ze strona podatna jest na sql injection.
Teraz warto by okreslic ile wierszy jest wyswietlanych na stronie , zazwyczaj jest to jeden ,
ale moze sie zdarzyc ze wylistowac moze wiecej wierszy.
przyklad
(wartosc)=100 and 1=2 or 1=1 limit 0,1/*
(wartosc)=100 and 1=2 or 1=1 limit 5,10/*
itd.
==============================================
4. Filtrowanie.
==============================================
Filtrowanie programisty moze polegac na:
-zastepowaniu niebezpiecznych znakow
\ = \\
* = \*
" = \"
wartosc|spacja|wartosc = wartosc+wartosc
wartosc|spacja|wartosc = wartosc_wartosc
-zastepowaniu kluczowych znakow jezyka sql
union
select
insert
drop
limit
where
from
into
-zastepowaniu znakow logicznych
and
or
&&
||
-zastepowaniu wartosci niebezpiecznych (-999999999) wartosciami bezpiecznymi
-999999999999999999<1 = 1
9999999999999999>10000 = 1
-analizowaniu wartosci i przypisywaniu tylko tej najbardziej rzeczywistej i odpowiedniej
'1 and 1=1' = 1
'2 and 1=1' = 2
Widac ze poczatkowa wartosc jest przypisywana i dopiero po przefiltrowaniu pozostaje zbudowane
zapytanie sql i otrzymane na jego podstawie wynik z bazy danych.
wiec
'a and 1=1' = ?
Nie powinno wogole dojsc do wykonania zapytania sql , jeszcze przed zapytaniem aplikacja
sieciowa wykryla by blad i przkierowala na odpowiednia strone o bledzie lub wyswietlila go na oczekiwanej stronie.
O filtrowaniu mozna sie wiecej dowiedziec podczas budowania odpowiednich zapytan sql ,
analizujac zapytanie sql i porownujac jaki powinien byc jego wynik z wynikiem rzeczywistym.
==============================================
5. Komentarze.
==============================================
Komentarze sql sa bardzo pomocne przy budowaniu bardziej zlozonych zapytani sql do bazy danych.
/* tekst miedzy znacznikami komentarza traktowany jest w zapytaniu sql jako np przerwa (spacja)
miedzy wartosciami itd. Warto zauwazyc ze znaczniki takiego komentarza nie sa traktowane jako znaki
niebezpieczne i czesto nie sa filtrowane , wiec moga symulowac spacje w kazdym zapytaniu sql */
po zamknieciu znacznika komentarza powinien znajdowac sie kolejne operanty zapytania sql ,
znak rozpoczecia komentarza wieloliniowego takze mozna stosowac na koncu kazdego zapytania sql ,
bez potrzeby jego zamkniecia.
http://adres_url/index.php?id=100 and 1=2 or 1=1 limit 0,1/*
Warto zauwazyc jakie pomocne sa komentarze na powyzszym zapytaniu , powoduja ignorowanie
dalszych zaleznosci w klauzuli where zapytania sql.
przyklad:
select id,title,content,date from news where id=100 limit 0,1;
select id,title,content,date from news where id=100 and 1=2 or 1=1 order by id desc limit 0,1/* limit 0,1;
select id,title,content,date from news where id=100/**/and/**/1=2/**/or/**/1=1/**/order/**/by/**/id/**/desc/**/limit 0,1/* limit 0,1;
przyklad:
select id,title,content,date from news where date=4325512 order by date desc;
select id,title,content,date from news where date=4325512 and 1=2 or 1=1 order by id desc/* order by date desc;
select id,title,content,date from news where date=4325512/**/and/**/1=2/**/or/**/1=1/**/order/**/by/**/id/**/desc/* order by date desc;
Istnieja rowniez komentarze jednoliniowe tj. ignorowane sa znaki zapytania sql do konca lini.
--
#
przyklad:
select id,title,content,date from news where id=100 limit 0,1;
select id,title,content,date from news where id=100 and 1=2 or 1=1 order by id desc limit 0,1-- limit 0,1;
==============================================
6. Omijanie filtrowania.
==============================================
Waznym trikiem jest takze omijanie zabezpieczenia filtowania , jesli oczywiscie jest taka mozliwosc.
Trik polega na odnajdywaniu na koncie strony skryptow lub klas ktore sa np wywolywane przez:
-include
-eval
-include_once
-require
-require_once
Zaluzmy ze strona posiada glowny index , ktory zajmuje sie rola typowego firewall ,
fitruje parametry i includuje odpowiednie skrypty. Mozna probowac znajdowac skrypty odpowiedzialne za
poszczegulne funkcje serwisu , wykonywac je bezposrednio z odpowiednimi wartosciami parametrow.
Technika bardzo zaawansowana lecz kiedy programista umiescil zabezpieczenie tylko w glownym
indexie to dalsze skrypty nie posiadaja zadnego fitrowania i mozna sie do nich bezposrednio odwolac.
Metoda polega na odgadywaniu nazw skryptow i paramterow. Paramtery to zazwyczaj klucze (id) ,
lub zmienne o tych samych nazwach ktore sa dolaczane go indexu strony.
przyklad:
http://adres_url/index.php?p=aktualnosci&id=120
http://adres_url/index.php?page=aktualnosci&id=120
http://adres_url/index.php?mode=aktualnosci&id=120
http://adres_url/index.php?str=aktualnosci&id=120
http://adres_url/index.php?use=aktualnosci&id=120
http://adres_url/index.php?view=aktualnosci&id=120
http://adres_url/aktualnosci_102_0.htm
http://adres_url/aktualnosci.php?id=120
http://adres_url/aktualnosci.php4?id=120
http://adres_url/include/aktualnosci.php?id=120
http://adres_url/inc/aktualnosci.php?id=120
http://adres_url/class/aktualnosci.php?id=120
http://adres_url/page/aktualnosci.php?id=120
itd.
==============================================
7. Co daje sql injection.
==============================================
Duzo osob sie pyta co daje sql injection.
Wstrzykniecie kodu do zapytania bazy danych moze:
-powodowac ze atakujacy zdobedzie dane uzytkownikow serwisu , administratora.
Wykorzystujac je moze przejac konto ftp strony , poczte email , panel administracyjny
zarzadzajacy skryptami strony , dostep do bazy danych
-pozwolic dodac newsa na stronie a w nim odpowiednio spreparowany globalny kod xss ,
pozwalajac na zaawansowany atak na uzytkownikow strony
-pozwolic dodac newsa na stronie a w nim odpowiednio spreparowany kod html (lub javascript),
powodujacy wyswietlenie nieoczekiwanej strony (strona owned)
-pozwolic na dokonanie operacji za posrednictwem php , wgrywanie shell'a ktory jest wykonywany po stronie serwera.
-pozwolic na calkowite zawieszenie bazy danych , strona offline.
==============================================
8. Podsumowanie.
==============================================
Jak widac za pomoca sql injection mozna dokonac bardzo duzo rzeczy,
to czyni ten rodzaj bledow w aplikacjach sieciowych na bardzo wysokim
poziomie. Zwracam sie do administratorow sieciowych z prosba o zadbanie o swoje serwisy ,
niechlujna prace nalezy dokonczyc i odpowiednio ja zabezpieczyc [...]
==============================================
9. Autor.
==============================================
Autorem tego artykulu jestem ja:
Cyber
zapraszam w wolnym czasie na moja strone domowa:
http://cybersite.pl
oryginal:
http://cybersite.pl/x/images/blind_sql_injection.txt
==============================================
10. Info (linki , zasoby w sieci).
==============================================
http://www.1keydata.com/sql/sql.html
http://pl.wikipedia.org/wiki/SQL
http://zti.polsl.pl/bd/instr/sql.pdf
http://pl.wikipedia.org/wiki/SQL_injection
http://www.poradnik-webmastera.com/arty … ection.php
http://ul.ii.uj.edu.pl/index.php?option … &Itemid=34
http://en.wikipedia.org/wiki/SQL_injection
http://ocliteracy.com/techtips/sql-injection.html
Offline