Sekcje

Przejdź na skróty do treści. | Przejdź do nawigacji


Baza wiedzy Publikacje Czym jest SQL injection?

Czym jest SQL injection?

Po przeczytaniu dowiesz się

  • SQL injectionCzym jest podatność SQL injection.
  • Jakie są jej możliwe skutki.
  • W jaki sposób uzyskiwany jest nieautoryzowany dostęp do bazy danych z wykorzystaniem SQL injection.
  • Jakie są podstawowe metody ochrony przed atakami.

Tekst jest pierwszą częścią serii artykułów o podatności SQL injection.

Wstęp

Czym jest SQL injection? Chyba to jedna z najbardziej znanych i jednocześnie niebezpiecznych podatności w aplikacjach webowych (oraz niewebowych), korzystających z bazy SQL. Już sama nazwa wskazuje na rodzaj problemu - atakujący wstrzykuje do aplikacji (nieautoryzowany) fragment zapytania SQL. Wstrzyknięcie zazwyczaj możliwe jest z jednego powodu - braku odpowiedniego sprawdzenia (walidacji) parametru przekazanego przez użytkownika. Taki parametr, gdy mamy do czynienia z SQL injection, często przekazywany jest bezpośrednio do zapytania SQL. Czym to może skutkować? W zależności od sytuacji możemy mieć do czynienia z:

  • nieautoryzowanym dostępem w trybie odczytu lub zapisu do całej bazy danych,
  • możliwością ominięcia mechanizmu uwierzytelnienia,
  • możliwością odczytania wybranych plików (system operacyjny, na którym pracuje baza danych),
  • możliwością tworzenia plików w systemie operacyjnym na którym pracuje baza,
  • możliwością wykonania kodu w systemie operacyjnym (uprawnienia użytkownika na którym pracuje baza lub web serwer - w przypadku aplikacji webowych).

Przed przejściem dalej, zaznaczam że poniższe informacje podane są jedynie w celach edukacyjnych. Wszelakie ewentualne testy należy realizować jedynie na systemach, których bezpieczeństwo możemy oficjalnie sprawdzać.

Przykład praktyczny

Zobaczmy jaka jest istota podatności, na przykładzie prostej aplikacji napisanej w języku PHP, która komunikuje się z bazą danych MySQL, wyświetlając szczegóły newsa (przy okazji zaznaczam, że podatność nie jest ograniczona tylko do języka PHP czy MySQL) W normalnym użyciu wyświetlenie newsa odbywa się poprzez odwołanie do URL-a: http://192.168.0.105/news_detail.php?id=1&action=view

Aplikacja wykonuje wtedy następujące czynności (kliknij aby powiększyć):

sql - normalne zapytanie

 

Co się jednak stanie w przypadku kiedy zmodyfikujemy wartość zmiennej id ? Na przykład w ten sposób:

http://192.168.0.105/news_detail.php?id=-1 union select version(),2--&action=view

Zobaczmy (kliknij aby powiększyć):

sql injection

 

Okazuje się, że w tym przypadku można było odczytać wynik funkcji bazodanowej version() ! Na podobnej zasadzie można w tym przypadku również odczytać wybrane pliki z filesystemu:

sql - load file

 

Analogicznie, możliwe jest również pobranie danych z zupełnie innej tabeli niż oryginalna 'news'. Przykładowo - pobranie loginu oraz hasła z tabeli users:

sqli - from

Jak z kolei wyglądać może sytuacja w przypadku gdy nie mamy do czynienia ze zmienną liczbową tylko ze stringiem? Zobaczmy na przykładzie formularza logowania:

sqli auth

W tym przypadku udało się zalogować na użytkownika 'admin' nie znając jego hasła. W jaki sposób można zalogować się na innego użytkownika? Patrząc na diagram powyżej, należałoby wybrać nie pierwszego z brzegu, a kolejnego użytkownika z tabeli users:

sqli auth 1

Ochrona

Nawet w tak podstawowym tekście warto wspomnieć kilka słów o ochronie przed SQL injection. No właśnie - w jaki sposób się ochronić? Mówiąc w dużym skrócie - w odpowiedni sposób weryfikować zmienne przekazywane do użytkownika do aplikacji. W pierwszym omówionym przypadku (zmienna id) wystarczy sprawdzać czy przekazana zmienna jest liczbą. W przypadku z mechanizmem logowania sytuacja jest trochę bardziej skomplikowana - tutaj należy uniemożliwić zamknięcie przez atakującego zmiennej tekstowej znakiem ' (np. używając funkcji mysql_real_escape_string(), choć sugerowaną metodą jest stosowanie zapytań parametryzowanych).

W następnych częściach

  • Metody wykrywania podatności
  • Metody ochrony przed podatnościami
  • Możliwość dostępu do bazy w trybie zapisu
  • Możliwość wykonania kodu w systemie operacyjnym

-- Michał Sajdak (michal.sajdak@securitum.pl)

 

Przydatne informacje? Polub nas na facebooku.

Nawigacja
 
Darmowy magazyn o ITsec

zine
Subskrybuj RSS:
RSS