• Artykuły
  • Forum
  • Ciekawostki
  • Encyklopedia
  • SQL injection

    Przeczytaj także...
    Perl – interpretowany język programowania autorstwa Larry’ego Walla początkowo przeznaczony głównie do pracy z danymi tekstowymi, obecnie używany do wielu innych zastosowań. Wzorowany na takich językach jak C, skryptowe: sed, awk i sh oraz na wielu innych.PHP – obiektowy język programowania zaprojektowany do generowania stron internetowych i budowania aplikacji webowych w czasie rzeczywistym.
    Silna typizacja to system typów w języku programowania, w którym każde wyrażenie ma ustalony typ i nie można go używać w kontekście przeznaczonym dla innych typów.

    SQL injection (z ang.) – metoda ataku komputerowego wykorzystująca lukę w zabezpieczeniach aplikacji polegającą na nieodpowiednim filtrowaniu lub niedostatecznym typowaniu danych użytkownika, które to dane są później wykorzystywane przy wykonaniu zapytań (SQL) do bazy danych. Podatne są na nią wszystkie systemy przyjmujące dane od użytkownika i dynamicznie generujące zapytania do bazy danych.

    Apache – otwarty serwer HTTP dostępny dla wielu systemów operacyjnych (m.in. UNIX, GNU/Linux, BSD, OS X, Microsoft Windows).Interfejs programowania aplikacji (ang. Application Programming Interface, API) – sposób, rozumiany jako ściśle określony zestaw reguł i ich opisów, w jaki programy komunikują się między sobą. API definiuje się na poziomie kodu źródłowego dla takich składników oprogramowania jak np. aplikacje, biblioteki czy system operacyjny. Zadaniem API jest dostarczenie odpowiednich specyfikacji podprogramów, struktur danych, klas obiektów i wymaganych protokołów komunikacyjnych.

    Formy ataku SQL Injection[ | edytuj kod]

    Niedostateczne filtrowanie danych[ | edytuj kod]

    Ten typ ataków opiera się na nieodpowiednim filtrowaniu znaków ucieczki z danych wejściowych, co pozwala m.in. na modyfikację zapytania niezgodnie z intencją programisty, albo nawet przekazanie dodatkowych zapytań niszczących dane.

    MD5 (z ang. Message-Digest algorithm 5 – Skrót wiadomości wersja 5) – algorytm z dziedziny kryptografii. Jest to popularna kryptograficzna funkcja skrótu, która z dowolnego ciągu danych generuje 128-bitowy skrót.SQL (ang. Structured Query Language wym. /ɛskjuːˈɛl/) – strukturalny język zapytań używany do tworzenia, modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych.

    Modyfikowanie zapytań[ | edytuj kod]

    Poniższy kod prezentuje ten problem (PHP):

     $q = mysql_query("SELECT * FROM uzytkownicy WHERE uzytkownik = '$uzytkownik'");
    

    Gdy użytkownik przekaże jako $uzytkownik wartość „kowalski”, całe zapytanie przyjmie postać:

     SELECT * FROM uzytkownicy WHERE uzytkownik = 'kowalski'
    

    i będzie spełniało swoją funkcję. Jednak gdy złośliwy użytkownik przekaże wartość „x' OR '1'='1”, to całe zapytanie będzie wyglądało:

    Referencja w informatyce to wartość, która zawiera informacje o położeniu innej wartości w pamięci lub na innym nośniku danych. W odróżnieniu od wskaźników, zarządzanie referencjami realizowane jest wyłącznie przez kompilator lub interpreter, a programista nie posiada żadnych informacji o konkretnym sposobie implementacji referencji.Ukośnik – znak pisarski mający postać ukośnej kreski (/). W zależności od tego w którą stronę pochylony jest ukośnik ma on różne nazwy:
     SELECT * FROM uzytkownicy WHERE uzytkownik = 'x' OR '1'='1'
    

    przez co pobierze z bazy danych wszystkie rekordy zamiast jednego wybranego.

    Przekazywanie dodatkowych zapytań[ | edytuj kod]

    Teoretycznie w ten sposób można przekazać każde zapytanie SQL, włącznie z wykonaniem kilku zapytań naraz. Jeżeli w powyższym przykładzie użytkownik przekaże „x'; DROP TABLE uzytkownicy; SELECT '1”, to całe zapytanie przybierze postać:

    Baza danych – zbiór danych zapisanych zgodnie z określonymi regułami. W węższym znaczeniu obejmuje dane cyfrowe gromadzone zgodnie z zasadami przyjętymi dla danego programu komputerowego specjalizowanego do gromadzenia i przetwarzania tych danych. Program taki (często pakiet programów) nazywany jest „systemem zarządzania bazą danych” (ang. database management system, DBMS).System zarządzania bazą danych, SZBD (ang. Database Management System, DBMS) – oprogramowanie bądź system informatyczny służący do zarządzania bazą danych. System zarządzania bazą danych może być również serwerem bazy danych (SBD) lub też może udostępniać bazę danych lokalnie – na określonym komputerze.
     SELECT * FROM uzytkownicy WHERE uzytkownik = 'x'; DROP TABLE uzytkownicy; SELECT '1'
    

    co zaowocuje usunięciem tabeli „uzytkownicy”.

    Blokowanie serwera[ | edytuj kod]

    Korzystając z ataku typu SQL Injection można również przeprowadzić atak typu DoS (odmowy usługi):

     x' AND BENCHMARK(9999999,BENCHMARK(999999,BENCHMARK(999999,MD5(NOW()))))=0 OR '1'='1
    

    W tym przypadku serwer spróbuje obliczyć skrót MD5 dla aktualnego czasu 999999 = 999997000002999999 (w zaokrągleniu trylion) razy.

    Security through obscurity lub security by obscurity (z ang. bezpieczeństwo poprzez niezrozumiałość) to przykład złych praktyk stosowanych w bezpieczeństwie teleinformatycznym, którego istotą jest ukrywanie detali dotyczących implementacji, formatów i protokołów przed potencjalnymi adwersarzami. Osoby stosujące tę technikę wierzą, że nawet jeśli system posiada luki, nieznajomość błędów uniemożliwia przeprowadzenie ataku.DoS (ang. Denial of Service, odmowa usługi) – atak na system komputerowy lub usługę sieciową w celu uniemożliwienia działania.

    „Ślepy” atak[ | edytuj kod]

    O „ślepym” ataku (ang. Blind SQL Injection) mówi się w przypadku wykonywania ataku typu SQL Injection na stronie, która nie wyświetla komunikatów błędów. W tym przypadku badać można zmiany na stronie, przykładowo:

     SELECT * FROM uzytkownicy WHERE uzytkownik='x' AND 1=2;
    

    Powyższe zapytanie powinno nic nie zwrócić. Inaczej w przypadku wykonania poniższego zapytania:

     SELECT * FROM uzytkownicy WHERE uzytkownik='x' OR 1=1;
    

    Powyższe zapytanie powinno zawsze zwrócić jakikolwiek wynik, bowiem 1 jest równe 1. Badając zmiany zachodzące na stronie można stwierdzić czy w danym miejscu można dokonać ataku.

    Błędy w serwerze SQL[ | edytuj kod]

    Czasami błędy umożliwiające atak występują w samym serwerze SQL, jak było w przypadku funkcji real_escape_chars() z MySQL.

    Zabezpieczanie przed atakiem[ | edytuj kod]

    Zabezpieczanie na poziomie aplikacji[ | edytuj kod]

    Podstawowym sposobem zabezpieczania przed SQL injection jest niedopuszczenie do nieuprawnionej zmiany wykonywanego zapytania.

    W PHP można to zrobić, poprzez wykonanie na każdym tekstowym parametrze wykorzystywanym do budowy zapytania wbudowanej funkcji addslashes(), która dodaje backslash przed znakami, takimi jak ', " czy \, dzięki czemu znaki te nie są traktowane jak znaki specjalne. Dostępne są również funkcje specyficzne dla poszczególnych silników, takie jak np. oferowana przez serwer MySQL mysql_real_escape_string(). Jeśli wczytując dane z formularza programista oczekuje wartości liczbowych, może korzystać z funkcji is_numeric(zmienna), która sprawdza czy zmienna jest wartością numeryczną. Po sprawdzeniu zmiennej i upewnieniu się, iż jest liczbą, można bezpiecznie użyć zmiennej w zapytaniu SQL.

    Analogicznie do addslashes(), w perlowym DBI istnieje metoda DBI::quote, która, podobnie jak addslashes() z PHP dodaje znaki backslash przed potencjalnie niebezpiecznymi znakami. Przykład (zakładając, że $sql jest referencją do obiektu DBI):

     $query = $sql->prepare("SELECT * FROM uzytkownicy where name = " . $sql->quote($uzytkownik));
    

    Bezpieczniejszą techniką, niż wyżej wymienione odpowiednie przygotowanie parametrów jest użycie mechanizmu tzw. „zaślepek”, gdzie zmienne nie są używane bezpośrednio do tworzenia zapytania, a odpowiednie dane dołączane są do zapytania w momencie jego wykonania (czy to poprzez wykorzystanie API danego silnika, czy też w ramach warstwy aplikacji poprzez odpowiednie zacytowanie wszystkich parametrów). Przykład w Perl DBI:

     $query = $sql->prepare("SELECT * FROM users WHERE name = ?");
     $query->execute($user_name);
    

    Jeżeli parametr zapytania ma być wartością liczbową można go po prostu rzutować na typ liczbowy lub użyć funkcji konwertujących z ciągu znaków na wartość liczbową:

    $id = intval($_GET['id']);
    

    Techniką utrudniającą wykorzystanie istniejących luk jest zastosowanie paradygmatu security through obscurity poprzez wyłączenie wyświetlania komunikatów o błędach. Nie uniemożliwi to ataku, lecz może spowodować, że trudniejsze będzie wykrycie i późniejsze wykorzystanie luki.

    Zabezpieczenie na poziomie bazy danych[ | edytuj kod]

    Istnieją również metody zabezpieczenia przed skutkami wykonania błędnych zapytań, które mimo wszystko dostaną się do bazy.

    Udostępnienie użytkownikowi bazy tylko niezbędnych uprawnień nie da całkowitej ochrony, jednak pozwoli na minimalizację szkód. Przykładowo – niewiele aplikacji potrzebuje uprawnienia do kasowania tabel z bazy danych. Podobny efekt – czyli zmniejszenie możliwości atakującego – uzyskać można wyłączając niepotrzebną funkcjonalność na poziomie samego silnika.

    Pomocą mogą służyć również procedury składowane, dzięki którym zapytanie budowane jest po stronie bazy danych i aplikacja nie ma bezpośredniego wpływu na jego postać, chociaż i w tym przypadku skonstruowanie ataku nie jest niemożliwe.

    Eliminację możliwości wstrzyknięcia kodu SQL, można uzyskać poprzez całkowite wyłączenie możliwości podawania parametrów jako części zapytania. Jest to działanie analogiczne do mechanizmu zaślepek po stronie aplikacji, jednak tym razem zastosowane w samym silniku. Nie jest to jednak ogólnie dostępna cecha systemów zarządzania bazami. Możliwość taką daje silnik H2.

    Zabezpieczanie na poziomie serwera aplikacji/www[ | edytuj kod]

    Możliwa jest instalacja dodatkowych modułów do serwera warstwy aplikacyjnej (np. mod_security do serwera Apache) filtrujących według zdefiniowanych reguł przychodzące żądania i blokujących te potencjalnie groźne. Reguły pozwalają na wychwycenie typowych uniwersalnych ataków lub znanych luk w popularnych aplikacjach. Wadą rozwiązania jest możliwość zablokowania także pożądanych wywołań (np. w aplikacji do zarządzania bazą danych).

    Linki zewnętrzne[ | edytuj kod]

  • SQL Injection/Insertion, Jak zapobiec włamaniu na stronę
  • Ochrona przed SQL Injection w SQL Server 2008 R2 (ang.)
  • Ochrona przed SQL Injection w ASP.NET (ang.)
  • Baza informacji o SQL Injection (ang.)




  • Reklama

    Czas generowania strony: 0.831 sek.