Ga naar hoofdinhoud

SQL Injection โ€” Medium

De ontwikkelaar probeert ons in de weg te zitten door het tekstvak te veranderen in een vast dropdown-menu en beveiligingsfuncties toe te voegen.

1. Predict (Voorspel)โ€‹

De code is aangepast. De input wordt nu beveiligd met mysqli_real_escape_string(), een functie die aanhalingstekens onschadelijk maakt. Bovendien ziet de query er nu zo uit:

$id = $_POST[ 'id' ];
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";

Vraag: Vergelijk deze query met die van het Low level. Zie je het verschil? Is de escape-functie hier nog nuttig?

Antwoord

Het cruciale verschil: $id staat nu niet meer tussen aanhalingstekens in de query.

Bij Low: WHERE user_id = '$id' โ€” aanhalingstekens aanwezig, escape functie zinvol. Bij Medium: WHERE user_id = $id โ€” geen aanhalingstekens, escape functie doet niets.

Omdat we geen aanhalingstekens hoeven te 'ontsnappen', werkt de escape-functie hier niet als bescherming. De kwetsbaarheid zit nu op een andere plek.

2. Run (Uitvoeren)โ€‹

Start het lab en bekijk wat er veranderd is.

Laden...

Je ziet dat het tekstvak is vervangen door een dropdown-menu. Probeer een paar opties te selecteren en observeer de output.

3. Investigate (Onderzoeken)โ€‹

Open de Developer Tools met F12 en bekijk de HTML van het dropdown-menu.

Vraag: Wat staat er in het value-attribuut van de <option>-elementen? Wat wordt er precies naar de server gestuurd als je een optie selecteert โ€” de zichtbare tekst of de value?

Antwoord

Elk <option>-element heeft een value="1", value="2" enzovoort. Het is altijd de value die naar de server wordt verstuurd, nooit de zichtbare tekst tussen de tags.

Dat betekent: als jij de value in de HTML aanpast via F12 vรณรณrdat je op Submit klikt, stuur je een andere waarde naar de server โ€” ook al ziet de dropdown er normaal uit.

Klik nu met de rechtermuisknop op het dropdown-element โ†’ Inspecteren. Zoek een <option>-tag en dubbelklik op de value.

4. Modify & Make (Aanpassen & Maken)โ€‹

Je weet nu dat je de value van een <option> kunt aanpassen via F12. Jouw doel: pas de value zo aan dat de server alle gebruikers teruggeeft.

Denk aan de query: WHERE user_id = $id โ€” geen aanhalingstekens. Welke waarde voor $id maakt de conditie altijd waar?

Tip

Zonder aanhalingstekens heb je ook geen aanhalingstekens nodig om te 'ontsnappen'. Een wiskundige OR-conditie die altijd klopt, volstaat. Pas de value van รฉรฉn <option> aan in F12, selecteer die optie en klik Submit.

Antwoord

Verander in F12 de HTML naar: <option value="1 OR 1=1">1</option>. Selecteer die optie en klik op Submit.

De server voert dan uit: WHERE user_id = 1 OR 1=1 โ€” altijd waar, alle gebruikers worden teruggegeven.

5. โœ“ Wat moest je zien?โ€‹

Controle
  • Er verschijnt een lijst met alle 5 gebruikers in de database.
  • Je hebt de value van een <option> aangepast via F12 โ€” zonder aanhalingstekens in de payload.
  • De escape-functie had geen effect omdat de query geen aanhalingstekens gebruikte.

Zie je maar รฉรฉn gebruiker? Controleer of je het value-attribuut (niet de zichtbare tekst tussen de tags) hebt aangepast in de HTML.

6. Er gaat iets mis...โ€‹

Wat als je in F12 typt: <option value="1 OR 1=1">1 OR 1=1</option> en je ziet ineens een lege pagina of de request mislukt? Soms verwacht het web-framework dat parameters van een dropdown een strikt type hebben. Hoewel je de zichtbare tekst (tussen de tags) kunt veranderen, is het รกltijd de value="..." (het attribuut) dat naar de server wordt verstuurd. Zorg dus dat je het juiste aanpast.