encyklopedia.space

SQL Injection

SQL Injection (czasami określany jako SQLi) to technika ataku na aplikacje internetowe, w której atakujący wstrzykuje własny kod języka SQL do zapytań wysyłanych do bazy danych. Celem jest manipulacja danymi, odczyt poufnych informacji, modyfikacja lub usunięcie rekordów oraz, w niektórych przypadkach, uzyskanie pełnego dostępu do systemu.

Historia

Po raz pierwszy udokumentowano podatność na wstrzykiwanie SQL w 1998 roku w raporcie amerykańskiej firmy Microsoft. Od tego czasu technika stała się jedną z najczęściej wykorzystywanych w praktyce ataków na web-aplikacje. W 2000 roku organizacja OWASP włączyła SQL Injection do swojego słynnego Top 10 zagrożeń bezpieczeństwa aplikacji.

Mechanizm działania

SQL Injection polega na wstrzyknięciu złośliwego kodu do parametrów zapytania, które nie zostały odpowiednio zweryfikowane lub sparametryzowane. Przykładowe scenariusze:

  • Wprowadzanie danych w formularzu logowania, gdzie zapytanie jest konstruowane jako łańcuch znaków:
  • SELECT * FROM users WHERE username = 'UserInput' AND password = 'UserPass';
  • Podanie w polu username wartości ' OR '1'='1 spowoduje, że warunek WHERE zawsze będzie prawdziwy, a zapytanie zwróci wszystkie rekordy.

Rodzaje ataków SQL Injection

Wyróżnia się kilka typów ataków, różniących się metodą wstrzykiwania i celem:

In-band SQLi
Najbardziej powszechny typ, w którym atakujący otrzymuje wyniki ataku w tej samej komunikacji, co zapytanie (np. error‑based lub union‑based).
Inferential (Blind) SQLi
Wyniki nie są bezpośrednio zwracane; atakujący dedukuje informacje na podstawie zachowania aplikacji (np. boolean‑based lub time‑based).
Out-of-band SQLi
Wykorzystuje mechanizmy bazodanowe (np. xp_cmdshell, UTL_HTTP) do przesyłania danych na zewnętrzny serwer kontrolowany przez atakującego.

Skutki ataku

Skutki SQL Injection mogą być bardzo poważne:

  • Ujawnienie danych osobowych, kredytowych lub medycznych.
  • Usunięcie lub zmiana danych, co prowadzi do utraty integralności systemu.
  • Wykonanie poleceń systemowych (np. przy użyciu xp_cmdshell w Microsoft SQL Server).
  • Przejście na wyższy poziom uprawnień i przejęcie kontroli nad serwerem.

Metody ochrony

Zapobieganie atakom SQL Injection opiera się na kilku podstawowych zasadach:

  1. Używanie zapytań parametryzowanych (ang. prepared statements) w językach takich jak PHP, Java, C# czy Python. Przykład w PHP:
    $stmt = $pdo->prepare('SELECT * FROM users WHERE username = :user AND password = :pass');
    $stmt->execute(['user' => $user, 'pass' => $pass]);
  2. Walidacja i sanitacja danych wejściowych – ograniczanie dopuszczalnych znaków, sprawdzanie typów i długości.
  3. Używanie ORM‑ów (Object‑Relational Mapping), które automatycznie generują bezpieczne zapytania.
  4. Ograniczenie uprawnień konta bazy danych – aplikacja powinna działać na koncie z minimalnym zakresem niezbędnym do realizacji swoich zadań.
  5. Regularne skanowanie i testy penetracyjne – narzędzia takie jak OWASP ZAP czy SQLMap pomagają wykrywać podatności.

Wykrywanie i reagowanie

W praktyce stosuje się dwa główne podejścia:

  • Monitoring logów – analiza zapytań wychodzących i błędów bazy danych pod kątem podejrzanych wzorców.
  • Systemy wykrywania włamań (IDS) – reguły dedykowane wykrywaniu charakterystycznych ciągów takich jak ' OR 1=1--.

Przykłady znanych incydentów

W historii bezpieczeństwa internetowego odnotowano liczne przypadki sukcesów ataków SQL Injection, m.in.:

  • Atak na serwis Yahoo! w 2000 roku, w wyniku którego wyciekły dane milionów użytkowników.
  • Włamanie do serwisu Heartland Payment Systems w 2008 roku, skutkujące kradzieżą ponad 130 milionów rekordów kart płatniczych.
  • Wyciek danych z serwisu TalkTalk w 2015 roku, gdzie atakujący wykorzystali podatność SQLi do uzyskania nieautoryzowanego dostępu do systemu.

Zobacz także

Cross‑Site Scripting (XSS) | Cross‑Site Request Forgery (CSRF) | Bezpieczeństwo aplikacji | OWASP Top Ten | Testy penetracyjne