SQL Injection — High
Op het hoge niveau probeert de applicatie je aanval af te weren door het invulveld op een compleet andere pagina te zetten.
1. Predict (Voorspel)
Wanneer je op "Click here to change your ID" klikt, opent een pop-up. Je vult daar je ID in. De server slaat dit op in een sessie-variabele: $_SESSION['id'] = $id;.
Vervolgens keer je terug naar de originele pagina en voert de applicatie de volgende query uit:
$id = $_SESSION[ 'id' ];
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
Vraag: Waarom dacht de ontwikkelaar dat dit veiliger was, en heeft hij/zij gelijk?
Antwoord
De ontwikkelaar dacht: "Als het invoerveld niet op dezelfde pagina staat als de database-query, kunnen hackers vast geen geautomatiseerde tools (zoals SQLmap) gebruiken om de pagina aan te vallen." Dit is echter 'Security by Obscurity' (verstoppertje spelen). De code plakt $id uiteindelijk nog stééds ongefilterd in de SQL query. De kwetsbaarheid is dus niet opgelost!
2. Run & Investigate
Start het lab:
Klik op de link om je ID aan te passen. Je zult zien dat de pop-up verschijnt (in de DVWA simulatie werkt dit mogelijk iets anders dan op de fysieke Kali machine, maar het principe blijft gelijk).
3. Modify & Make (Aanpassen & Maken)
Jouw opdracht: voer de SQL Injection opnieuw uit. Let op het woordje LIMIT 1 aan het eind van de SQL query uit de Predict-fase. Dit zorgt ervoor dat de database normaal gesproken maar maximaal 1 resultaat mag teruggeven.
Hoe breek je uit en negeer je die LIMIT?
Tip
Je moet het commando zo manipuleren dat je éérst uitbreekt met ', dan je OR plaatst, en vervolgens de rest van het commando (inclusief de LIMIT 1) weg-commentarieert zodat de database het negeert.
Antwoord
In SQL kun je commentaar starten met een hekje (#) of dubbele streep (-- ).
Vul in het formulier in: 1' OR '1'='1' #
Hierdoor wordt de query: SELECT ... WHERE user_id = '1' OR '1'='1' #' LIMIT 1;. Alles na het hekje wordt genegeerd!
4. ✓ Wat moest je zien?
- Meer dan één gebruiker in de uitvoer, ondanks de
LIMIT 1clausule in de query. - Geen SQL-syntaxfout — als je vergeet de rest weg te commentariëren, breekt de query op het overgebleven
'. - De broncode (knop Bekijk broncode) eindigt daadwerkelijk op
LIMIT 1— bevestig dat dit niet onverklaarbaar weggaat.
Zie je maar één gebruiker? Dan is je # of -- waarschijnlijk geconsumeerd door URL-encoding. Probeer dan 1' OR '1'='1' -- - (let op de spatie en de extra streep).