SQL Injection – jak działa, jak się przed nim chronić, i jak wygląda atak
🧨 SQL Injection – jak działa, jak się przed nim chronić, i jak wygląda atak
SQL Injection (wstrzykiwanie kodu SQL) to technika ataku na aplikacje internetowe, która pozwala napastnikowi manipulować zapytaniami do bazy danych. Źle zabezpieczone formularze, pola wyszukiwania czy adresy URL mogą dać dostęp do całych baz danych – bez potrzeby uwierzytelniania.
🔍 Na czym polega SQL Injection?
SQL Injection występuje, gdy dane wprowadzone przez użytkownika są bezpośrednio „wstrzykiwane” do zapytania SQL bez odpowiedniego oczyszczenia lub przygotowania. Jeśli aplikacja nie filtruje poprawnie danych wejściowych, atakujący może dodać własne instrukcje SQL.
🧪 Przykład klasycznego ataku
Przykład kodu PHP:
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
Dane wpisane przez atakującego:
Username: ' OR '1'='1
Password: ' OR '1'='1
Efektywne zapytanie SQL:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1'
Efekt? Logowanie bez hasła.

🧠 Rodzaje SQL Injection
| Typ | Opis |
|---|---|
| Classic (In-Band) | Wyniki zapytania są zwracane bezpośrednio do przeglądarki (np. wyświetlenie tabeli z danymi). |
| Blind (Ślepe) | Aplikacja nie wyświetla błędów ani danych, ale zachowanie aplikacji się zmienia (np. opóźnienia, inne odpowiedzi HTTP). |
| Out-of-Band | Dane są przesyłane do atakującego innym kanałem (np. żądaniem HTTP, DNS). |
| Second-Order | Kod SQL nie jest wykonywany natychmiast – złośliwe dane są zapisywane i wykorzystane później, np. przez inny moduł. |
🎯 Co może osiągnąć atakujący?
- 🔓 Pobranie danych użytkowników (w tym haseł)
- ✏️ Modyfikacja, usunięcie lub dodanie rekordów
- 🛠️ Przejęcie kontroli nad bazą danych
- 🔥 Eskalacja do systemu operacyjnego (np. za pomocą
xp_cmdshellw MSSQL) - 🎣 Zbieranie danych osobowych – zgodnie z RODO może grozić firmie grzywną
🛡️ Jak się chronić przed SQL Injection?
🔒 Zabezpieczenia dla programistów:
- ✅ Używaj prepared statements (przygotowanych zapytań)
- W PHP:
PDOlubmysqlizbind_param() - W Pythonie:
sqlite3,psycopg2z placeholderami
- W PHP:
- ✅ Waliduj i filtruj dane wejściowe
- ✅ Stosuj ORM-y (np. SQLAlchemy, Hibernate) – utrudniają bezpośrednie manipulacje SQL-em
- ✅ Ogranicz uprawnienia kont bazy danych – nie dawaj aplikacji dostępu
ROOT/DBA - ✅ Rejestruj nieudane próby i analizuj logi
- ✅ Maskuj szczegóły błędów SQL w środowisku produkcyjnym
🔍 Zabezpieczenia na poziomie infrastruktury:
- 🔐 Firewall aplikacji webowej (WAF) – np. ModSecurity, Cloudflare
- 🕵️♂️ Monitorowanie zapytań do bazy i wykrywanie anomalii
- 🔒 Segmentacja sieci – baza danych w oddzielnej podsieci
- 📉 Ograniczenia liczby zapytań (rate limiting)
🔧 Narzędzia do testów i ataków (pentesting)
- sqlmap – automatyczne narzędzie do wykrywania i eksploatacji SQLi
- Havij – GUI do SQL Injection (często wykorzystywany przez początkujących)
- Burp Suite – przechwytywanie żądań i testowanie podatności
- Nmap + NSE – skanowanie i testowanie serwerów SQL
💡 Przykład SQL Injection typu Blind
Jeśli aplikacja nie pokazuje błędów SQL, można użyć techniki warunkowej:
SELECT * FROM users WHERE id = 1 AND SUBSTRING((SELECT password FROM users LIMIT 1),1,1) = 'a'
Jeśli aplikacja zachowa się inaczej (np. wyświetli dane lub nie), można iteracyjnie odczytać hasło znak po znaku.
🏁 Podsumowanie
SQL Injection pozostaje jednym z największych zagrożeń dla aplikacji webowych, mimo że jego podstawowe mechanizmy są znane od lat. Dlaczego? Bo błędy wynikają z niedbalstwa i niewystarczającej edukacji. Każdy zespół tworzący oprogramowanie powinien traktować bezpieczeństwo danych jako priorytet.






