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.
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
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
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
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ć
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 — ]
- 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.
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ą
- SQLMap – http://sqlmap.org/
- Wstrzykiwanie JSQL – https://tools.kali.org/vulnerability-analysis/jsql
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
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.