Samouczek dotyczący wstrzykiwania SQL: nauka na przykładzie

⚡ Inteligentne podsumowanie

SQL injection to atak polegający na zatruwaniu dynamicznych instrukcji SQL w celu ominięcia uwierzytelniania lub ujawnienia danych, wykorzystujący aplikacje internetowe, które tworzą zapytania na podstawie niesprawdzonych danych wprowadzanych przez użytkownika. Ta strona pokazuje, jak działa ten atak i jak mu zapobiegać.

  • 💉 Definicja: Atak typu SQL injection polega na wstawieniu złośliwego kodu SQL do zapytania za pomocą niezweryfikowanego pola wejściowego.
  • 🔓 Wpływ: Skuteczny atak może ominąć logowanie i odczytać, zmodyfikować lub usunąć rekordy.
  • 🧪 Przykład: Warunek zawsze prawdziwy wraz z komentarzem zamieniają sprawdzenie logowania w obejście.
  • 🛠️. Narzędzia: SQLMap i jSQL automatyzują wykrywanie i wykorzystywanie parametrów możliwych do wstrzyknięcia.
  • 🛡️ Zapobieganie: Lukę tę eliminują parametryzowane zapytania, walidacja danych wejściowych i konta o najmniejszych uprawnieniach.
  • 🤖 Nowoczesna krawędź: Skanery i zapory sieciowe oparte na sztucznej inteligencji wykrywają wzorce ataków, których nie wykrywają stałe sygnatury.

Samouczek dotyczący wstrzykiwania kodu SQL

Co to jest zastrzyk SQL?

SQL Injection to atak polegający na zatruwaniu dynamicznych instrukcji SQL w celu zakomentowania określonych fragmentów instrukcji lub dodania warunku, który zawsze będzie prawdziwy. Wykorzystuje on błędy projektowe w źle zaprojektowanych aplikacjach 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ą wykorzystywane przez organizacje do pozyskiwania danych od klientów. SQL to akronim od Structured Query LanguageSłuży do pobierania i przetwarzania danych w bazie danych.

Schemat ilustrujący sposób, w jaki atak SQL injection manipuluje dynamicznym zapytaniem do bazy danych

Jak działa atak SQL Injection?

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

Przykład wstrzykiwania SQL

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

<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ę zapisywania sesji logowania w pliku cookie. Wywnioskowaliśmy to z pola wyboru „Remember_me”. Do przesyłania danych używa metody post. Oznacza to, że wartości nie są wyświetlane w pliku cookie. URL.

Załóżmy, że polecenie w zapleczu sprawdzające identyfikator użytkownika wygląda następująco.

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

TUTAJ,

  • Powyższe polecenie używa wartości tablicy $_POST[] bezpośrednio, bez ich oczyszczania.
  • Hasło jest hashowane przy użyciu algorytmu MD5.

Zilustrujemy atak typu SQL injection, używając SQL Fiddle. Otworzyć URL http://sqlfiddle.com/ w przeglądarce internetowej. Wyświetli się następujące okno.

Uwaga: będziesz musiał napisać polecenia SQL.

pusty SQL Fiddle okno gotowe na schemat i zapytanie

Krok 1) Wprowadź ten kod w lewym panelu.

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ę Zbuduj schemat.

Krok 3) Wprowadź ten kod w prawym panelu.

select * from users;

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

SQL Fiddle wynik pokazujący pojedynczy zwrócony rekord użytkownika

Załóżmy, że użytkownik poda admin@admin.sys i hasło 1234. Polecenie wykonane na bazie danych wyglądałoby następująco:

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

Powyższy kod można wykorzystać, dodając komentarz do hasła i dodając warunek, który zawsze będzie spełniony. Załóżmy, że atakujący wprowadzi następujący kod 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 ciąg znaków cudzysłowu.
  • 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ższe polecenie SQL i wklej je w SQL Fiddle Uruchom pole tekstowe SQL, jak pokazano poniżej.

SQL Fiddle zwrócenie rekordu po uruchomieniu wstrzykiwanego warunku

Aktywność hakerska: SQL Inject do aplikacji internetowej

Mamy prostą aplikację internetową pod adresem http://www.techpanda.org/ Jest on 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 adresu e-mail. Oznacza to, że powyższego kodu nie można użyć do ominięcia logowania.

Aby to obejść, wykorzystujemy pole hasła. Poniższy diagram pokazuje, jak postępować.

Schemat blokowy kroków wstrzykiwania pola hasła do formularza logowania

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 — ]

Formularz logowania z ciągiem wstrzykiwanym wpisanym w polu hasła

  • Kliknij przycisk Prześlij.
  • Zostaniesz przekierowany do pulpitu nawigacyjnego.

Wygenerowane polecenie 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 sposób generowania oświadczenia.

Podział sposobu generowania wstrzykiwanego polecenia SQL

