SQL Injection – rodzaj ataku na bazy danych

SQL Injection to rodzaj ataku na bazy danych, który wykorzystuje lukę w zabezpieczeniach aplikacji internetowej. Aplikacja ta komunikuje się z bazą danych przy pomocy języka SQL. Niewłaściwie zabezpieczona aplikacja umożliwia atakującemu dostęp do bazy danych poprzez wprowadzenie danych wejściowych np. w formularzu lub komentarzu. Dane umieszczone w takim polu tekstowym zapisywane są w bazie danych, dzięki czemu umieszczenie złośliwego fragmentu kodu jest niezwykle proste. W gruncie rzeczy atakujący próbuje wstrzyknąć złośliwe zapytanie SQL do bazy danych, w celu uzyskania dostępu do poufnych informacji, modyfikacji danych lub uszkodzenia bazy danych. Chociaż nie jest to żaden malware, taki atak webowy może być równie groźny dla organizacji. Aby zrozumieć jak działa SQL Injection i jak wygląda złośliwe zapytanie, ważne jest zrozumienie podstaw języka SQL.

Poniżej wypunktowane są cztery główne zapytania, przy pomocy których operujemy informacjami zapisanych w tabelach:

  • SELECT – podstawowa komenda do odczytywania danych
  • INSERT – komenda służąca do wprowadzania wszelkich danych
  • UPDATE – komenda do aktualizacji danych np. zmieniania rekordów w tabelach
  • DELETE – komenda służąca do usuwania wszelkich danych

Język SQL jest mocno rozbudowany i tworząc zapytania korzystamy oczywiście z większej ilości komend niż powyższe cztery. Warto zatem wspomnieć o podstawowych elementach zapytań SQL:

  • FROM – komenda, która określa z jakiej tabeli bądź tabel baza danych ma pobierać dane,
SELECT * FROM pracownicy;

Powyższe zapytanie wybierze wszystkie kolumny z tabeli pracownicy

  • WHERE – komenda do filtrowania wyników zapytania na podstawie określonych warunków. Przy jej pomocy użytkownik odczytuje rekordy spełniające dane kryteria,
SELECT * FROM pracownicy WHERE wiek > 40;

Zapytanie to wybierze wszystkie kolumny z tabeli pracownicy, w których wiek jest wyższy niż 40

  • AND – komenda ta jest operatorem logicznym, który umożliwia łączenie warunków w jednym zapytaniu.
SELECT * FROM pracownicy WHERE wiek > 40 AND płeć = mężczyzna;

Powyższe zapytanie wybierze wszystkie kolumny z tabeli pracownicy, w których parametr wiek jest wyższy niż 40 a płeć skategoryzowana jako mężczyzna.

Jak działa SQL Injection?

Skoro poznaliśmy odrobinę podstawy języka SQL możemy przejść do przykładów związanych z samym atakiem. Struktura komendy w większości przypadków będzie o wiele bardziej złożona i skomplikowana, ale najważniejsze, że znamy już zamysł i zasadę działania SQL. W tym artykule nie będziemy zagłębiać się w skomplikowany kod i skorzystamy z prostszego przykładu.

Załóżmy, że jesteśmy właścicielami prostej aplikacji internetowej, zawierającej formularz logowania. Dane logowania są weryfikowane w bazie danych za pomocą zapytania SQL. Poniżej znajduje się przykład zapytania SQL w języku PHP:

$username = $_POST['username']; 
$password = $_POST['password']; 
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";

Atakujący może wykorzystać lukę w aplikacji przeprowadzając atak SQL Injection poprzez wprowadzenie złośliwych danych w polu username. Wystarczy wprowadzić następujące dane:

' OR '1'='1

Po tak zwanym wstrzyknięciu tych danych do pola username, zapytanie SQL wygląda jak poniżej:

SELECT * FROM users WHERE username='' OR '1'='1' AND password='$password'
Takie zapytanie zadziała, ponieważ ’ OR '1’=’1′ to złośliwy fragment, którego warunek `’1’=’1′jest zawsze prawdziwy. Oznacza to, że całe zapytanie SQL jest prawdziwe. W taki sposób atakujący uzyskuje dostęp do wszystkich rekordów w tabeli użytkowników, pomijając jednocześnie poprawną autoryzację.

Jak bronić się przed SQL Injection?

Deweloperzy projektujący aplikacje internetowe musza wprowadzić odpowiednie zabezpieczenia aby chronić system przed atakami SQL Injection, Cross Site Scripting i innymi. W przypadku wstrzykiwania kodu SQL w pierwszej kolejności należy korzystać z parametryzowanych zapytań SQL. Korzystając z parametrów, dane wejściowe traktowane są dosłownie jako dane a nie część zapytania. Warto również ograniczyć uprawnienia użytkownikom, którzy nie potrzebują dostępu do bazy danych i pozostałych narzędzi. Warto rozważyć również IPS/IDS lub zakup zapory sieciowej przeznaczonej na aplikacje (WAF – Web Application Firewall). Zapora pomoże w wykrywaniu wszelkich ataków webowych i zablokuje złośliwe próby dostępu do bazy danych.

1 Komentarz. Zostaw nowy

Web Application Firewall - zapora dla aplikacji internetowych - SC Blog
22/09/2023 14:05

[…] zabezpieczona aplikacja zawiera luki, które atakujący z łatwością może wykorzystać atakiem SQL Injection, Cross Site Scripting (XSS) i wieloma innymi. Warto zatem skorzystać z dodatkowej warstwy ochrony […]