Bezpieczeństwo, jak każdy wie, jest bardzo ważne. Tworzymy systemy informatyczne coraz bardziej rozbudowane i przechowujące jeszcze więcej danych. W ostatnich latach niestety znacznie częściej słyszymy o wyciekach poufnych informacji.

Najpopularniejszym atakiem na bazy danych jest SQL Injection. Polega on na dodaniu złośliwego kodu do wysyłanego zapytania. Pokażę go na przykładzie logowania się do aplikacji.

Gdy chcemy się zalogować, zazwyczaj wysyłane jest do bazy danych poniższe zapytanie. Bez dobrego zabezpieczenia zawartość formularza zostaje wstawiona bezpośrednio do zapytania.

SELECT Id FROM Users WHERE Login = 'mój login' AND Password = 'tajne hasło'

Logowanie bez znajomości hasła

W SQLu w pierwszej kolejności wykonuje się OR, później AND. Zatem możemy zrobić tak, aby pytanie o hasło zawsze zwracało prawdę. Czyli rozbudowujemy zapytanie. Skoro nikt nie zabezpieczył formularza, możemy podać puste hasło, a następnie dopisać coś, co zawsze zwróci prawdę, np. 1=1 – to zawsze jest prawdą, a przynajmniej w SQLu. 🙂

SQL Injection logowanie bez znajomości hasła

Podając dane jak na powyższym rysunku, zapytanie logujące użytkownika wygląda w ten sposób:

SELECT Id FROM Users WHERE Login = 'mój login' AND Password = '' OR '1'='1'

Zachwianie stabilności systemu

Poza samym logowaniem, możemy przeprowadzić atak SQL Injection, dodając bardziej szkodliwe kawałki kodu, np. usunąć bazę danych Users. Wiele projektów baz ma taką tabelę, ponieważ prawie każdy większy system opiera się o użytkowników.

SQL Injection drop table

Dwa myślniki na końcu oznaczają komentarz, zatem wszystko, co będzie wysłane w dalszej części nie zostanie wykonane – w szczególności apostrof kończący zapytanie do logowania. Tak prezentuje się pełne zapytanie do bazy danych:

SELECT Id FROM Users WHERE Login = 'mój login' AND Password = ''; DROP TABLE Users --'

Zabawnym przykładem jest ten ze zdjęcia. Kiedyś słyszałem, że w podobny sposób kilkukrotnie zaatakowano system sczytujący tablice rejestracyjne. Atak zakończył się sukcesem i w dodatku był powtórzony wielokrotnie, zanim zostało wprowadzone zabezpieczenie.

SQL Injection samochód

Aplikacje tworzone w technologiach Microsoftu działają na serwerze IIS. Jeśli baza danych otrzyma odpowiednie uprawnienia do systemu operacyjnego, będziemy mogli przeprowadzić atak SQL Injection i w poniższy sposób zatrzymać IISa. Teraz wyobraź sobie zrobić coś takiego w banku: przestają działać wszystkie strony internetowe, łącznie z tymi w oddziałach i służące do administracji, serwisy do obsługi bankomatów oraz wiele zabezpieczeń. Skoro prawie nic nie działa, to znacznie łatwiej włamać się do bazy danych i wykraść dane klientów.

SELECT Id FROM Users WHERE Login = 'mój login' AND Password = ''; exec master..xp_cmdshell 'iisreset /stop' --

Zabezpieczenie przed SQL Injection

ochrona przed SQL InjectionPrzed SQL Injection najprościej zabezpieczyć się prostą zamianą pojedynczego apostrofu na podwójny we wszystkich wartościach uzupełnianych przez użytkownika. Programiści często wykorzystują też narzędzia ORM do obsługi bazy danych (w dużym uproszczeniu – służą do generowania zapytań, zamiast pisania ich ręcznie). Mają one już wbudowane mechanizmy zabezpieczeń.

Jeszcze jedną metodą, bardzo często stosowaną są procedury składowane. Zamyka się w nich zapytania i zamiast składać go w kodzie, to przesyłamy tylko parametry podane przez użytkownika. O resztę zadba baza danych.

Dołącz do newslettera już dziś!
Zero spamu - tylko wartościowe treści!
Musisz już lecieć?
Zostaw swój adres e-mail i dołącz do BEZPŁATNYCH WEBINARÓW dotyczących SQLa!
  • „Jak uczyć się SQLa?” – 4 października
  • „SQL dla testerów” – 12 października