Bezpieczeństwo Systemów Informacyjnych – lab. 13 Atak typu

Transkrypt

Bezpieczeństwo Systemów Informacyjnych – lab. 13 Atak typu
Bezpieczeństwo Systemów Informacyjnych – lab. 13
Atak typu: zastrzyk SQL, metody obrony
Wstęp
Wielu początkujących programistów tworzących różne aplikacje webowe korzysta najczęściej takich technologii
jak język PHP, serwer baza danych Mysql, Postgresql. Podczas tworzenia różnych systemów często zdarza się,
że projekt systemu obejmuje swoim zakresem rejestrację użytkowników oraz moduł logowania do systemu. To
właśnie ta funkcjonalność systemu może być elementem ataku zwanym „zastrzykiem SQL”.
SQL Injection (z ang., dosłownie zastrzyk SQL) – atak związany z luką w zabezpieczeniach aplikacji
internetowych polegającą na nieodpowiednim filtrowaniu lub niedostatecznym typowaniu danych przesyłanych
w postaci zapytań SQL do bazy danych. Na taki atak podatne są systemy złożone z warstwy programistycznej
(przykładowo skrypt w PHP, ASP, JSP itp.) dynamicznie generującej zapytania do bazy danych (MySQL,
PostgreSQL itp.). Wynika to z błędów programisty.
Na naszych zajęciach zaprezentujemy sposób wykonania przykładowego zastrzyku SQL oraz podamy krótką
informację o metodach zabezpieczania aplikacji przed takimi atakami. Temat SQL incjection jest obszerny,
zatem zainteresowanych odsyłamy do materiałów z sieci lub zapoznanie się z zawartością dokumentu:
http://orka.am.gdynia.pl/bsi/lab13/ext_sql_injection.pdf
poszerzającego wiedzę o takich atakach. Dokument jest zbiorem wybranych fragmentów tekstów dostępnych
w sieci Internet i nie jesteśmy jego autorami. Nasz przykładowy zastrzyk SQL także powstał w większości na
podstawie materiałów opublikowanych w sieci Internet.
Aplikacja rejestrująca użytkowników
Uruchom system Windows – SO oraz zaloguj się jako admin.
Załóżmy, że nasza aplikacja webowa będzie realizowała rejestrację użytkowników. Będzie to tylko zalążek
takiej aplikacji, gdyż w rzeczywistych warunkach aplikacja taka byłaby bardziej złożona i dodatkowo korzystała
z kilku technologii internetowych. Nam jednak nie chodzi o nauczenie jak projektować poprawne aplikacje
z obsługą bazy danych, lecz chcemy zaprezentować mechanizm ataku SQL injection.
W celu realizacji zajęć wykorzystamy środowisko WampServer 2.0. Wykonaj następujące czynności:
Przygotowanie środowiska WampServer
Korzystając z materiałów poprzednich zajęć BSI_lab12.pdf, przygotuj w swoim systemie Windows XP
działające środowisko WampServer. Z materiałów do lab12 wykorzystaj następujące akapity:
 Przygotowanie odpowiedniego oprogramowania:
 Uruchomienie i sprawdzenie działania pakietu WampServer
 Zabezpieczenie dostępu do motoru baz danych mysql
 Ustawienie hasła dla użytkownika root
Struktury danych dla potrzeb naszej aplikacji
Utworzymy aplikację korzystającą z bazy danych mysql składającej się z jednej tabeli. W normalnych
warunkach projekt bazy byłby bardziej złożony i obejmowałby większą liczbę tabel, widoków, indeksów oraz
wyzwalaczy. Dla uproszczenia, w celu lepszego skupieniu się na SQL injection, posłużymy się jedną bazą
zawierającą jedną tabelę.
Podczas naszych prac może przydać się krótki przewodnik do mysql (patrz przewodnik_mysql.pdf). Nasza
aplikacja będzie przechowywała login, hasła użytkowników oraz poziom uprawnień. Poziom uprawnień może
przyjąć dwie wartości: user, admin co oznacza odpowiednio konto zwykłego użytkownika oraz administratora.
Na potrzeby naszych rozważań utworzymy bazę danych SQL_injection z tabelą użytkownicy składającą się
z kolumn: id, login, hasło, poziom. Przeanalizuj zawartość skryptu SQL znajdującego się na następnej stronie.
Poszczególne instrukcje zaopatrzono w odpowiednie komentarze, które wyjaśniają ich działanie instrukcji.
Za pomocą phpmyadmin albo konsoli mysql wykonaj poniższy skrypt w celu przygotowania bazy danych
SQL_injection wraz ze strukturą użytkownicy.
Zwróć uwagę, że wartości haseł są wynikiem wbudowanej po stronie serwera mysql funkcji md5.
1
Bezpieczeństwo Systemów Informacyjnych – lab. 13
/* zawartość pliku strukt_data.sql */
/* źródło skryptu: http://orka.am.gdynia.pl/bsi/lab13/strukt_data.sql */
-- utworzenie bazy danych
--
create database sql_injection;
--
-- ustawienie bieżącej bazy danych
--
use sql_injection;
--
-- struktura, tabela
--
create table uzytkownicy
(id int auto_increment primary key,
login varchar(15),
haslo varchar(50),
poziom varchar(5)
);
--
-- wstawienie przykładowych danych (dwóch administratorów, jeden zwykły użytkownik)
--
insert into uzytkownicy values (null,'wojtek',md5('superhaslo'),'admin');
insert into uzytkownicy values (null,'zenek',md5('jeszczelepszehaslo'),'admin');
insert into uzytkownicy values (null,'magda',md5('magdalena2009'),'user');
--
-- wyświetl listę użytkowników oraz ich haseł
select * from uzytkownicy;
--- przydzielenie uprawnień insert, select do bazy sql_injection
-- użytkownikowi sql_inj z hasłem Bezp2009
-- -> takie same parametry połączenia
-- z bazą danych musi mieć aplikacja php
-grant Insert, Select On sql_injection.* to 'sql_inj'@'localhost' identified by 'Bezp2009';
--
-- sprawdzenie przyznanych uprawnień do bazy danych dla użytkownika sql_inj
show grants for sql_inj@localhost;
--
-- uaktywnienie nadanych uprawnień
--
flush privileges;
--
Aplikacja php rejestrująca użytkowników
Pobierz z zasobów
http://orka.am.gdynia.pl/bsi/lab13
plik app.rar i rozpakuj go w katalogu www serwera WAMP. Uzyskasz w ten sposób katalog app z czteroma
plikami. Nasza aplikacja składa się z następujących plików:
Nazwa pliku
index.php
loguj.php
rejestruj.php
config.inc
Opis
Główny plik aplikacji – menu zaloguj, rejestruj
Skrypt realizujący logowanie do systemu dla użytkowników już istniejących.
W przypadku logowania zwykłego użytkownika wyświetla treść: Witaj zwykły
użytkowniku. Jeśli zaloguje się admin to pojawia się treść: Witaj admin
Skrypt realizujący rejestrację nowych użytkowników. Podczas rejestracji sprawdza,
czy już taki użytkownik istnieje oraz używa w zapytaniu insert funkcji md5 w celu
zakodowania hasła.
Plik z parametrami połączeniowymi z bazą mysql. Nawiązanie połączenia z bazą
danych mysql. Kod funkcji spr
2
Bezpieczeństwo Systemów Informacyjnych – lab. 13
Do przygotowania poszczególnych plików będzie nam potrzebny odpowiedni edytor do modyfikacji plików
w odpowiedniej stronie kodowej i rozpoznający składnię plików np. php. W tym celu wybraliśmy KED.
Znajdź, pobierz i zainstaluj edytor KED.
Obejrzyj kolejno zawartość poszczególnych plików. Jak już zauważyłeś plik config.inc zawiera parametry
połączenia z bazą danych mysql. Parametry te są zgodne z wcześniejszym przyznaniem uprawnień za pomocą
GRANT dla użytkownika sql_inj. Nasza aplikacja może tylko dodawać oraz przeglądać rekordy. Nie potrafi
usuwać danych jak i elementów bazy.
Wywołaj swoją aplikację za pomocą adresu URL:
http://localhost/app
Wykonaj próbę logowania dwóch użytkowników (wojtek, magda). Wykonaj próbę rejestracji dwóch nowych
użytkowników, a następnie próby ich logowania. Obejrzyj zawartość tabeli użytkownicy w bazie sql_injection
za pomocą phpmyadmin albo za pomocą instrukcji sql w konsoli mysql.
Nasz system potrafi tylko rejestrować zwykłych użytkowników!!!
Zastrzyk SQL w naszej aplikacji.
Celem naszego zastrzyku będzie zaprezentowanie studentom, że z wykorzystaniem dostępnej aplikacji
utworzymy konto administratora tzn., że status w kolumnie poziom w nowym rekordzie będzie wynosić: admin,
a nie user. Czyli, jak teraz nadać naszemu użytkownikowi rangę administratora?
Mając bazę możesz postarać się sam na to wpaść, jeśli jednak nie potrafisz poniżej przedstawiamy sposób
postępowania, aby osiągnąć zamierzony cel:
Oryginalne zapytanie do bazy danych MySQL:
insert into uzytkownicy values(null,'login',md5('jakies_haslo'),'user')
A powinno wyglądać o tak:
insert into uzytkownicy values(null,'login',md5('jakies_haslo'),'admin')
Patrząc na powyższe zapytania do bazy danych, musimy zmienić ostatnią, a zarazem najważniejszą rzecz, czyli
rangę. Jak już zauważyłeś wszelkie aplikacje budują zapytanie sql poprzez sklejenie poszczególnych instrukcji
sql z odpowiednimi wartościami z pól formularza. Jeśli wiemy, że w mysql komentarz występuje jako zapis
dwóch następujących po sobie myślników, to jeśli w polu formularza hasło: wpiszemy swoje hasło doklejając
odpowiedni znaki końca łańcucha, nawiasy no i wartość admin + na końcu komentarz po to, aby zakomentować
końcówkę zapytania oryginalnego),'user'), to spowodujemy, że uda nam się dopisać użytkownika z rangą
administratora. Poniżej przedstawiamy wartości pól użytych w przykładzie (uwaga przed i za komentarzem
musi być spacja)
Login:
Hasło:
admin
haslo123'),'admin')
--
Wówczas zobaczymy efekt naszej rejestracji.
Dziękujemy za rejestrację!
Wykonaj teraz logowanie na konto admin z hasłem: haslo123. Powinieneś otrzymać tekst: Witaj admin.
OOPS – udał się zastrzyk SQL – mamy konto admina
Dołóż jeszcze dwa konta administratorskie z różnymi loginami oraz hasłami. Dla ułatwienia zapisu hasła w celu
wykonania zastrzyku możesz w kodzie rejestruj.php wykonać dwie zmiany:
Ustaw typ text dla pola haslo -> wówczas zobaczysz, jakie hasło wpisujesz do formularza. Oprócz tego można
zdjąć komentarz wiersza numer 28 po to, aby w oknie przeglądarki zobaczyć, jak wygląda zbudowane przez
aplikację zapytanie SQL.
Pytanie:
Czy można dołożyć rekord o wartości rangi/poziomu gość, a nie user lub admin?
Jeśli tak to powiedz jak to rozwiązać!
3
Bezpieczeństwo Systemów Informacyjnych – lab. 13
Ochrona przed atakami SQL injection
Ochrona przed takimi atakami może polegać na ścisłej kontroli pól formularzy, albo samych zapytań przed ich
wykonaniem. Z pomocą mogą przyjść następujące funkcje php:
addslashes();
stripslashes();
htmlentities();
strip_tags();
htmlspecialchars();
mysql_escape_string();
My jednak przefiltrujemy dane pobierane z formularza za pomocą własnej funkcji spr($string), co spowoduje
dodanie odpowiednich znaków w przypadku napotkania komentarza. Użycie tej funkcji pozwoli na uniknięcie
przedstawionego wcześniej ataku. Czy nasza aplikacja będzie całkowicie bezpieczna na ataki SQL incjection?
To całkiem inna sprawa.
Funkcja spr() zamienia komentarz - - na zapis !q co powoduje później błędne wykonanie zapytania. Nasza
funkcja wykorzystuje funkcję biblioteczną z php str_replace.
Kod źródłowy funkcji znajduje się w pliku config.inc. W celu przetestowania naszej prostej ochrony przed
atakami SQL w pliku rejestruj.php usuń komentarze dla wierszy od 24 do 26. Zakomentuj wiersz 27.
Teraz ponownie wykonaj próbę utworzenia konta admina.
Czy udało Ci się?
4
Bezpieczeństwo Systemów Informacyjnych – lab. 13
Instalacja środowiska GLPI w środowisku WampServer
Za pomocą klienta konsoli mysql lub phpmyadmin połącz się z bazą danych mysql. Wykorzystując polecenia
SQL: CREATE DATABASE …, USE DATABASE …, GRANT … lub funkcje phpmyadmin-a wykonaj
następujące czynności:
1.
2.
Utwórz bazę danych o nazwie inwentaryzacja,
W bazie danych mysql utwórz użytkownika u_informatyk z hasłem INFo@009 wraz z nadaniem
pełnych uprawnień do bazy inwentaryzacja.
Przygotowane parametry posłużą do instalacji środowiska GLPI.
Pobierz najnowszą wersję GLPI ze strony:
http://www.glpi-project.org/spip.php?lang=en
rozpakuj kod aplikacji w katalogu F:\Wampso\www\inwentaryzacja.
Może okazać się, że do rozpakowania będzie potrzebne jakieś narzędzie. Jakie?
Aplikacja ta ma być dostępna pod adresem URL:
http://localhost/inwetaryzacja
Wywołaj powyższy adres URL w swojej przeglądarce i rozpocznij proces instalacji. Podczas instalacji możesz
posłużyć się przykładową dokumentacją prezentującą etapy instalacji GLPI:
http://orka.am.gdynia.pl/bsi/lab13/instalacja_glpi.pdf
Zarządzanie systemem GLPI
Po zalogowaniu się do aplikacji za pomocą konta glpi wykonaj następujące czynności:
Za pomocą menu Administracja/Oddziały dopisz trzy oddziały



Badawczo-rozwojowy
Wsparcia-serwisu
Handlowy
Przyjrzyj się aplikacji, a w szczególności menu Administracja.
Wykonaj następujące czynności:
 Utwórz grupy wraz z użytkownikami zgodnie z poniższą tabelę.
 Do każdej grupy dopisz po dwóch pracowników.
 Zaproponuj własne hasła!!!
Nazwa oddziału
Handlowy
Nazwa grupy glpi
handel
Badawczo-rozwojowy
badroz
Wsparcia i serwisu
wspser
Członkowie grupy
janek
basia
wojtek
zenek
hania
darek
Jako Wojtek zarejestruj dwa komputery wraz z jakimś oprogramowaniem np. Windows 7 i Office 2010 Beta.
Zastanów się teraz nad następującymi pytaniem:
Czy aplikacji GLPI odporna jest na atak typu: zastrzyk SQL?
Można przeanalizować kod aplikacji w miejscach, gdzie pobiera się dane z formularzy oraz wiersze, w których
konstruowane jest zapytanie SQL. Nie będzie to takie proste, bo może okazać się pracochłonne. Można szukać
funkcji, o których mówiliśmy wcześniej.
5
Bezpieczeństwo Systemów Informacyjnych – lab. 13
Rozliczenie z laboratorium nr 13:
W ramach rozliczenia się z tego laboratorium w pliku tekstowym odpowiedz na 4 pytania:
1. Czy system GLPI ma jakieś zabezpieczenia przed zastrzykami SQL?
2. Jak w GLPI zorganizowana jest hierarchia uprawnień? Czy można manipulować przydziałem
uprawnień użytkownikom w ramach funkcjonalności systemu?
3. Czy administrator ma wpływ na menu użytkownika i dostępne w nim funkcje systemu?
4. Jakie dodatkowe czynności techniczne należy wykonać, aby używanie systemu GLPI w jakimś
przedsiębiorstwie było jak najbardziej bezpieczne?
Plik tekstowy z odpowiedziami na te pytania należy przesłać za pomocą ILIASA: rozliczenie_lab13.txt
(laboratorium 13).
Posprzątaj po sobie:
1.
2.
3.
4.
Wyłącz wampserver
Odinstaluj narzędzie wampserver
Usuń katalog F:\Wampso
Usuń wszystkie katalogi i pliki instalacyjne z systemu
6

Podobne dokumenty