Menu
O mnie Kontakt

Jakub 'unknow' Mrugalski (UW-TEAM.org) dziś omawia technikę SQL Injection, której celem jest wydobycie tajnych danych z bazy danych. W zadaniu autorstwa Kacpra Szurka, widzimy ciekawy sposób wykorzystania parametru 'order by' do wyciągnięcia hasła dla użytkownika Kacper. Warto zaznaczyć, że podczas tego ćwiczenia, nie wolno używać UNION, co stanowi dodatkowe wyzwanie dla penetrującego. Kacper stworzył testowe środowisko, w którym można sprawdzić działanie różnych prób ataku, co stanowi ważny krok w nauce technik bezpieczeństwa.

Głównym punktem wyjścia jest zapytanie SQL, które ma formę 'SELECT id, content FROM post ORDER BY'. W momencie zmiany parametru 'order', Kacper pokazuje, jak można zaobserwować różne wyniki sortowania, co dostarcza informacji o kolumnach dostępnych w bazie. Na tym etapie, użytkownicy mogą dowiedzieć się, jak penetrujący sprawdzają, jakie kolumny są pomyślne i wykorzystują błędne zapytania, aby zidentyfikować, jakie kolumny mogą być dostępne. To ważny element analizy bezpieczeństwa.

Kacper następnie wprowadza warunek CASE WHEN, który przypomina konstrukcję IF w SQL, aby manipulować sortowaniem. Dzięki temu, możliwe jest warunkowe sprawdzenie, czy dany użytkownik istnieje w tabeli 'users'. W ten sposób, można wykryć, czy login 'Kacper' jest obecny. Umożliwia to penetrującemu dalsze eksplorowanie, czy hasło spełnia określone kryteria, na przykład, czy długość hasła jest większa niż określona liczba znaków. Kacper przy użyciu tej metody kolejno testuje różne długości hasła, uzyskując informacje o jego strukturze.

Dodatkowo, Kacper pokazuje, jak można wykorzystać operator LIKE do sprawdzenia, czy w haśle znajdują się konkretne znaki. To otwiera drzwi do dalszej analizy i zgadywania, gdzie konkretne litery mogą się znajdować. Techniki jak podłoga (_) w SQL, które zastępują jeden dowolny znak, pozwalają Kacprowi efektywnie analizować pozycje liter w hasle. Ta metoda pozwala mu w końcu dokładnie określić hasło, co pokazuje potęgę SQL Injection w kontekście zabezpieczeń.

Na koniec, Jakub zwraca uwagę na interaktywność materiałów edukacyjnych Kacpra. Zachęca do zapisania się na nadchodzący webinar, gdzie uczestnicy mogą pogłębić swoją wiedzę w zakresie ataków SQL Injection. Obecnie film ten ma 4434 wyświetlenia oraz 256 polubień, co wskazuje na dużą zainteresowanie tematem. Uczniowie, którzy chcą poznać te techniki, znajdą wiele cennych informacji i praktycznych wskazówek w nadchodzących materiałach Kacpra. Zdecydowanie warto subskrybować kanał i śledzić nowe wideo dotyczące bezpieczeństwa.

Toggle timeline summary

  • 00:00 Wprowadzenie do SQL Injection.
  • 00:02 Przegląd zadania Kacpra Szurki na temat SQL Injection.
  • 00:06 Omówienie sposobów ekstrakcji tajnych danych za pomocą SQL Injection.
  • 00:14 Ostrzeżenie przed używaniem UNION w zadaniu.
  • 00:19 Wyjaśnienie środowiska testowego przygotowanego przez Kacpra.
  • 00:22 Cel ekstrakcji hasła dla użytkownika Kacper.
  • 00:34 Demonstrowanie oryginalnej struktury zapytania SQL.
  • 00:45 Sortowanie treści alfabetycznie według AJX.
  • 01:04 Próba użycia niepoprawnych nazw kolumn w celu przetestowania systemu.
  • 01:11 Wyświetlanie liczby pobieranych kolumn.
  • 01:39 Wyjaśnienie błędu 'Out of Range' podczas sortowania.
  • 02:00 Podkreślenie ograniczeń dotyczących widocznych kolumn i ekstrakcji danych.
  • 02:16 Stwierdzenie, że hasła nie mogą być wyświetlane na ekranie.
  • 02:23 Wprowadzenie do instrukcji SQL CASE WHEN do manipulacji.
  • 02:45 Demonstrowanie równoważnika IF przy użyciu CASE.
  • 03:09 Testowanie warunków sortowania na podstawie zapytania SQL.
  • 03:34 Włączenie zapytania SELECT w celu sprawdzenia istnienia użytkownika.
  • 04:13 Weryfikacja, czy użytkownik Kacper istnieje w bazie danych.
  • 04:21 Sprawdzanie istnienia innego użytkownika, Batmana.
  • 04:32 Testowanie długości hasła, aby potwierdzić, że jest ważne.
  • 05:35 Użycie LIKE do sprawdzenia specyficznych znaków w haśle.
  • 07:01 Opis metody ekstrakcji hasła znak po znaku.
  • 07:11 Promowanie webinaru Kacpra w celu dalszej nauki.
  • 07:22 Zachęta do subskrypcji i zakończenie wideo.

