Ga naar hoofdinhoud

SQL Injection (Blind) — Low

Soms zijn webservers kwetsbaar voor SQL Injection, maar tonen ze niet netjes de volledige database output op je scherm zoals bij normale SQL Injection. We zijn dan "Blind".

1. Predict (Voorspel)

De server gebruikt de volgende code om op zoek te gaan naar een user ID:

$id = $_GET['id'];
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

if (mysqli_num_rows($result) > 0) {
echo "User ID exists in the database.";
} else {
echo "User ID is MISSING from the database.";
}

Vraag: Wat is het allergrootste verschil in wat jij als aanvaller op het scherm ziet vergeleken met de "normale" SQL Injection challenge?

Antwoord

Bij normale SQL Injection print de website daadwerkelijk de Voornaam en Achternaam (first_name, last_name) op je scherm uit, waardoor je met een UNION commando complete tabellen op je beeldscherm kan laten tekenen. Hier print de server alleen een vaste tekst: "Bestaat" of "Bestaat niet" (een Boolean resultaat). Er komt nooit data op je scherm! Je bent daardoor totaal blind.

2. Run & Investigate

Start het lab.

Laden...

Vul ID 1 in. Het scherm zegt "Exists". Vul ID 99 in. Het scherm zegt "Missing".

3. Modify & Make (Aanpassen & Maken)

Omdat de website nog steeds gewoon kwetsbaar is, kunnen we vragen stellen aan de database waarop het antwoord Ja of Nee is. Op basis van de reactie "Exists" (Ja) of "Missing" (Nee) van de webpagina, kunnen we stiekem data raden! Dit noemen we Boolean Based Blind SQL Injection.

Vul de volgende twee payloads in en kijk naar het resultaat: 1: 1' AND 1=1 # 2: 1' AND 1=2 #

Tip

Denk na over de SQL code: WHERE user_id = '1' AND 1=1 (1 is altijd 1) WHERE user_id = '1' AND 1=2 (1 is NOOIT 2)

Antwoord

Bij de eerste query toont het scherm "Exists". Bij de tweede toont het "Missing", omdat het tweede deel van de AND query niet waar was! Hiermee hebben we een methode ontwikkeld om elk raadsel te spelen met de server:

Voorbeeld: We willen weten of de MySQL database is gestart onder de gebruikersnaam "root". We vullen in: 1' AND user() = 'root@localhost' #

  • Zegt het scherm "Exists"? Dan weten we dat de naam 'root' is!
  • Zegt het scherm "Missing"? Dan heet de gebruiker in de database anders. We kunnen op deze manier letter voor letter de hele database inhoud raden!

4. ✓ Wat moest je zien?

Controle
  • Bij payload 1' AND 1=1 # toont het scherm "Exists" (de bewering is waar).
  • Bij payload 1' AND 1=2 # toont hetzelfde scherm "Missing" (de bewering is onwaar).
  • Géén voornaam of achternaam in beeld: blind betekent dat je alléén Ja/Nee als signaal krijgt.

Krijg je in beide gevallen hetzelfde antwoord? Dan is je # mogelijk verloren gegaan in URL-encoding. Probeer dan -- - (met spatie en streepje) als afsluiter.

5. Er gaat iets mis...

Blind SQL injection is het spelen van een spelletje "Wie Ben Ik" of "Galgje" waarbij je letter voor letter een database leegtrekt. A? nee. B? Ja. B A? nee. B O? Ja. B O B? Ja!. Je snapt dat dit handmatig doen monnikenwerk is en duizenden dagen gaat kosten. Daarom gebruiken professionele hackers (Pentesters) vrijwel altijd de tool SQLmap in Kali Linux. Deze tool vuurt per seconde 50 Yes/No raadsels op de database af en puzzelt de antwoorden volautomatisch en vliegensvlug voor je in elkaar.