Menu
About me Kontakt

Jakub 'unknow' Mrugalski (UW-TEAM.org) discusses SQL Injection today, which aims to extract secret data from a database. The exercise authored by Kacper Szurek explores an interesting method of using the 'order by' parameter to retrieve the password for user Kacper. It is important to note that during this exercise, the use of UNION is prohibited, which adds an extra layer of challenge for the tester. Kacper has created a test environment where various attack attempts can be tested, which is a crucial step in learning about security techniques.

The main starting point is an SQL query in the form of 'SELECT id, content FROM post ORDER BY'. By changing the 'order' parameter, Kacper demonstrates how different sorting results can provide information about the columns available in the database. At this stage, users can learn how testers check which columns are successful and use faulty queries to identify the columns that may be accessible. This is an important aspect of security analysis.

Kacper then introduces the CASE WHEN condition, which resembles the IF construction in SQL, to manipulate the sorting. This allows for conditional checking of whether the user exists in the 'users' table. In this way, the tester can further explore whether the login 'Kacper' is present. This enables the tester to probe whether the password meets certain criteria, such as whether the password length exceeds a set number of characters. Kacper uses this method to sequentially test various password lengths, obtaining information about its structure.

Additionally, Kacper shows how to use the LIKE operator to check if specific letters are present in the password. This opens the door to further analysis and guessing where specific letters might be located. Techniques such as the underscore (_) in SQL, which replace a single character, allow Kacper to effectively analyze the positions of letters in the password. This method ultimately allows him to precisely identify the password, showcasing the power of SQL Injection in the context of security.

Finally, Jakub highlights the interactivity of Kacper's educational materials. He encourages viewers to register for Kacper's upcoming webinar, where participants can deepen their understanding of SQL Injection attacks. At the time of writing, this video has 4434 views and 256 likes, indicating a strong interest in the topic. Students eager to learn these techniques will find valuable insights and practical tips in Kacper's upcoming materials. Subscribing to the channel and keeping up with new security-related videos is definitely worth it.

Toggle timeline summary

  • 00:00 Introduction to SQL Injection.
  • 00:02 Overview of a task by Kacper Szurka on SQL Injection.
  • 00:06 Discussing how to extract secret data using SQL Injection.
  • 00:14 Warning against using UNION in the task.
  • 00:19 Explaining a test environment prepared by Kacper.
  • 00:22 Objective to extract a password for user Kacper.
  • 00:34 Demonstrating an original SQL query structure.
  • 00:45 Sorting content alphabetically by AJX.
  • 01:04 Attempting incorrect column names to test the system.
  • 01:11 Viewing the number of columns being retrieved.
  • 01:39 Explaining an Out of Range error while sorting.
  • 02:00 Highlighting limitations on visible columns and data extraction.
  • 02:16 Concluding that passwords can't be displayed on the screen.
  • 02:23 Introducing the CASE WHEN SQL statement for manipulation.
  • 02:45 Demonstrating the IF equivalent using CASE.
  • 03:09 Testing sorting conditions based on SQL query.
  • 03:34 Incorporating a SELECT statement to check user existence.
  • 04:13 Verifying if the user Kacper exists in the database.
  • 04:21 Checking the existence of another user, Batman.
  • 04:32 Testing the length of the password to confirm it's valid.
  • 05:35 Using LIKE to check for specific characters in the password.
  • 07:01 Describing the method to extract the password character by character.
  • 07:11 Promoting Kacper's webinar for further learning.
  • 07:22 Encouragement to subscribe and conclude the video.

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