Transcription

Cześć, pohakujemy dzisiaj trochę. Czas na SQL Injection. Na grupie od 0 do Pentestera pojawiło się takie zadanie, autorstwa Kacper Szurka. Czy jesteś w stanie za pomocą SQL Injection wyciągnąć tajne dane z bazy, gdy punkt szyknięcia nie jest w polach, nie jest w wewe, ale w order by. Ale uwaga, nie wolno ci użyć UNI. Kacper przygotował nawet takie środowisko testowe, gdzie możemy sprawdzić, czy nasze pomysły działają, czy też nie. Zadanie polega na tym, aby wyciągnąć hasło dla użytkownika Kacper. Mamy tu punkt szyknięcia, czyli w parametrze order. Mamy tutaj np. sortowanie po kontencie. Zapytanie oryginalne wygląda w ten sposób. Select id content from post, order by i to coś, co podaliśmy tutaj. Gdy klikam uruchom, pojawia mi się oczywiście tutaj posortowane coś po naszym kontencie, czyli tutaj ajx alfabetycznie. Gdy zmienię tutaj order np. na id, to kolejność powinna się zmienić. Już nie będzie 3, 1, 2, a będzie 1, 2, 3, czyli wszystko działa. Taka rzecz, którą często robi penteser na początku, to próbuje wysypać ten system, czyli wpisuje jakieś błędne dane. Klikam uruchom i widzę tutaj, że nie ma takiej kolumny, która nazywa się w ten sposób. No dobra, możemy też policzyć sobie, ile tych kolumn realnie jest. Widzimy, że Kacper wyciąga dwie kolumny, id oraz content. No to posortuj po kolumnie pierwszej, czyli posortuj po id. Widzimy, że są posortowane po id, 1, 2, 3. Teraz posortuj po kolumnie drugiej. Daję uruchom i już jest ajx, czyli alfabetycznie po tytule. A teraz posortuj po kolumnie trzeciej. I widzimy, że no nie poszło zgodnie z planem. Konkretniej mówiąc dostaliśmy błąd out of range. Wyszliśmy poza zakres. Komunikat mówi nam, że nasza wartość powinna być między 1 a 2. Ten komunikat jest trochę zbyt wylewny. Z MySQL albo Postgres nie spotkasz się z takim komunikatem. Więc jest to jakaś inna baza danych. Stawiałbym sobie pewnie jakiś SQLite. No dobra, teraz na czym polega tutaj gigantyczny problem? Możemy wyrzucić na ekran tylko te dwie kolumny, id oraz content. Moglibyśmy w normalnym świecie za pomocą UNI napełnić te dwa pola tajnymi danymi, czyli na przykład naszym hasłem, które jest wymagane. Możlibyśmy to pobrać i wrzucić jako content na przykład. Ale nie wolno nam UNI używać. Wniosek z tego prosty. Nigdy nie zobaczymy hasła na ekranie. Jak więc wyciągnąć hasło, gdy się go nie da zobaczyć? Da się to zrobić. Aby to osiągnąć, teraz ci pokażę coś. Otwieram notatnik i pokażę ci taką instrukcję, która nazywa się case when. Case when. I tutaj dajemy na przykład 1 równa się 1. Czyli jeśli 1 równa się 1 i tu dajemy co się ma stać, jeśli to jest prawda, czyli zwróć 1 na przykład. Else zwróć 2. End. Koniec warunku. I tak zbudowany warunek to jest po prostu zwyczajny if. Takiego ifa można użyć wewnątrz naszego ordera. Daję tutaj, wklejam w to miejsce. I tutaj, żeby było bardziej czytelnie, napiszę tak. Jeśli 1 równa się 1, wtedy sortuj po idku. W przeciwnym wypadku sortuj po kontencie. Sprawdzamy teraz. I zostało posortowane po idku. Dobra, damy teraz tutaj fałsz. 1 równa się 2. Pytanie brzmi, czy to działa. I posortowane jest tutaj po ajx, czyli alfabetycznie. Świetnie, tylko teraz pytanie brzmi, i co ci to daje? No na razie niewiele. Ale mogę tutaj w ramach tego warunku dać jakiegoś selekta. I ten selekt to będzie na przykład select1 from. I teraz z jakiej tabelki? Kacper podpowiada, że to musi być z tabelki users. W tym miejscu jest users, więc dam sobie from users. From users, where login równa się. I tu wpisuję sobie Kacper. I teraz, jeśli to coś będzie równe 1, wtedy sortuj po idku. Jeśli nie będzie równe 1, to sortuj po alfabecie. Czyli mówiąc krótko, sprawdzamy, czy w tej tabelce istnieje użytkownik Kacper. Klikam na uruchom i posortowane po idku 1, 2, 3. To znaczy, że taki użytkownik istnieje. A czy jest tam użytkownik Batman? Klikamy uruchom i odpowiedź brzmi 3, 1, 2. Co znaczy nie, nie ma tam Batmana. Dobra, wracamy do Kacpera. Chcielibyśmy teraz dowiedzieć się, czy na przykład nasze hasło ma więcej niż jeden znak. Możemy length użyć, pole pass. Skąd znam nazwę pool? No Kacper mi to podał. Dajemy sobie tutaj enda, czyli sprawdzamy sobie, czy login również jest Kacper i długość hasła jest większa od 1 na przykład. Klikam na uruchom i jest posortowane 1, 2, 3, czyli odpowiedź brzmi tak. Czy długość hasła jest większa od 5? Sprawdzam sobie. Jak najbardziej jest dłuższa niż 5. Czy jest większa niż 10? Odpowiedź brzmi nie, 3, 1, 2. No to w takim razie, czy jest dłuższa niż 8? I tak po kolei możemy sobie sprawdzać. Odpowiedź brzmi tak. Możemy też znak równości. Czy może hasło po prostu ma 10 znaków? Tak, hasło jest dziesięcioznakowe. Świetnie. To możemy teraz like'iem sprawdzać sobie, czy są tam jakieś ciekawe znaki na przykład. End pass, like i damy sobie tutaj procenty, czyli czy hasło w ogóle zawiera jakieś znaki. To oczywiście nam zwróci prawdę. Wszystko się zgadza. I teraz między tymi procentami doklejam sobie literę A. Czy hasło gdzieś w środku ma literę A? Tak. Czy ma literę P? Tak. No dobra. I teraz chodzi o to, że musimy tutaj zgadywać sobie, na której pozycji jest ta litera. Sprawdzam sobie na przykład, czy hasło zaczyna się na literę P. Tak. Czy w takim razie litera A występuje na drugiej pozycji? Mamy tutaj 3, 1, 2, więc no nie, nie występuje. Ale litera A gdzieś jest. Więc co robimy? Daję tutaj literę P na początku, a następnie tak zwane podłogi, underskory. Chodzi o to, że ten znak podłogi zastępuje jeden dowolny znak w SQL-u. No i teraz muszę sobie zgadywać, gdzie jest litera A. Czy litera A jest tutaj? Nie. Czy litera A na przykład jest na końcu? Tak. No i w ten sposób mogę zgadywać, gdzie to mniej więcej jest, literka po literce. Tak samo mogę sprawdzić sobie cyfry. Czy na przykład w środku naszego zapytania występuje piątka? No nie występuje. Czy występuje jedynka? Występuje. I znając, jakie litery są, znając, na których pozycjach to jest podane, możemy litera po literce wyciągać odpowiednie znaki. I w ten sposób poznamy nasze hasło. Jest ono tylko dziesięcioliterowe, więc wyciągnięcie tego nie będzie jakoś szczególnie trudne. Jeżeli chcesz się nauczyć tego rodzaju ataków w bardziej taki skondensowany sposób, to przypominam, że Kacper ma coś takiego jak swój webinar. Niebawem go prowadzi, więc możesz się zapisać. Linka do webinaru masz pod tym filmem. Zapraszam i do zobaczenia w kolejnym filmie. A jeśli jesteś tu nowy, to koniecznie subskrybuj. Do zobaczenia. Cześć. Napisy stworzone przez społeczność Amara.org