🎯 Wprowadzenie i odpowiedzialne użycie
SQL Injection (SQLi) to nadal jedna z najgroźniejszych podatności aplikacji webowych. Ten przewodnik przedstawia techniki SQLi w ujęciu defense‑first — najpierw jak je wykryć i zablokować, a dopiero potem, gated, przykłady payloadów do laboratoriów.
- Używaj wyłącznie w autoryzowanych testach z pisemną zgodą i jasno zdefiniowanym zakresem.
- Nie uruchamiaj payloadów w systemach produkcyjnych bez uzgodnionych okien serwisowych.
- Wszystkie sekcje z wrażliwymi ładunkami są ukryte i odblokowywane świadomie (gating).
🧭 Model zagrożeń i typy SQLi
👁️ Blind / Boolean‑based
Brak błędów w odpowiedzi; wnioskujemy na podstawie różnic w zachowaniu (TRUE/FALSE).
⏱️ Time‑based
Wstrzykiwanie opóźnień czasowych, gdy brak różnic w treści odpowiedzi.
🔗 Union‑based
Łączenie wyników atakującego z właściwym zapytaniem (UNION SELECT).
💥 Error‑based
Wykorzystanie komunikatów błędów DBMS do ekstrakcji informacji.
🔄 Second‑order
Dane złośliwe zapisane wcześniej są użyte później w innym zapytaniu.
🛡️ WAF Evasion
Omijanie filtrów WAF przez encoding, obfuskację i składnię specyficzną dla DBMS.
🔎 Wspólne metody wykrywania
- Nagłe wzrosty kodów 500/406/403 oraz długie TTFB (Time To First Byte).
- W logach WAF/serwera: wzorce typu UNION, SELECT, SLEEP, WAITFOR, nadmiar znaków ' " -- /* */.
- Anomalie w parametrach: niespodziewane znaki specjalne, nietypowe długości, wielokrotne te same parametry (HPP).
- Korelacja w SIEM: „krytyczna podatność” + „anomalia logowania/IDS” dla tego samego hosta.
- Parametryzacja zapytań (prepared statements) i whitelisty kolumn/sortowania.
- Role i uprawnienia DB zgodne z zasadą najmniejszych uprawnień.
- Standaryzacja błędów (brak stack trace dla użytkownika) i centralne logowanie.
- Testy automatyczne bezpieczeństwa w CI/CD i retesty po poprawkach.
👁️ Blind/Boolean‑based SQLi
Gdy aplikacja nie zwraca błędów i nie wyświetla danych z zapytania, różnice w zachowaniu (np. inne widoki/redirecty) ujawniają TRUE/FALSE.
- Wzorce w logach: wartości parametru różniące się pojedynczym znakiem i naprzemiennie skutkujące innymi kodami HTTP.
- Wzrost liczby żądań binarnego wyszukiwania (ASCII/SUBSTRING/LENGTH) w krótkich oknach czasu.
- Parametryzacja zapytań i logiczne whitelisty dla operatorów.
- Normalizacja danych wejściowych (canonicalization) przed walidacją.
- Limit zapytań per użytkownik/źródło + backoff (Rate Limiting).
⏰ Time‑based SQLi
Gdy brak różnic w treści odpowiedzi, czas odpowiedzi (opóźnienia) sugeruje wartość logiczną warunku.
- Anomalie w rozkładzie czasu odpowiedzi (np. wiele ~5 s lub ~10 s).
- W logach WAF/DBMS: funkcje SLEEP/WAITFOR/pg_sleep/DBMS_LOCK.SLEEP.
- Prepared statements, bez łączenia ciągów w SQL.
- WAF z polityką opóźnień adaptacyjnych i regułami dla funkcji czasowych.
- Timeouty na poziomie aplikacji i DB oraz ograniczenia złożoności zapytań.
🔄 Second‑order (stored) SQLi
Dane wstrzyknięte w jednym miejscu są użyte później w innym zapytaniu. Payload i eksploitacja są rozdzielone w czasie.
- Mapowanie przepływu danych (data flow) — które pola są zapisywane i gdzie później używane w SQL.
- Alerty na dynamicznie generowane fragmenty SQL z danymi użytkownika.
- Parametryzacja w każdym miejscu użycia danych (nie tylko przy zapisie).
- Enkodowanie kontekstowe i walidacja formatu przed użyciem.
🔗 Union‑based i 💥 Error‑based
Union‑based łączy wyniki z oryginalnym zapytaniem; Error‑based wykorzystuje komunikaty błędów DBMS do ekstrakcji.
- W treści żądań/odpowiedzi: UNION, SELECT, GROUP_CONCAT/LISTAGG, FOR XML PATH, EXTRACTVALUE/UPDATEXML.
- W logach aplikacji: wyjątki SQL, stack trace, powtarzalne błędy konwersji typów.
- Wyłącz „verbose errors” dla użytkowników; loguj szczegóły po stronie serwera.
- Whitelisting kolumn i typów, ograniczenia długości i znaków w parametrach.
- Parametryzacja + polityki DB ograniczające funkcje XML/FILE/XP_CMDSHELL (SQL Server).
🛡️ Obejścia WAF: ryzyka i obrona
Obfuskacja, encoding i składnie specyficzne dla DBMS mogą obniżać skuteczność WAF.
- WAF: reguły „anomaly scoring” zamiast pojedynczych sygnatur; korelacja z czasem odpowiedzi.
- SIEM: wykrywanie prób wieloetapowych (różne encodings, mixed‑case, komentarze, HPP).
- Łączenie WAF + RASP + parametryzacja. WAF to warstwa wsparcia, nie jedyna zapora.
- Reguły specyficzne dla aplikacji (allow‑listy) i sanityzacja na wejściu.
- Monitoring false‑negatives i regularne testy skuteczności WAF w stagingu.
🛠️ Narzędzia: bezpieczne użycie
Narzędzia automatyczne (np. sqlmap) mogą pomóc, ale łatwo przeciążyć aplikację i wygenerować FP/FN.
- Testuj w stagingu/labie; ustal limity i przerwy; dokumentuj parametry skanu.
- Uzgodnij poziom agresywności (techniques, threads, delay) i okna testowe.
🛡️ Obrona: wzorce i twardnienie
Prepared statements (PHP, Python, Java)
Hardening bazy danych
Standaryzacja błędów i logowanie
- Użytkownik otrzymuje ogólny komunikat; szczegóły trafiają do centralnego logu.
- Maskuj dane wrażliwe (PII) w logach; definiuj retencję i dostęp.
- Alerty na wzorce SQLi + korelacja z WAF/IDS.
🧪 Testy automatyczne i KPI
Testy jednostkowe bezpieczeństwa
KPI programu AppSec
- MTTR dla podatności krytycznych/wysokich (rolling 30 dni).
- Recurrence rate (ponowne wystąpienia po „fixed”).
- Coverage — % endpointów objętych testami/analizą.
- WAF FN rate — udział prób nieprzechwyconych przez WAF.
📚 Laboratoria i zasoby
- PortSwigger Web Security Academy — świetne laby SQLi (również advanced).
- DVWA / bWAPP / Mutillidae — środowiska do ćwiczeń (Docker).
- OWASP Cheat Sheet Series — SQL Injection Prevention.
- Książki: „SQL Injection Attacks and Defense”, „The Database Hacker’s Handbook”.