TUTAJ,

  • Oświadczenie to zakłada, że ​​stosowane jest szyfrowanie md5.
  • Uzupełnia pojedynczy cudzysłów i nawias zamykający.
  • Dodaje do stwierdzenia warunek, który zawsze będzie prawdziwy.

Ogólnie rzecz biorąc, skuteczny atak łączy w sobie kilka technik, podobnych do tych pokazanych powyżej.

Inne typy ataków typu SQL Injection

Ataki typu SQL Injection mogą wyrządzić więcej szkód niż tylko ominięcie algorytmów 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. Daje ona jedynie pojęcie o tym, co może spowodować atak SQL Injection.

Narzędzia do automatyzacji wstrzykiwania SQL

W powyższym przykładzie zastosowaliśmy ręczne techniki ataku oparte na naszej rozległej wiedzy o SQL. Istnieją zautomatyzowane narzędzia, które mogą pomóc w przeprowadzeniu ataków wydajniej i w najkrótszym możliwym czasie. Należą do nich:

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ć danym wprowadzanym przez użytkownika – Przed użyciem w dynamicznych poleceniach SQL należy je zawsze oczyścić.
  • Procedury składowane – mogą one zawierać instrukcje SQL i traktować wszystkie dane wejściowe jako parametry.
  • Przygotowane oświadczenia – przygotowane instrukcje działają poprzez utworzenie najpierw instrukcji SQL, a następnie traktowanie wszystkich przesłanych danych użytkownika jako parametrów. Nie ma to wpływu na składnię instrukcji SQL.
  • Wyrażenia regularne – można ich używać do wykrywania potencjalnie szkodliwego kodu i usuwania go przed wykonaniem instrukcji SQL.
  • Prawa dostępu użytkownika do połączenia z bazą danych – konta, z których korzystasz, powinny mieć przyznane tylko 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ąpiły 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 wykorzystamy program Havij Advanced SQL Injection do skanowania witryny w poszukiwaniu luk w zabezpieczeniach.

Uwaga: Havij jest przestarzały i niekonserwowany Windows narzędzie — SQLMap powyżej jest aktualnym standardem open source.

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

Poniższy obraz przedstawia główne okno Havij.

Główne okno narzędzia Havij SQL injection

Powyższe narzędzie można wykorzystać do oceny podatności witryny internetowej lub aplikacji.

FAQ

Tylko za pisemną zgodą właściciela witryny. Testowanie aplikacji, której nie jesteś właścicielem, jest nielegalne na mocy przepisów takich jak amerykańska ustawa o oszustwach komputerowych i nadużyciach. Zakresy nagród za błędy określają, co jest dozwolone.

Tak. W rankingu OWASP Top 10:2025, wstrzyknięcie zajmuje A05 miejsce, a testy nadal wykrywają wstrzyknięcie w niemal każdej aplikacji. Z tysiącami nowych luk w zabezpieczeniach SQL injection rocznie, pozostaje to wiodącym zagrożeniem internetowym.

MD5 to szybki hash, a nie szyfrowanie, a atakujący łamią go szybko za pomocą tablic tęczowych i procesorów graficznych. Zamiast tego do haseł należy używać powolnego algorytmu z solą, takiego jak bcrypt lub Argon2.

Każda baza danych przeszukiwana za pomocą dynamicznie tworzonego kodu SQL — MySQL, PostgreSQL, Microsoft SQL Server, Oracle, SQLiteWada leży w sposobie, w jaki aplikacja łączy dane wprowadzane przez użytkownika w zapytania, a nie w silniku bazy danych.

Zapory sieciowe i skanery oparte na sztucznej inteligencji uczą się normalnych wzorców ruchu, a następnie w czasie rzeczywistym sygnalizują anomalie, takie jak wstrzyknięte warunki lub komentarze. Modele uczenia maszynowego wychwytują zaciemnione ładunki, których nie wykrywają stałe sygnatury.

Asystenci AI, tacy jak Drugi pilot GitHub Mogą sugerować sparametryzowane zapytania i walidację danych wejściowych, ale jednocześnie odtwarzają niebezpieczne wzorce. Traktuj każdą sugestię jako wersję roboczą i połącz ją z linterem bezpieczeństwa oraz przeglądem.

Atak typu SQL injection polega na wstrzyknięciu kodu SQL do bazy danych poprzez zapytania po stronie serwera. Atak typu cross-site scripting polega na wstrzyknięciu skryptów uruchamianych w przeglądarkach innych użytkowników. Jeden z nich ujawnia dane, drugi przechwytuje sesje.

ORM (maper obiektowo-relacyjny) domyślnie tworzy zapytania z obiektów kodu z parametryzacją, zapobiegając większości ataków SQL injection. Nie jest to jednak rozwiązanie niezawodne — surowe zapytania i niebezpieczne metody nadal przeciekają, więc walidacja nadal ma znaczenie.

Podsumuj ten post następująco: