SQL Injection
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Z misją promowania wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa w każdej dyscyplinie.
Co to jest SQL injection?
SQL injection to luka w zabezpieczeniach, która pozwala atakującym na ingerencję w zapytania do bazy danych aplikacji. Ta podatność może umożliwić atakującym wyświetlanie, modyfikowanie lub usuwanie danych, do których nie powinni mieć dostępu, w tym informacji o innych użytkownikach lub jakichkolwiek danych, do których aplikacja ma dostęp. Takie działania mogą prowadzić do trwałych zmian w funkcjonalności lub treści aplikacji, a nawet do kompromitacji serwera lub odmowy usługi.
Wykrywanie punktu wejścia
Gdy strona wydaje się być podatna na SQL injection (SQLi) z powodu nietypowych odpowiedzi serwera na dane wejściowe związane z SQLi, pierwszym krokiem jest zrozumienie, jak wstrzykiwać dane do zapytania bez zakłócania go. Wymaga to skutecznego zidentyfikowania metody ucieczki z bieżącego kontekstu. Oto kilka przydatnych przykładów:
Następnie musisz wiedzieć, jak naprawić zapytanie, aby nie było błędów. Aby naprawić zapytanie, możesz wprowadzić dane, aby poprzednie zapytanie zaakceptowało nowe dane, lub możesz po prostu wprowadzić swoje dane i dodać symbol komentarza na końcu.
Note that if you can see error messages or you can spot differences when a query is working and when it's not this phase will be more easy.
Komentarze
Potwierdzanie za pomocą operacji logicznych
Wiarygodną metodą potwierdzenia podatności na SQL injection jest wykonanie operacji logicznej i obserwowanie oczekiwanych wyników. Na przykład, parametr GET taki jak ?username=Peter
, który zwraca identyczną treść po modyfikacji na ?username=Peter' or '1'='1
, wskazuje na podatność na SQL injection.
Podobnie, zastosowanie operacji matematycznych służy jako skuteczna technika potwierdzająca. Na przykład, jeśli dostęp do ?id=1
i ?id=2-1
daje ten sam wynik, to wskazuje na SQL injection.
Przykłady ilustrujące potwierdzenie operacji logicznych:
Ta lista słów została stworzona, aby spróbować potwierdzić SQLinjections w zaproponowany sposób:
Potwierdzanie z użyciem czasu
W niektórych przypadkach nie zauważysz żadnej zmiany na stronie, którą testujesz. Dlatego dobrym sposobem na odkrycie ślepych SQL injections jest zmuszenie bazy danych do wykonania działań, co będzie miało wpływ na czas ładowania strony. Dlatego w zapytaniu SQL dodamy operację, która zajmie dużo czasu na zakończenie:
W niektórych przypadkach funkcje sleep nie będą dozwolone. Wtedy, zamiast używać tych funkcji, możesz sprawić, że zapytanie wykona złożone operacje, które zajmą kilka sekund. Przykłady tych technik będą komentowane osobno dla każdej technologii (jeśli takie będą).
Identyfikacja Back-endu
Najlepszym sposobem na identyfikację back-endu jest próba wykonania funkcji różnych back-endów. Możesz użyć funkcji sleep z poprzedniej sekcji lub tych (tabela z payloadsallthethings:
Również, jeśli masz dostęp do wyniku zapytania, możesz wydrukować wersję bazy danych.
W kontynuacji omówimy różne metody wykorzystania różnych rodzajów SQL Injection. Użyjemy MySQL jako przykładu.
Identyfikacja z PortSwigger
Wykorzystywanie oparte na Union
Wykrywanie liczby kolumn
Jeśli możesz zobaczyć wynik zapytania, to jest to najlepszy sposób na jego wykorzystanie. Przede wszystkim musimy ustalić liczbę kolumn, które początkowe zapytanie zwraca. Dzieje się tak, ponieważ oba zapytania muszą zwracać tę samą liczbę kolumn. Do tego celu zazwyczaj stosuje się dwie metody:
Order/Group by
Aby określić liczbę kolumn w zapytaniu, stopniowo dostosowuj liczbę używaną w klauzulach ORDER BY lub GROUP BY, aż otrzymasz fałszywą odpowiedź. Mimo że GROUP BY i ORDER BY mają różne funkcjonalności w SQL, obie mogą być wykorzystywane w ten sam sposób do ustalenia liczby kolumn w zapytaniu.
UNION SELECT
Wybierz coraz więcej wartości null, aż zapytanie będzie poprawne:
You should use null
values as in some cases the type of the columns of both sides of the query must be the same and null is valid in every case.
Wyciąganie nazw baz danych, nazw tabel i nazw kolumn
W następnych przykładach zamierzamy pobrać nazwę wszystkich baz danych, nazwę tabeli w bazie danych oraz nazwy kolumn tabeli:
Każda baza danych ma inny sposób odkrywania tych danych, ale metodologia zawsze jest ta sama.
Wykorzystywanie ukrytej injekcji opartej na unii
Gdy wynik zapytania jest widoczny, ale injekcja oparta na unii wydaje się nieosiągalna, oznacza to obecność ukrytej injekcji opartej na unii. Taki scenariusz często prowadzi do sytuacji z niewidoczną injekcją. Aby przekształcić niewidoczną injekcję w opartą na unii, należy rozpoznać zapytanie wykonawcze na zapleczu.
Można to osiągnąć poprzez zastosowanie technik niewidocznej injekcji wraz z domyślnymi tabelami specyficznymi dla twojego systemu zarządzania bazą danych (DBMS). Aby zrozumieć te domyślne tabele, zaleca się zapoznanie z dokumentacją docelowego DBMS.
Gdy zapytanie zostanie wyodrębnione, konieczne jest dostosowanie ładunku, aby bezpiecznie zamknąć oryginalne zapytanie. Następnie do twojego ładunku dodawane jest zapytanie unii, co ułatwia wykorzystanie nowo dostępnej injekcji opartej na unii.
Aby uzyskać bardziej szczegółowe informacje, zapoznaj się z pełnym artykułem dostępnym pod adresem Healing Blind Injections.
Wykorzystywanie opartej na błędach
Jeśli z jakiegoś powodu nie możesz zobaczyć wyniku zapytania, ale możesz widzieć komunikaty o błędach, możesz wykorzystać te komunikaty o błędach do ekstrahowania danych z bazy danych. Podążając podobnym tokiem jak w przypadku wykorzystania opartej na unii, możesz zdołać zrzucić bazę danych.
Wykorzystywanie Blind SQLi
W tym przypadku nie możesz zobaczyć wyników zapytania ani błędów, ale możesz rozróżnić, kiedy zapytanie zwraca odpowiedź prawda lub fałsz, ponieważ na stronie są różne treści. W tym przypadku możesz wykorzystać to zachowanie, aby zrzucić bazę danych znak po znaku:
Wykorzystywanie Error Blind SQLi
To jest ten sam przypadek co wcześniej, ale zamiast rozróżniać odpowiedź prawda/fałsz z zapytania, możesz rozróżniać między błędem w zapytaniu SQL a jego brakiem (może dlatego, że serwer HTTP się zawiesza). Dlatego w tym przypadku możesz wymusić błąd SQL za każdym razem, gdy poprawnie zgadniesz znak:
Wykorzystywanie SQLi opartego na czasie
W tym przypadku nie ma sposobu na rozróżnienie odpowiedzi zapytania w oparciu o kontekst strony. Jednak możesz sprawić, że strona będzie się ładować dłużej, jeśli zgadnięty znak jest poprawny. Już wcześniej widzieliśmy tę technikę w użyciu, aby potwierdzić lukę SQLi.
Stacked Queries
Możesz użyć stacked queries, aby wykonać wiele zapytań z rzędu. Zauważ, że podczas gdy kolejne zapytania są wykonywane, wyniki nie są zwracane do aplikacji. Dlatego ta technika jest głównie użyteczna w odniesieniu do ślepych luk bezpieczeństwa, gdzie możesz użyć drugiego zapytania do wywołania zapytania DNS, błędu warunkowego lub opóźnienia czasowego.
Oracle nie obsługuje stacked queries. MySQL, Microsoft i PostgreSQL je obsługują: QUERY-1-HERE; QUERY-2-HERE
Out of band Exploitation
Jeśli żaden inny sposób eksploatacji nie zadziałał, możesz spróbować sprawić, aby baza danych wyekstrahowała informacje do zewnętrznego hosta kontrolowanego przez Ciebie. Na przykład, za pomocą zapytań DNS:
Ekstrakcja danych poza pasmem za pomocą XXE
Zautomatyzowane Wykorzystanie
Sprawdź SQLMap Cheetsheat, aby wykorzystać lukę SQLi za pomocą sqlmap.
Informacje techniczne
Omówiliśmy już wszystkie sposoby wykorzystania luki w SQL Injection. Znajdź więcej sztuczek zależnych od technologii bazy danych w tej książce:
Lub znajdziesz wiele sztuczek dotyczących: MySQL, PostgreSQL, Oracle, MSSQL, SQLite i HQL w https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Z misją promowania wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów z technologii i cyberbezpieczeństwa w każdej dziedzinie.
Ominięcie uwierzytelniania
Lista do próby ominięcia funkcji logowania:
Login bypass ListOminięcie uwierzytelniania za pomocą surowego hasha
To zapytanie pokazuje lukę, gdy MD5 jest używane z wartością true dla surowego wyjścia w kontrolach uwierzytelniania, co sprawia, że system jest podatny na SQL injection. Napastnicy mogą to wykorzystać, tworząc dane wejściowe, które, po zhashowaniu, generują nieoczekiwane części poleceń SQL, prowadząc do nieautoryzowanego dostępu.
Ominięcie uwierzytelniania za pomocą wstrzykniętego hasha
Zalecana lista:
Powinieneś używać jako nazwy użytkownika każdej linii z listy, a jako hasła zawsze: Pass1234. (Te ładunki są również zawarte w dużej liście wspomnianej na początku tej sekcji)
GBK Ominięcie uwierzytelniania
JEŚLI ' jest escapowane, możesz użyć %A8%27, a gdy ' zostanie escapowane, zostanie utworzone: 0xA80x5c0x27 (╘')
Skrypt Pythona:
Wstrzykiwanie poliglotowe (wielokontekstowe)
Insert Statement
Zmiana hasła istniejącego obiektu/użytkownika
Aby to zrobić, powinieneś spróbować utworzyć nowy obiekt nazwany "obiektem głównym" (prawdopodobnie admin w przypadku użytkowników) modyfikując coś:
Utwórz użytkownika o nazwie: AdMIn (wielkie i małe litery)
Utwórz użytkownika o nazwie: admin=
Atak Truncation SQL (gdy istnieje jakiś limit długości w nazwie użytkownika lub e-mailu) --> Utwórz użytkownika o nazwie: admin [dużo spacji] a
Atak Truncation SQL
Jeśli baza danych jest podatna, a maksymalna liczba znaków dla nazwy użytkownika wynosi na przykład 30 i chcesz podszyć się pod użytkownika admin, spróbuj utworzyć nazwę użytkownika: "admin [30 spacji] a" i dowolne hasło.
Baza danych sprawdzi, czy wprowadzona nazwa użytkownika istnieje w bazie danych. Jeśli nie, przetnie nazwę użytkownika do maksymalnej dozwolonej liczby znaków (w tym przypadku do: "admin [25 spacji]") i następnie automatycznie usunie wszystkie spacje na końcu, aktualizując w bazie danych użytkownika "admin" z nowym hasłem (może pojawić się jakiś błąd, ale to nie oznacza, że to nie zadziałało).
Więcej informacji: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref
Uwaga: Ten atak nie będzie już działał tak, jak opisano powyżej w najnowszych instalacjach MySQL. Chociaż porównania nadal ignorują białe znaki na końcu domyślnie, próba wstawienia ciągu, który jest dłuższy niż długość pola, spowoduje błąd, a wstawienie nie powiedzie się. Więcej informacji na ten temat: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation
MySQL Insert time based checking
Dodaj tyle ','',''
, ile uważasz, aby zakończyć instrukcję VALUES. Jeśli opóźnienie zostanie wykonane, masz SQLInjection.
ON DUPLICATE KEY UPDATE
Klauzula ON DUPLICATE KEY UPDATE
w MySQL jest wykorzystywana do określenia działań, które baza danych ma podjąć, gdy próba wstawienia wiersza spowoduje duplikat wartości w unikalnym indeksie lub kluczu głównym. Poniższy przykład demonstruje, jak ta funkcja może być wykorzystana do zmiany hasła konta administratora:
Example Payload Injection:
Ładunek iniekcji może być skonstruowany w następujący sposób, gdzie próbuje się wstawić dwa wiersze do tabeli users
. Pierwszy wiersz jest wabikiem, a drugi wiersz celuje w istniejący adres e-mail administratora z zamiarem zaktualizowania hasła:
Oto jak to działa:
Zapytanie próbuje wstawić dwa wiersze: jeden dla
generic_user@example.com
i drugi dlaadmin_generic@example.com
.Jeśli wiersz dla
admin_generic@example.com
już istnieje, klauzulaON DUPLICATE KEY UPDATE
uruchamia się, instruując MySQL do zaktualizowania polapassword
istniejącego wiersza na "bcrypt_hash_of_newpassword".W konsekwencji, można następnie spróbować uwierzytelnić się za pomocą
admin_generic@example.com
z hasłem odpowiadającym haszowi bcrypt ("bcrypt_hash_of_newpassword" reprezentuje hasz bcrypt nowego hasła, który powinien być zastąpiony rzeczywistym haszem pożądanego hasła).
Ekstrakcja informacji
Tworzenie 2 kont jednocześnie
Podczas próby utworzenia nowego użytkownika potrzebne są nazwa użytkownika, hasło i e-mail:
Używanie dziesiętnego lub szesnastkowego
Dzięki tej technice możesz wyodrębnić informacje, tworząc tylko 1 konto. Ważne jest, aby zauważyć, że nie musisz nic komentować.
Używając hex2dec i substr:
Aby uzyskać tekst, możesz użyć:
Używając hex i replace (oraz substr):
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Z misją promowania wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa w każdej dyscyplinie.
Routed SQL injection
Routed SQL injection to sytuacja, w której zapytanie, które można wstrzyknąć, nie jest tym, które daje wynik, ale wynik zapytania, które można wstrzyknąć, trafia do zapytania, które daje wynik. (Z dokumentu)
Przykład:
WAF Bypass
No spaces bypass
Brak spacji (%20) - bypass przy użyciu alternatyw białych znaków
No Whitespace - obejście za pomocą komentarzy
No Whitespace - obejście za pomocą nawiasów
Brak przecinków bypass
Brak przecinka - bypass przy użyciu OFFSET, FROM i JOIN
Generic Bypasses
Czarna lista używająca słów kluczowych - obejście za pomocą wielkich/małych liter
Blacklist używając słów kluczowych bez rozróżniania wielkości liter - obejście za pomocą operatora równoważnego
Obejście WAF za pomocą notacji naukowej
Możesz znaleźć bardziej szczegółowe wyjaśnienie tego triku na blogu gosecure. W zasadzie możesz użyć notacji naukowej w niespodziewany sposób, aby obejść WAF:
Ominięcie Ograniczenia Nazw Kolumn
Przede wszystkim zauważ, że jeśli oryginalne zapytanie i tabela, z której chcesz wyodrębnić flagę, mają tę samą liczbę kolumn, możesz po prostu użyć: 0 UNION SELECT * FROM flag
Możliwe jest uzyskanie dostępu do trzeciej kolumny tabeli bez użycia jej nazwy za pomocą zapytania takiego jak: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
, więc w przypadku sqlinjection wyglądałoby to tak:
Lub używając comma bypass:
To sztuczka została zaczerpnięta z https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/
Narzędzia do omijania WAF
Inne przewodniki
Lista wykrywania Brute-Force
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Z misją promowania wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa w każdej dyscyplinie.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated