SQL-Injection 101
Denne hackerteknik går ud på at en hacker får sneget skadelig SQL-kode ind i en applikation. Som regel er det en webapplikation, men det kunne ligeså godt være noget andet, blot der er en SQL database nedenunder.
Et eksempel: En bruger skal logge sig ind på et system, og angiver brugernavn og password. Disse tjekkes efterfølgende imod databasen med noget som kunne se sådan ud (i PHP):
$SQL = "SELECT * FROM brugere WHERE loginNavn='" . $_POST["loginNavn"] . "' AND password='" . $_POST["loginNavn"] . "'";
Hvis jeg er en lovlig bruger af systemet, så ville det med mine oplysninger indtastet kunne se sådan her ud:
$SQL = "SELECT * FROM brugere WHERE loginNavn='nielle' AND password='Wh65b02fc'";
- men hvis jeg nu var en hackertype, som ville skaffe mig adgang til systemet, så kunne jeg i stedet for finde på at skrive:
hacker' OR 1=1; --
- i navnefeltet. Når dette indsættes i SQL-sætningen, kommer den til at se sådan her ud:
$SQL = "SELECT * FROM brugere WHERE loginNavn='hacker' OR 1=1;--' AND password='suckers'";
SQL bruger ;-tegnet til at adskille SQL-sætninger, og ovenstående er derfor 2 SQL-kommandoer:
SELECT * FROM brugere WHERE loginNavn='hacker' OR 1=1;
--' AND password='suckers'
Sekvensen ”--” er en af måderne at angive at noget er en kommentar, så den sidste sætning kan vi se bort fra.
Men den første... Den vil skaffe hackeren adgang til systemet til trods for at vedkommende ikke har et lovligt login.
Ovenstående er et simpelt eksempel på hvad man kan gøre med SQL-injection, og der er mange andre muligheder. Der er også langt mere sofistikerede angreb end det beskrevne.
Sikkerhedshullet opstår fordi at en hacker kan få lov til at indsætte et '-tegn uden at der efterfølgende gøres noget ved dette. Et '-tegn er ikke i sig selv et ulovligt tegn, og det kan forekomme i helt normale situationer. Men da '-tegnet også bruges til at omgive tekststrenge, må der under alle omstændigheder tages forbehold imod situationer som denne:
$SQL = "SELECT * FROM brugere WHERE loginNavn='Byens' Pizza' AND password='PeberoniNr9'";
Hvis et '-tegn skal indgå i selve teksten, skal det escapes:
$SQL = "SELECT * FROM brugere WHERE loginNavn='Byens'' Pizza' AND password='PeberoniNr9'";
Man bør derfor altid efterbehandle input udefra, ved f.eks. at replace enkelt ’-tegn med 2 '-tegn. På den måde, så har man dels gjort sin applikation mere tolerant mht. hvilke loginnavne folk kan vælge, og man har desuden beskyttet sig mod de mest basale SQL-injection angreb.
Særligt i forbindelse med PHP bør man i øvrigt lige sætte sig ind i ”magic quotes” og se hvad disse gør ved dine '-tegn. Læs mere om emnet her:
http://myplace.dk/articles/stripslashes/Det ovenstående har kun lige skrabet emnet, og der er mange flere ting som man bør vide om emnet. Heldigvis kan man jo altid google på SQL-injection (ca. 1.300.000 hits :^)