SQL Injection Kamil Sławiński 1 Plan Wprowadzenie , model aplikacji SQL Injection - Co to jest ? Zagrożenia Przykłady Jak się zabezpieczyć ? Podatność Podsumowanie 2 WPROWADZENIE Wszyscy wiemy, że największym bogactwem każdej firmy są przechowywane w niej dane. Czyni się różne kroki żeby uchronić dane od kradzieży, nieuprawnionej modyfikacji i zniszczenia. Jednak wraz z rozwojem sieci Internet, coraz więcej firm decyduje się na wykorzystanie tego medium do udostępniania wybranych zasobów dla swoich klientów. Najpopularniejszym sposobem na realizację tego zadania jest interfejs WWW. Niestety okazuje się, że udostępnienie takiej funkcjonalności może otworzyć potencjalnemu intruzowi bardzo łatwą drogę do zdobycia oraz modyfikacji interesujących go danych. 3 WPROWADZENIE c.d. Każdy z nas wykorzystuje w swojej pracy dane zgromadzone w bazach danych. Zwykle nie robimy tego bezpośrednio zadając zapytanie SQL, lecz za pośrednictwem jakiegoś interfejsu do bazy danych. Całość aplikacji składa się z trzech warstw: 1. Klient 2. Warstwa pośrednicząca 3. Baza danych Zwykle dane do zapytania wpisujemy w odpowiednim okienku za pomocą interfejsu ,a następnie są one przetwarzane przez warstwe pośredniczącą ,która konstruuje z tych danych pełnoprawne zapytanie SQL i przesyła je do bazy danych. Właśnie tutaj tkwi główny cel ataków SQL-injection. 4 SQL Injection – Co to jest? SQL injection polega na nieautoryzowanym wykonaniu wyrażeń języka SQL SQL injection to metoda ataku polegająca na dodaniu do zapytania wykonywanego przez warstwę pośredniczącą dodatkowego zapytania SQL. SQL injection to typ ataku, który korzysta z dziur w aplikacjach Web'owych. Wykorzystuje wywołanie zapytania SQL w aplikacji w której nie przetwarza się danych uzyskanych od użytkownika Najczęściej polega na takim skonstruowaniu formuły w klauzuli WHERE zapytania, by sprawdzanie wprowadzonych danych nie miało znaczenia. 5 Zagrożenia W rezultacie może to prowadzić do: zdobycia danych, do których użytkownik nie jest uprawniony zmodyfikowania danych, bądź dodania do bazy dodatkowych danych obejścia mechanizmów opartych na pobieraniu danych z bazy (np. autoryzacji) 6 Przykłady Przykładem będzie prosty skrypt JSP, który pokazuje wykonanie zapytania do bazy. Skrypt pobiera od użytkownika dane do zapytania przez prosty formularz składający się z jednego pola tekstowego. Np. jeżeli w pole wpiszemy: sal=800, to otrzymamy listę pracowników, których wynagrodzenie wynosi 800. Jeżeli przeanalizujemy kod to okaże się, że to co użytkownik wpisuje w formularz web-owy jest "doklejane" do zapytania: SELECT ename, sal FROM scott.emp WHERE ___ Czyli po wpisaniu "sal=800" skrypt skonstruuje zapytanie: SELECT ename, sal FROM scott.emp WHERE sal=800 7 Przykłady c.d. Ponieważ użytkownik może wpisywać w formularz web-owy dowolne ciągi znaków zamiast „sal=800” możemy wpisać „sal=800 union select username, user_id from all_users”. W wyniku zostanie skonstruoowane zapytanie: SELECT ename, sal FROM scott.emp WHERE sal=800 UNION SELECT username, user_id FROM all_users W rezultacie użytkownik (intruz) uzyskał dostęp do widoku all_users, a więc wykonał działanie na które twórca interfejsu nie zezwolił bezpośrednio. Powyższy przykład jest bardzo prosty, jednak świetnie ilustruje istotę ataku typu SQL-injection. 8 Przykład 2 - modyfikacja danych Jest to typowa strona www służącą do uwierzytelniania się. (kod ponizej) LoginPage.php <HTML> <BODY> FORM ACTION=LoginPage2.php> Uzytkownik: <INPUT NAME="username"><BR> Haslo: <INPUT NAME="password"><BR> <INPUT TYPE="submit" VALUE="Zaloguj"> </FORM> </BODY> Formularz, który pobiera od użytkownika parametry "username" i "password" i wywołuje kolejny skrypt, który ma za zadanie sprawdzić w bazie danych, czy podane przez użytkownika login i hasło są prawidłowe. LoginPage2.php … // funkcja do autoryzacji function MyAuth( $conn,$username,$password) { $query = "SELECT id FROM users WHERE"; $query .= " username = ‘" . $username . "' AND "; $query .= " password = ‘" . $password . "'"; $res = pg_query( $query); } if (pg_num_rows( $res) == 1) { $row = pg_fetch_array( $res); $id = $row[‘id']; } else { $id = 0; } return $id; 9 Modyfikowanie danych –c.d. Szczeglnym fragmentem powyższego kodu jest zapytanie: "SELECT id FROM users WHERE username = ‘" . $username . "' AND password = ‘" . $password . "'"; Podobnie jak w poprzednim wypadku zapytanie jest konstruowane przez sklejenie części stałych, zaszytych w programie ze zmiennymi wprowadzonymi przez użytkownika przez formularz www. Jeżeli do formularza LoginPage.php wprowadzimy następujące dane: Użytkownik: ‘; delete from users Hasło: Zostanie wykonane polecenie : "SELECT id FROM users WHERE username = ‘" . ‘; delete from users-- . "' AND password = ‘" .. "'"; 10 W wyniku otrzymamy zapytanie : SELECT id FROM users WHERE username = "; delete from users W rezultacie, zawartość tablicy users zostanie usunięta, uniemożliwiając innym użytkownikom na dostęp do systemu!!! W przypadku Oracle powyższa metoda jest nieskuteczna, gdyż składnia SQL Oracle nie dopuszcza do wykonywania kilku komend w jednej linii. Przykład 3 - ominięcie mechanizmów uwierzytelniających Funkcja uwierzytelniająca(MyAuth) przedstawiona w przykładzie drugim, wykonuje zapytanie i sprawdza ilość rekordów zwróconych przez to zapytanie. Jeżeli zapytanie zwróciło dokładnie jeden rekord, to funkcja stwierdzi że użytkownik wpisał poprawny login oraz hasło i zwróci identyfikator użytkownika. Jeśli w formularzu wpiszemy : Username: ‘ or 1 = 1-- skrypt wykona zapytanie: SELECT id FROM users WHERE username = " OR 1 = 1 W rezultacie intruz będzie mógł zalogować się z prawami pierwszego użytkownika w bazie. 11 Zapobieganie atakom Ataki SQL-injection są dość ciężkie do wykrycia i zablokowania przez to, że są one przenoszone przez zwykłe wywołania protokołu HTTP. Obrona na poziomie bazy danych- użytkownik związany z aplikacją WWW powinien mieć najmniejszy możliwy zestaw przywilejów, niezbędny do wykonania działań na bazie.W szczególności należy rozważyć uprawnienia do wykonywania procedur w bazie oraz uprawnienia do modyfikowania danych. Filtrowanie zapytań do serwera - wyszukiwanie pewnych słów kluczowych w wywołaniu HTTP. SELECT, DELETE, INSERT, UPDATE UNION SELECT ,OR 1=1,OR A=A,-- , ‘ . Wdrożenie tej metody wymaga jednak szczegółowego ustalenia zestawu wykrywanych znaków. Filtrowanie na firewallu - filtrowanie zapytań HTTP za pomocą słów (lub wyrażeń) kluczowych, można zaimplementować na firewallu. Przykładem może być Checkpoint Firewall-1 , który posiada możliwość analizowania ruchu HTTP i blokowania na podstawie słów kluczowych. 12 Zapobieganie c.d Powyższe metody nie dają pełnego zabezpieczenia. Typ możliwych do zastosowania ataków SQL-injection jest ściśle zależny od logiki działania aplikacji internetowej oraz sposobu integracji serwera WWW z bazą danych. Znacznie większy poziom bezpieczeństwa możemy osiągnąć stosując zasady bezpiecznego projektowania i programowania aplikacji internetowych 13 Podatność Niektóre z produktów podatne na ataki SQL injection: -Oracle 9i Application Server Portal R1 i R2 -Oracle E-Business Suite 11i -Oracle Database (Oracle HTTP Server z mod_plsql). Procedura PL/SQL może być wykonywana z uprawnieniami użytkownika wywołującego lub z uprawnieniami użytkownika definiującego procedurę. Doklejone przez intruza zapytanie wywoła się z takimi samymi prawami jak atakowana procedura. W niektórych wypadkach mogą to być uprawnienia użytkowników SYS lub SYSTEM W rezultacie nieuprzywilejowany intruz może uzyskać dostęp do dowolnych danych w bazie. Niektóre pakiety, w których znaleziono opisywane podatności to: Portal DB Provider Forms, Portal DB Provider Hierarchy, Portal DB Provider XML Components, List of Values. 14 Podsumowanie Na przykładzie SQL-injection widzimy , że powszechnie stosowanie mechanizmy obronne (firewall) nie zawsze mogą nas obronić przed skutecznym atakiem. Istotna jest dobra znajomość i czynne stosowanie zasad bezpiecznego programowania. Bardzo ważne jest zrozumienie podstaw i istoty działania mechanizmów bazodanowych z których korzystamy. Niestety, na skutek rozwoju technologii developerskich, powszechnego stosowania generatorów kodu często o tych podstawach zapominamy ,a to stwarza doskonałe środowisko dla intruzów. 15