diff --git a/src/pentesting-web/sql-injection/sqlmap.md b/src/pentesting-web/sql-injection/sqlmap.md index e68366e59..735177647 100644 --- a/src/pentesting-web/sql-injection/sqlmap.md +++ b/src/pentesting-web/sql-injection/sqlmap.md @@ -21,6 +21,23 @@ --auth-cred="" #HTTP authentication credentials (name:password) --proxy=PROXY ``` +### Flagi technik (`--technique`) + +Argument `--technique` definiuje, które metody SQL injection sqlmap będzie próbować. Każda litera w ciągu reprezentuje technikę: + +| Litera | Technika | Opis | +| ------ | --------- | ----------- | +| B | Boolean-based blind | Używa warunków prawda/fałsz do wnioskowania danych | +| E | Error-based | Wykorzystuje szczegółowe komunikaty o błędach DBMS do eksfiltracji wyników | +| U | UNION query | Wstrzykuje instrukcje `UNION SELECT`, aby pobrać dane przez ten sam kanał | +| S | Stacked queries | Dodaje dodatkowe instrukcje oddzielone `;` | +| T | Time-based blind | Opiera się na opóźnieniach (`SLEEP`, `WAITFOR`), aby wykryć wstrzyknięcie | +| Q | Inline / out-of-band | Używa funkcji takich jak `LOAD_FILE()` lub kanałów OOB, takich jak DNS | + +Domyślna kolejność to `BEUSTQ`. Możesz je przestawić lub ograniczyć, np. tylko Boolean i Time-based w tej kolejności: +```bash +sqlmap -u "http://target/?id=1" --technique="BT" --batch +``` ### Pobierz informacje #### Wewnętrzne @@ -31,7 +48,7 @@ --users #Get usernames od DB --passwords #Get passwords of users in DB ``` -#### DB data +#### Dane DB ```bash --all #Retrieve everything --dump #Dump DBMS database table entries @@ -117,51 +134,54 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch ``` | Tamper | Opis | | :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- | -| apostrophemask.py | Zastępuje znak apostrofu jego pełnowymiarowym odpowiednikiem UTF-8 | +| 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 | +| 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 niezakodowane w danym ładunku w formacie unicode-url \(nie przetwarzając już zakodowanych\). "%u0022" | -| charunicodeescape.py | Koduje znaki niezakodowane w danym ładunku w formacie unicode-url \(nie przetwarzając już zakodowanych\). "\u0022" | +| 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' | +| escapequotes.py | Używa znaku ukośnika do ucieczki z cytatów \(' i "\) | +| greatest.py | Zastępuje operator większy niż \('>'\) z 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 | +| 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\) | +| 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 zatarcia w logach 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'\) | +| sp_password.py | Dodaje 'sp_password' na końcu ładunku w celu automatycznego zatarcia w logach 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 krzyżyka \('\#'\) po którym następuje losowy ciąg i nowa linia \('\n'\) | | space2morehash.py | Zastępuje znak spacji \(' '\) znakiem krzyżyka \('\#'\) 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 | +| space2mssqlblank.py | Zastępuje znak spacji \(' '\) losowym znakiem pustym z ważnego zestawu alternatywnych znaków | | space2mssqlhash.py | Zastępuje znak spacji \(' '\) znakiem krzyżyka \('\#'\) po którym następuje nowa linia \('\n'\) | -| space2mysqlblank.py | Zastępuje znak spacji \(' '\) losowym znakiem pustym z ważnego zestawu alternatywnych znaków | +| 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 | +| 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\) | +| 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' | +| 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' | +| xforwardedfor.py | Dodaje fałszywy nagłówek HTTP 'X-Forwarded-For' | + +## References +- [SQLMap: Testing SQL Database Vulnerabilities](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/sql-injection/sqlmap/README.md b/src/pentesting-web/sql-injection/sqlmap/README.md index aa4ada6f2..b56cceb20 100644 --- a/src/pentesting-web/sql-injection/sqlmap/README.md +++ b/src/pentesting-web/sql-injection/sqlmap/README.md @@ -23,6 +23,23 @@ --proxy=http://127.0.0.1:8080 --union-char "GsFRts2" #Help sqlmap identify union SQLi techniques with a weird union char ``` +### Flagi technik (`--technique`) + +Opcja `--technique` pozwala na ograniczenie lub zmianę kolejności technik SQL injection, które sqlmap będzie testować. Każda litera odpowiada innej klasie ładunków: + +| Litera | Technika | Opis | +| ------ | --------- | ----------- | +| B | Boolean-based blind | Używa warunków prawda/fałsz w odpowiedzi strony, aby wywnioskować wyniki | +| E | Error-based | Wykorzystuje szczegółowe komunikaty o błędach DBMS do wydobywania danych | +| U | UNION query | Wstrzykuje instrukcje `UNION SELECT`, aby pobrać dane przez ten sam kanał | +| S | Stacked queries | Dodaje dodatkowe instrukcje oddzielone przez ogranicznik SQL (`;`) | +| T | Time-based blind | Opiera się na opóźnieniach `SLEEP/WAITFOR`, aby wykryć warunki podatne na wstrzyknięcie | +| Q | Inline / out-of-band | Wykorzystuje funkcje takie jak `LOAD_FILE()` lub eksfiltrację DNS do wydobywania danych | + +Domyślna kolejność, którą sqlmap będzie stosować, to `BEUSTQ` (wszystkie techniki). Możesz zmienić zarówno kolejność, jak i podzbiór. Na przykład, następujące polecenie **tylko** spróbuje technik UNION query i Time-based blind, próbując najpierw UNION: +```bash +sqlmap -u "http://target.tld/page.php?id=1" --technique="UT" --batch +``` ### Pobierz informacje #### Wewnętrzne @@ -34,7 +51,7 @@ --passwords #Get passwords of users in DB --privileges #Get privileges ``` -#### DB data +#### Dane DB ```bash --all #Retrieve everything --dump #Dump DBMS database table entries @@ -43,17 +60,17 @@ --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. +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 podpowiedzi, 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 +Przechwyć żądanie i utwórz plik req.txt. ```bash sqlmap -r req.txt --current-user ``` -### Wstrzykiwanie Żądania GET +### Wstrzykiwanie żądania GET ```bash sqlmap -u "http://example.com/?id=1" -p id sqlmap -u "http://example.com/?id=*" -p id @@ -80,13 +97,13 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*" ```bash --string="string_showed_when_TRUE" ``` -### Technika wykrywania +### Dodaj technikę 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**: +**Sqlmap** pozwala na użycie `-e` lub `--eval`, aby przetworzyć każdy ładunek przed wysłaniem go z użyciem 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 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 ``` @@ -150,46 +167,49 @@ Pamiętaj, że **możesz stworzyć własny tamper w pythonie** i jest to bardzo | 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) | +| chardoubleencode.py | Podwójnie koduje 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" | +| charunicodeencode.py | Koduje znaki unicode w formacie URL w danym ładunku (nie przetwarzając już zakodowanych). "%u0022" | +| charunicodeescape.py | Koduje znaki unicode w formacie URL 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' | +| 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 | +| 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 | +| 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 | +| 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 | +| sp_password.py | Dodaje 'sp_password' na końcu ładunku w celu automatycznego zatarcia w logach 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') | +| space2hash.py | Zastępuje znak spacji (' ') znakiem krzyża ('#') po którym następuje losowy ciąg i nowa linia ('\n') | +| space2morehash.py | Zastępuje znak spacji (' ') znakiem krzyża ('#') 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') | +| space2mssqlhash.py | Zastępuje znak spacji (' ') znakiem krzyża ('#') 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 ('+') | +| 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 plusa ('+') | | 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' | +| 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' | +## References +- [SQLMap: Testing SQL Database Vulnerabilities](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/) + {{#include ../../../banners/hacktricks-training.md}}