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ć.

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.
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.
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.
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 = 1LIMIT 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.
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ć.
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 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.
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:
- SQLMap – http://sqlmap.org/
- Wstrzyknięcie jSQL – https://www.kali.org/tools/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ć 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.
Powyższe narzędzie można wykorzystać do oceny podatności witryny internetowej lub aplikacji.








