pobierz plik referatu
Transkrypt
pobierz plik referatu
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008 Rozdział 2 w Zaawansowane metody manipulacji kodu SQL 1 Wstęp da .b w w Streszczenie. Aplikacje internetowe zazwyczaj korzystają z warstwy danych, którą prawie zawsze jest baza danych. Jednym z rodzajów ataków poprzez aplikacje internetowe jest wstrzykiwanie przekazywanego przez aplikacje do baz danych kodu SQL. W rozdziale omówiono zaawansowane warianty ataku metodą iniekcji kodu SQL, przedstawiono klasyfikację tego typu ataków, wskazując jednocześnie możliwości uchronienia się przed manipulacjami przekazywanego kodu SQL. Rozdział poświęcony jest atakom poprzez wstrzykiwanie kodu SQL (ang. SQL injection), nazywanymi też atakiem poprzez iniekcję kodu SQL, stanowiącym duże zagrożenie dla systemów z bazami danych. W rozdziale opisano, na czym polegają ataki poprzez wstrzykiwanie kodu SQL. Zamieszczono również krótką historię tych ataków. Omówione zostały techniki używane w atakach techniką iniekcji kodu SQL oraz możliwości obrony. W celu demonstracji wybranych metod iniekcji SQL posłużono się PHP 5.2.5/MySQL 5.1 (pod Apache 2.0.58). pl s. 1.1 Przykładowe dane Wygenerowana do celów demonstracyjnych tabela wygląda następująco: mysql> DESCRIBE towary; +-------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | 0 | | | nazwa | varchar(40) | YES | | NULL | | | data | date | YES | | NULL | | | cena | float(12,2) unsigned | YES | | NULL | | +-------+----------------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) Wprowadzone zostały dane: Anna Kotulla Politechnika Śląska, Instytut Informatyki, ul. Akademicka 16, 44-100 Gliwice, Polska email:[email protected] (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008 Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008 A. Kotulla w mysql> SELECT * FROM towary; +----+-------------------+------------+---------+ | id | nazwa | data | cena | +----+-------------------+------------+---------+ | 1 | klawiatura | 2007-12-05 | 48.95 | | 2 | mysz | 2008-01-05 | 19.99 | | 3 | monitor 22" | 2008-01-03 | 1512.50 | | 4 | dysk twardy 500GB | 2007-12-03 | 888.00 | | 5 | nagrywarka | 2007-11-15 | 166.23 | +----+-------------------+------------+---------+ 5 rows in set (0.00 sec) w 2 Atak poprzez wstrzykiwanie kodu SQL 2.1 Historia ataków techniką iniekcji SQL da .b w Pierwsze informacje [4] na temat ataków poprzez wstrzykiwanie kodu SQL pojawiły się w grudniu 1998 w 54 wydaniu czasopisma Phrack. Wówczas opisano ataki przeprowadzone na aplikacje IDC oraz ASP pod Microsoft Internet Information Server, bazą danych był SQL Server 6.5. Wstrzykiwanie kodu SQL początkowo nazywane było m.in. SQL Insertion (wstawianie kodu SQL) . Sam termin SQL Injection pojawił się pod koniec 1999 roku, wprowadzony został prawdopodobnie przez Chipa Andrewsa w jego artykule „SQL Injection FAQ”, opublikowanym na SQLSecurity.com. 2.2 Na czym polegają ataki techniką wstrzykiwania kodu SQL pl s. Wstrzykiwanie kodu SQL [1], [2], [3], [4], [5], [6], [9], [11], jest metodą ataku na systemy baz danych i polega na skłonieniu bazy danych do wykonania niepożądanego kodu SQL, wprowadzonego poprzez rozszerzenie istniejących zapytań SQL o dodatkowe elementy. Zmienione zapytania SQL wprowadzane są przez aplikacje, najczęściej internetowe, korzystające z bazy danych. Atak poprzez iniekcję kodu SQL jest możliwy, kiedy aplikacja akceptuje wprowadzone przez użytkownika dane i wbudowuje je do zapytania SQL. Zapytanie to wysyłane jest do bazy danych i tam wykonywane. Aby zilustrować atak poprzez iniekcję kodu SQL, załóżmy, że w bazie danych istnieje tabela pracownicy, a jej kolumnami są m.in. nazwisko, imie, data_urodzenia, data_zatrudnienia, natomiast intencją autora było zwrócenie wartości kolumny data_zatrudnienia dla podanego imienia i nazwiska pracownika to dane wstawiane są w odpowiednie pola formularza. Wówczas dane mogą być przekazywanie poprzez URL postaci http://chroniona_strona/przykladowy_skrypt.php?nazw=<podane_nazwisko>& imie=<podane_imie> Niech aplikacja zmienia to na zapytanie SELECT data_zatrudnienia FROM pracownicy WHERE nazwisko=’podane_nazwisko’ AND imie=’podane_imie’ Jeżeli nie jest sprawdzane, jakiego typu dane zostają przekazywanie, atakujący może próbować zmodyfikować zapytanie na przykład w taki sposób: 24 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008 Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008 Zaawansowane metody manipulacji kodu SQL http://chroniona_strona/przykladowy_skrypt.php?nazw=<podane_nazwisko_r azem_z_dodatkowym_kodem_SQL>&imie=<podane_imie> W przypadku braku kontroli przekazywanych danych, zmodyfikowane może być również zapytanie SQL skierowanie do bazy danych, w sposób przewidziany przez atakującego. 2.3 Przygotowanie ataku w da .b w w Przygotowanie ataku polega na określeniu tzw. wektora ataku [4], [7], czyli wykonanie wstępnego rozpoznania, jak poważna jest luka. W ramach przygotowania przykładowo obserwowana jest reakcja aplikacji na zmodyfikowane parametry wejściowe, podejmowane są próby uzyskania komunikatów błędów bezpośrednio w aplikacji, czy przeglądarce. W trakcie rekonesansu uzyskuje się wektor ataku. Otrzymywane mogą być informacje o wykorzystanych w aplikacji zapytaniach SQL, stosowanych technikach zabezpieczających – np. sprawdzaniu wprowadzanych wartości. Bywa, że otrzymywane informacje pozwalają określić strukturę bazy danych. W przypadku, kiedy aplikacja nie zwraca informacji o błędzie, stosowana jest technika zwana ślepym wstrzykiwaniem kodu SQL [8], [9] (ang. blind SQL Injection) – ślepym z powodu niedostatecznych dla atakującego informacji o błędzie. Bywa, że atakujący jednak i w takiej sytuacji potrafi stwierdzić czy zapytanie było wykonane, np. na podstawie czasów odpowiedzi lub zwróconych różniących się komunikatów (np. informacji o błędzie przygotowanych przez autora aplikacji). Dalsze informacje o tej groźnej technice znajdują się w [8]. 2.4 Rodzaje ataku SQL Injection – podział ze względu ukierunkowanie ataku na elementy zapytania SQL pl s. Biorąc pod uwagę, w jaki aspekt zapytania SQL skierowany jest atak [7], można dokonać podziału na: − ataki wymierzone na składnię zapytania, − ataki ukierunkowane na składnię języka SQL, − ataki na logikę zapytania, Wymienione powyższe techniki ataku bywają łączone. Metody ataku, pogrupowane ze względu na sposób dostępu, omówione są w podrozdzale 3. 2.5 Rodzaje ataku SQL Injection – podział ze względu na sposób dostępu Innym możliwym podziałem jest zestawienie ze względu na sposób dostępu. Ataki SQL Injection podzielone są na [6]: − próbę dostępu przez stronę logowania, za pomocą: − warunku OR, − klauzuli HAVING, − złożonych zapytań, − użycia zewnętrznych procedur sterujących (ang. stored procedures), − próbę dostępu poprzez URL, za pomocą: − manipulowania składni zapytania bezpośrednio w URL, − użycia wyrażeń SELECT wraz z UNION. 25 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008 Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008 A. Kotulla 3 Metody ataku w Biorąc pod uwagę, w jaki aspekt zapytania SQL skierowany jest atak [7], można dokonać podziału na: − ataki wymierzone na składnię zapytania, polegające na wstawianiu znaków burzących składnię zapytania, co ma na celu wygenerowanie błędów, pomagających uzupełnić wektor ataku. Do tego celu stosowane bywają znaki specjalne, takie jak znaki komentarza, cudzysłowy, apostrofy, średniki. Znaki podawane bywają również w postaci niebezpośredniej (aby ominąć filtry), np. CHAR(0x3B). 0x3B jest szesnastowym oznaczeniem kodu ASCII dla średnika, czy częściej jeszcze stosowany kod apostrofu CHAR(0x27). − ataki ukierunkowane na składnię języka SQL. Celem jest wygenerowanie błędów bazy danych lub wykonanie zapytań poprzez manipulację językiem SQL. Przykładowo do tej grupy ataków zalicza się wykonywanie własnych zapytań (typu SHOW TABLES;) dołączonych do właściwego zapytania. − ataki na logikę zapytania, polegające na takim zmodyfikowaniu kwerendy, aby otrzymać dane z tabel, których programiści nie mieli zamiaru udostępnić. Do tej grupy zaliczają się ataki z wykorzystaniem operatora UNION. w w da .b 3. 1 Ataki na składnię zapytań pl s. Podczas filtrowania danych wejściowych w skryptach PHP [7] możliwe są błędy, wynikające z niedostecznego filtrowania, kiedy np. szukany jest tylko znak apostrofu, a pominięte są inne, potencjalnie niebezpieczne znaki, do których zaliczyć można [4] znaki spacji, <, >, &, czy =. Uwzględnić należy, że znaki te mogą być zastąpione innymi wyrażeniami. Przykładowo dla MySQL zamiast SELECT * FROM towary WHERE ID=4 używane może być wyrażenie SELECT * FROM towary WHERE ID BETWEEN 4 AND 4. Problem sprawiać mogą zbyt ostre kryteria filtrowania [7]. Można otrzymać błędnie sformatowane zapytanie, jeżeli użyte będą funkcje: − magic_quotes(), która automatycznie kasuje wszystkie apostrofy za wyjątkiem znaku \, − oraz strip_slashes(), usuwającą znaki kasowania, Newralgicznym elementem zapytań są zmienne [7], szczególnie numeryczne, lub typu DATE. Sprawdzane są szczególnie potencjalnie obiecujące kombinacje, do których przykładowo należą: − liczby ujemne, − sprawdzanie ślepe: duże lub małe liczby zmiennoprzecinkowe, np. 4.78326123e-421, 9.23343213e+308, − sprawdzanie systematyczne: liczby mogące być poza zakresem, np. 28+n, 216+n, 232+n, 264+n (gdzie n oznacza jakąś liczbę całkowitą dodatnią). Inną możliwością są znane ograniczenia liczb jakiegoś typu, na przykład jeżeli kolumnie w MySQL [11] przypisane zostały dane typu FLOAT, wówczas dozwolonymi wartościami są: − -3.402823466E+38 do -1.175494351E-38, − 0, − 1.175494351E-38 do 3.402823466E+38. Dla języka PHP standardowo typem parametru dla wszystkich zmiennych jest łańcuch znaków, co powodować może problemy w przypadku oczekiwanych wartości liczbowych, czy typu DATE. 26 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008 Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008 Zaawansowane metody manipulacji kodu SQL Zwracać uwagę należy również na niebezpieczne znaki przemycane za pomocą rozbudowanych wyrażeń i przez to trudniejsze do znalezienia [7], np. cH%41r(0x68-0x41) odpowiada CHAR(0x27). 3. 2 Ataki na składnię języka SQL w Język SQL [7], ze względu na swoje właściwości, jak przykładowo rozbudowane możliwości tworzenia składniowych odpowiedników zapytań, jest sam w sobie dosyć dobrym celem ataku. Ataki tego typu bywają dobrym źródłem informacji pomagających rozbudować wektory ataku. Najczęściej w pierwszym rzędzie podejmowane są próby manipulowania danych numerycznych [7]. Reakcja sprawdzana jest przykładowo techniką tzw. surowych parametrów. Technika ta używa odpowiedników jakiejś liczby/wyrażenia, np. zamiast wyrażenia numer=83 można próbować na miejsce 83 podstawiać takie wartości jak 0123 (liczba przedstawiona ósemkowo), czy 0x53 (liczba przedstawiona szesnastkowo). Jeżeli uzyskane od aplikacji odpowiedzi są identyczne, wskazuje to na przetwarzanie surowych wartości parametrów. Do ataków na składnię języka SQL zaliczyć można takie, które zastępują wymienione już wcześniej znaki potencjalnie niebezpieczne, filtrowane przez aplikację, innymi [4]. da .b w w pl s. Rys. 1. Wynik zapytania SELECT id, nazwa, cena FROM towary WHERE id=4 or id=3 Przykładowo, niech fragment kodu w PHP pytający przykładową bazę danych ma postać: <?php $przekazany_parametr1 = "4"; $przekazany_parametr2 = "3"; $sql = "SELECT id, nazwa, cena FROM towary WHERE id=$przekazany_parametr1" or id=$przekazany_parametr2"; $towary_query = mysql_query($sql) or die("Zapytanie nie moglo zostac wykonane."); $Liczba_linii = mysql_num_rows($towary_query); echo "Zwrocono linii: $Liczba_linii"; ?> <table cellpadding="1" cellspacing="3" border="1"> <tr> 27 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008 Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008 A. Kotulla w = mysql_fetch_array($towary_query)){ $towary['id']?></td> $towary['nazwa']?></td> $towary['cena']?></td> w <td>Id</td> <td>Nazwa</td> <td>Cena</td> </tr> <?php while ($towary ?> <tr> <td><?php echo <td><?php echo <td><?php echo </tr> <?php } ?> </table> w W wyniku wykonania powyższego fragmentu kodu otrzymuje się wynik przedstawiony na rys. 1. Można próbować uzyskać ten sam wynik, podstawiając wyrażenie równoważne. Np. w przypadku, kiedy filtrowane są spacje, a chce uzyskać się wyniki dla id=1, id=3, id=4 można spróbować to zrobić w sposób następujący, otrzymując wynik przedstawiony na rys. 2: da .b $przekazany_parametr1 = "(4)or(id)=1"; $przekazany_parametr2 = "3"; $sql = "SELECT id, nazwa, cena FROM towary WHERE id=$przekazany_parametr1" or id=$przekazany_parametr2"; pl s. Rys. 2. Wynik zapytania SELECT id, nazwa, cena FROM towary WHERE id=4 or id=1 or id=3 Zagrożenie stanowią również znaki, które mogą przedwcześnie zakończyć zapytanie, jak /* czy --. Przykładowo wynik zwrócony dla poniższego wyrażenia przedstawiono na rys. 3. $przekazany_parametr1 = "4 /*"; $przekazany_parametr2 = "3"; $sql = "SELECT id, nazwa, cena FROM towary WHERE id=$przekazany_parametr1" or id=$przekazany_parametr2"; 28 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008 Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008 Zaawansowane metody manipulacji kodu SQL w w w Rys. 3. Wynik zapytania SELECT id, nazwa, cena FROM towary WHERE id=4/* or id=3 da .b Zabezpieczyć się przed atakami na składnię języka SQL można stosując przemyślany system filtrowania danych wejściowych, ograniczając długość wprowadzanych parametrów do określonej liczby znaków, oraz koniecznie zamieniając zmienne łańcuchowe na liczby w samej aplikacji, oraz blokując np. liczby postaci innej niż dziesiętna, jak 0x57. 3. 3 Ataki na logikę zapytania Ataki przy użyciu UNION zademonstrowane zostaną na konkretnym przykładzie. Załóżmy, że dla podanego przykładowego kodu PHP warunek WHERE otrzymuje wartość wprowadzoną przez użytkownika i przekazaną przez aplikację bez należytego filtrowania. Jest wiele potencjalnie interesujących danych, w przykładzie wyczytane zostaną po prostu dane z innej tabeli, wynik przedstawiony jest na rys. 4. pl s. $przekazany_parametr1="4"; $przekazany_parametr2="3 UNION SELECT nazwisko,1,data_urodzenia FROM pracownicy"; $sql = "SELECT id, nazwa, cena FROM towary WHERE id=$przekazany_parametr1 or id=$przekazany_parametr2"; Wartość 1 wprowadzono celowo, demonstrując, jak radzić sobie można w przypadku, kiedy właściwe zapytanie zwraca więcej kolumn, niż uzyskane ma być poprzez zmanipulowany kod. W odwrotnym przypadku używane jest CONCAT(). Atakujący może czasem otrzymać wystarczające informacje o sposobie wykonywania zapytania po prostu podglądając kod strony. Obrona przed takiego typu atakami możliwa jest poprzez używanie zapisanych procedur (oddzielających dane od logiki zapytań) oraz wykorzystywanie spreparowanych wyrażeń. 29 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008 Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008 A. Kotulla w da .b w w Rys. 4. Wynik zapytania SELECT id, nazwa, cena FROM towary WHERE id=4 or id=3 UNION SELECT nazwisko,1,data_urodzenia FROM pracownicy 3. 4 Ataki na strukturę bazy danych mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | przyklad | | test | +--------------------+ 4 rows in set (0.08 sec) pl s. Ataki na strukturę bazy danych celowo wymieniono w osobnym podpunkcie. Zidentyfikowanie, jaki system baz danych jest atakowany, jest dla atakującego cennym uzupełnieniem wektora ataku, ponieważ systemy baz danych różnią się pomiędzy sobą strukturą – np. standardowymi tabelami, użytkownikami, perspektywami. Przed zdobyciem informacji na temat baz danych warto się dodatkowo zabezpieczyć, filtrując wprowadzone wartości na obecność „typowych” zapytań, przedstawionych poniżej wraz z przykładowymi odpowiedziami: 30 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008 Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008 Zaawansowane metody manipulacji kodu SQL mysql> SHOW TABLES; +--------------------+ | Tables_in_przyklad | +--------------------+ | pracownicy | | towary | +--------------------+ 2 rows in set (0.02 sec) w w mysql> EXPLAIN towary; +-------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | 0 | | | nazwa | varchar(40) | YES | | NULL | | | data | date | YES | | NULL | | | cena | float(12,2) unsigned | YES | | NULL | | +-------+----------------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) da .b w mysql> SELECT CURTIME(); +-----------+ | CURTIME() | +-----------+ | 19:55:30 | +-----------+ 1 row in set (0.06 sec) Składnie dla innych systemów baz danych oraz kompletne listy takich poleceń znaleźć można np. w dokumentacji bazy danej. 4 Podsumowanie pl s. Ataki SQL Injection w pierwszym rzędzie nie są skierowane przeciwko konkretnej bazie danych, tylko wykorzystują język SQL, który stosowany jest do zapytań w różnych bazach danych. Poznanie sposobu atakowania przez iniekcję kodu SQL i używanych coraz to nowych technik jest potrzebne, gdyż umożliwia skuteczną ochronę przed takimi atakami. Z biegiem czasu nie tylko sposoby ataku stają się coraz bardziej skomplikowane, również metody ochrony są coraz bardziej kompleksowe i łatwiejsze do stosowania. Istnieją przykładowo słowniki potencjalnie niebezpiecznych wyrażeń, do których zaliczyć można przytoczone wcześniej cH%41r(0x68-0x41). Trudno jest oszacować, jaka liczba aplikacji internetowych kierujących zapytania do baz danych jest podatna na wstrzykiwanie kodu SQL. Sam jednak rozwój ataków tą techniką pokazuje, że nie jest to problem marginalny. Litchfield [4] podaje, że w latach 2003/2004 ok. 60% testowanych poprzez Next Generation Security Software Ltd aplikacji było podatnych na wstrzykiwanie kodu SQL. Metody używane do atakowania aplikacji za pomocą iniekcji kodu SQL mogą również okazać się przydatne do zupełnie innych celów – na przykład do testowania aplikacji, przykładem jest tu ślepe wstrzykiwanie kodu SQL [9]. 31 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008 Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008 A. Kotulla Literatura 1. w Anley Ch.: Advanced SQL Injection In SQL Server Applications. An NGSSoftware Insight Security Research (NISR) Publication. Next Generation Security Software Ltd 2002. 2. Anley Ch.: (more) Advanced SQL Injection. An NGSSoftware Insight Security Research (NISR) Publication. Next Generation Security Software Ltd 2002. 3. Kost S.: An Introduction to SQL Injection Attacks for Oracle Developers. Integrity Corporation. Chicago 2004. 4. Litchfield D.: Data-mining with SQL Injection and Interference. An NGSSoftware Insight Security Research (NISR) Publication. Next Generation Security Software Ltd 2005. 5. Litchfield D., Anley Ch., Haesman J., Grindlay B.: The Database Hacker’s Handbook, Defending Database Servers. Wiley Publishing, Inc., Indianapolis 2005. 6. Sharma P.: SQL Injection Techniques & Countermeasures. Department of Information Technology, Ministry of Communications and Information Technology, Government of India, 2005. 7. Shema M.: Zaawansowane ataki SQL Injection. Hakin9 Nr5/2005. 8. Spett K.: Blind SQL Injection. Are you web applications vulnerable? SPI Dynamics, Inc. 2005. 9. Stender S. T.: Blind Security Testing – An Evolutionary Approach. iSEC Partners, Inc. 2007. 10. Strobel S.: Tückische Eingaben. Angriffsmöglichkeiten auf Webapplikationen und Abwehrtechniken. iX Extra 11/2007. 11. MySQL 5.1 Reference Manual. da .b w w pl s. 32 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008