Spring til indhold

SQL injection

Fra Wikipedia, den frie encyklopædi

SQL injection (fra engelsk at indskyde) er et angreb rettet mod databaselaget i en applikation, ved at indskyde fjendtlig SQL kode i et SQL-kald. Angrebet udnytter en sårbarhed i håndteringen af brugerinput og databasekald. Hvis brugerens input ikke renses for specielle tegn og sætninger, kan applikationens databasekald blive manipuleret til at få en anden effekt end den ønskede. Dette kunne eksempelvis være uautoriseret administratoradgang til en websted.

SQL injection-angreb er ofte rettet mod hjemmesider med HTML-formularer, men kan rettes mod alle applikationer der har brugerinput og databasefunktionalitet.

I operationelle miljøer, er det blevet bemærket at applikationerne gennemsnitligt oplevede 71 angrebsforsøg i timen. Under angreb har nogen applikationer undertiden været oppe i et niveau, hvor de har oplevet 800-1300 angreb i timen. SQL injection tilskrives i øvrigt 83% af succesfulde hackerrelaterede brud på datasikkerheden[1].

Eksempel på et SQL injection angreb

[redigér | rediger kildetekst]

Antag at der eksisterer en simpel HTML-formular med to inputfelter;

  • brugernavn
  • kodeord

Dette kunne eksempelvis være en login-formular til en hjemmeside.

Det indtastede fra disse felter hentes ind i variabler i serverside-miljøet, i dette eksempel defineret til PHP variablerne, henholdsvis $bruger og $kodeord.

Derefter anvendes variablerne i et databasekald til at validere det indtastede brugernavn og password op mod en tabel i databasen. Denne validering foretages vha. et SQL-kald, som kunne se ud som følger:

SELECT bruger_id FROM bruger_database WHERE brugernavn='$bruger' AND kodeord='$kodeord' ;

Under normal brug, vil kaldet returnere bruger_id, givet en bruger blev fundet i bruger_database tabellen. Hvis en ondsindet bruger derimod taster følgende ind i bruger feltet:

' or 1=1 ; --

vil SQL-kaldet se ud som følger:

SELECT bruger_id FROM bruger_database WHERE bruger=' ' or 1=1 ; --' and kodeord='$kodeord' ;

Alt hvad der står efter -- ignoreres, og tilbage står således:

SELECT bruger_id FROM bruger_database WHERE bruger=' ' or 1=1 ;

Dette kald vil returnere brugerid'et på den første og bedste bruger i databasen (ofte administratoren), og den ondsindede bruger vil dermed skabe sig adgang.

Dette eksempel er kun et ud af mange typer af SQL injection. Den ondsindede bruger kunne også forsøge at slette tabeller eller databaser, afsløre brugernavne og kodeord eller andet.


Sikring mod SQL injection

[redigér | rediger kildetekst]

Der er flere forhold, en udvikler kan tage for at undgå at blive offer for et SQL injection-angreb. Først og fremmest bør ALT input renses for visse tegn. Visse specialtegn bør enten filtreres helt fra, eller konverteres (escapes), så de ikke behandles aktivt, men bliver gemt, som det tegn de repræsenterer.

For at begrænse et eventuelt angreb, er det desuden også vigtigt, at den bruger, der er forbundet til databasen, ikke har flere rettigheder end nødvendigt. Et login-script som det i eksemplet, behøver for eksempel ikke have adgang til at slette rækker, tabeller eller databaser, og det bør reflekteres i de rettigheder databasebrugeren har.

  1. ^ SQL Injection by the numbers set 15. maj 2012