Maciej Buczek - Atak sql injection.pdf

(221 KB) Pobierz
Atak SQL Injection
Atak SQL Injection
Na serwery/aplikacje WWW oparte o SQL Server
Autor: Maciej Buczek
1
Spis treści
1.Wprowadzenie.................................................................................................. 3
2.Wykrywanie stron podatnych na SQL Injection...........................................3
3.Podstawy ataku.................................................................................................4
4.Przykłady włamań na serwery........................................................................ 5
a) Pominięcie autoryzacji........................................................................................................5
b) Wykorzystanie uprawnień dla dostępu do bazy danych.....................................................6
c) Pozyskiwanie informacji używając komunikatów o błędach.............................................7
5.Zabezpieczenia................................................................................................10
Bibliografia:....................................................................................................... 13
2
1. Wprowadzenie.
Każda poważna aplikacja posiada trójwarstwową architekturę: GUI-API-DataLayer.
Warstwę danych (DataLayer) stanowi w 95 % baza danych. Przechowuje ona dane
użytkowników, uprawnienia, informacje finansowe i biznesowe, oraz wiele innych
ważnych danych. Dlatego tak ważne jest, aby dane były bezpieczne.
Pewnie niewielu z Was wie, co oznacza termin SQL Injection. Jest to atak, którego
źródłem są niewalidowane dane wejściowe użytkownika aplikacji, które mogą być
pobrane przez system np. z formularza WWW. Celem ataku SQL Injection jest
wydobycie poufnych informacji z bazy danych i zakłócenie jej prawidłowego działania
Mimo tego że jest stosunkowo łatwo zabezpieczyć się przed atakami tego typu istnieje
bardzo wiele serwisów podatnych na takie zagrożenie.
SQL Injection jest atakiem wymaga tylko otwartego portu 80 i aplikacji webowej opartej
o technologie PHP, JSP, ASP, CGI itd.
Atak polega na wstrzyknięciu zapytania/polecenia SQL poprzez formę na stronie www.
Wiele aplikacji webowych pobiera dane od użytkownika i wykorzystuje je do
formułowania zapytań do bazy danych. Typowym przykładem jest pobieranie loginu i
hasła od użytkownika i autoryzacja danej osoby. Użytkownik dostaje w ten sposób
konkretne przywileje i poszerzony dostęp do bazy danych. Jest możliwe aby tak
spreparować login i/lub hasło, aby zmienić sens zapytania i uzyskać inny niezamierzony
przez projektanta aplikacji efekt.
2. Wykrywanie stron podatnych na SQL Injection.
Co będzie potrzebne?
Wystarczy tylko przeglądarka internetowa.
W celu przeprowadzenia ataku wyszukujemy stronę, która pozwala na wprowadzanie
danych przez użytkownika. Strona HTMLowa często używa metody POST do przesyłania
danych do innej strony skojarzonej z danym skryptem (PHP, ASP, JSP itd.) i wykonującej
dane zadanie pobrania i obróbki danych z bazy danych (np. MySql).
Dane przesyłane metodą POST nie są widoczne w URL dlatego aby wyszukać stronę
używającej metody POST można zwyczajnie przeglądać kod źródłowy i wyszukiwać
tagów <FORM>
Np.:
<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>
Jeżeli nie możesz znaleźć stron przyjmujących dane, powinieneś poszukać stron PHP,
JSP, ASP ,CGI, Szczególną uwagę należy zwrócić na adresy stron typu:
3
http://hakowana.strona/index.php?id=10
Jak sprawdzić czy strona jest podatna na ataki SQL Injection?
Wypełnij pola login albo hasło wartościami:
Login : hi’ or 1=1--
Hasło: hi’ or 1=1--
Można także podać te ciągi bezpośrednio do adresu URL:
http://duck/index.asp?id=hi' or 1=1--
Jeśli skrypt jest niezabezpieczony to zalogujemy się na stronę bez podawania loginu i
hasła.
3. Podstawy ataku.
Typowe zapytanie SQL wygląda następująco:
select id, forename, surname from authors
To zapytanie wyciągnie z bazy kolumne ‘id’, ‘forename’, ‘surname’ z tabeli ‘authors’
zwracając wszystkie wiersze.
Zbiór wyników może być ograniczony poprzez podanie warunku:
SELECT id, forename, surname FROM authors WHERE forename = 'john' AND surname
= 'smith'
Trzeba zauważyć, że ciągi znakowe ‘john’ i ‘smith’ są ograniczone poprzez znak „
” (pojedynczy cudzysłów). Zakładając, że te wartości zostały podane przez użytkownika
aplikacji, atakujący mógłby spowodować nieoczekiwane zachowanie aplikacji
wprowadzając dane:
name : Jo’hn
surname: Smith
Zapytanie będzie miało postać:
SELECT id, forename, surname FROM authors WHERE forename = 'jo'hn' AND
surname = 'smith'
Kiedy system będzie próbował wykonać to zapytanie, zostanie zwrócony następujący
komunikat o błędzie:
4
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'hn'
Powodem takiego zachowanie jest fakt że pojedynczy cudzysłów w podawanym polu
kończy ciąg znakowy. Następnie system próbuje wykonać polecenie ‘hn nie należące do
języka SQL i generuje błąd.
Istnieje także metoda pomijająca ograniczenia wynikające z zastosowanie warunku
„WHERE”. Mianowicie, zastosowanie znacznika “ -- “,który w zapytaniu SQL jest przez
SQL Server 2000 („#” w MySql) interpretowany jako polecenie ignorowania
wszystkiego, co po takim znaczniku występuje.
Dlatego w zapytaniu:
SELECT name, surname, book_title FROM authors WHERE surname=’<user input>’
AND book_title=’<user input>’
wprowadzając dane
surname: Sienkiewicz’--
book_title: Quo Vadis
Do bazy zostanie wysłane przez aplikację zapytanie:
SELECT name, surname, book_title FROM authors WHERE surname=’Sienkiewicz’ --’
AND book_title=’Quo Vadis’
Wyświetlające wszystkie pozycje których autorem jest Sienkiewicz.
4. Przykłady włamań na serwery.
a) Pominięcie autoryzacji.
Proces autoryzacji może przebiegać w następujący sposób:
SELECT * FROM users WHERE login=’<user input>’ and password=’<user input>’
Gdy powyższe zapytanie zwróci jeden wiersz to znaczy, że istnieje dokładnie jeden
użytkownik o danym loginie i haśle. W związku autoryzacja użytkownika powiodła się i
możemy dopuścić go do kolejnych podstron naszej strony lub udostępnić nowe
funkcjonalności naszej aplikacji webowej.
Na pierwszy rzut oka wszystko działa poprawnie. Jeśli przykładowo istnieje użytkownik
login=Jacek, password=ala i wprowadzi on swoje dane w formatce logowania, klauzula
WHERE w zapytaniu autoryzacji będzie miała postać:
“WHERE login=‘Jacek’ AND password=’ala’”;
5
Zgłoś jeśli naruszono regulamin