Om uit te leggen wat sql-injectie is, is enige kennis van programmeertalen nodig. Programmeertalen maken gebruik van strings - simpel gezegd: een verzameling karakters in een bepaalde volgorde. Strings die veranderd kunnen worden, worden variabelen genoemd.
Veel ontwikkelaars maken gebruik van variabele strings om database-opdrachten samen te stellen. Daardoor kan zo'n opdracht dynamisch worden aangepast, bijvoorbeeld als een gebruiker een bepaalde pagina wil opvragen. Voor een inlogsysteem waarbij gebruikersnaam en wachtwoord moeten worden gecontroleerd, zou je bijvoorbeeld de volgende serie opdrachten kunnen gebruiken:
Een normale gebruiker vult gewoon zijn gebruikersnaam en wachtwoord in om in te loggen. In de eerste twee statements wordt uitgelezen wat deze gebruiker heeft ingevoerd. In de derde opdracht (die hier voor de leesbaarheid op twee regels staat) wordt, aan de hand van de invoer, een string met een sql-opdracht samengesteld. De laatste twee opdrachten voeren deze query uit en controleren of de invoer het gewenste resultaat oplevert.
Een kwaadwillende gebruiker doet het anders. Stel dat die kwaadwillende gebruiker wil inloggen met de username 'Joost', dan hoeft hij in het loginveld enkel Joost' --
in te voeren om MySQL om de tuin te leiden. Dat is een sql-injectie.
Het invoerveld $username
is namelijk bedoeld voor pure data, maar door de apostrof toe te voegen, worden de twee koppeltekens door MySQL geïnterpreteerd als een deel van de opdracht, om precies te zijn: "dit is het einde van de opdracht; negeer de rest van de regel." Het gedeelte van de opdracht waarin wordt gecontroleerd of het wachtwoord bij deze user correct is opgegeven, wordt zo overgeslagen. Als we aannemen dat er maar één username 'Joost' is - en dat wordt vrijwel altijd door de database afgedwongen - bevestigt de laatste opdracht uit het codeblok altijd dat naam en wachtwoord bij elkaar horen. Het wachtwoord is dan echter niet daadwerkelijk gecontroleerd.
Er kunnen natuurlijk ook andere opdrachten aan de query worden toegevoegd. Via sql-injectie kunnen zo complete databases worden geplunderd of gemanipuleerd. Dat is geen theoretisch probleem: het gebeurt dagelijks. Het misbruiken van sql-injectie is simpeler dan op het eerste gezicht lijkt, want er zijn kant-en-klare tools die het zware werk doen.
Bij die tools zijn het invoeren van een url en een paar drukken op de knop voldoende: de software gaat dan op zoek naar kwetsbaarheden en, indien aanwezig, slurpt deze desgewenst de hele database leeg. De effectiviteit verschilt van geval tot geval, maar over het algemeen geldt: als een website lek is, is het gebruiken van deze software kinderlijk eenvoudig.
Cross site scripting
Cross site scripting - vaak afgekort tot xss - is een vergelijkbaar probleem, dat opduikt wanneer user-input wordt verwerkt in de html-output. Een simpel voorbeeld is bij slecht gebouwde zoekmachines te zien. Als een gebruiker daar <script>alert('hoi');</script>
als zoekterm invoert, wordt er niet op die term gezocht, maar wordt het javascript uitgevoerd: er verschijnt een pop-up.
Een kwaadwillende kan een url zo opstellen dat een argeloze gebruiker die erop klikt, ongewild een script laat uitvoeren. Dat script heeft dan toegang tot alle gegevens waar die gebruiker toegang toe heeft. Zo kunnen bijvoorbeeld cookies worden gestolen. Soms kunnen ook variabelen worden gebruikt die aan andere gebruikers worden getoond. Als een forum bijvoorbeeld niet goed is beveiligd, kan een kwaadwillende een script in een posting opnemen, maar ook bijvoorbeeld in zijn username.
Xss kan ook worden misbruikt om beveiligingsproblemen in browsers te misbruiken, bijvoorbeeld door een Flash- of javascript-kwetsbaarheid te injecteren. Vooral input die aan andere gebruikers wordt getoond is daarvoor gevoelig.