Hop til indhold
Sikkerhed

SQL injection

Structured Query Language injection

SQL injection er en angrebsmetode, hvor en angriber indsætter ondsindet SQL-kode i en webapplikations inputfelter for at manipulere den forespørgsel, applikationen sender videre til sin bagvedliggende database. Metoden udnytter, at brugerinput i mange applikationer bliver sat direkte ind i en SQL-sætning uden tilstrækkelig kontrol. Resultatet kan være, at angriberen får adgang til data, ændrer indhold eller i nogle tilfælde overtager dele af systemet.

Et typisk eksempel er et loginfelt på en hjemmeside, hvor brugernavn og adgangskode normalt bliver sammenlignet med oplysninger i en database. Hvis feltet ikke er ordentligt afgrænset, kan en angriber i stedet for et almindeligt brugernavn skrive en tekststreng, der indeholder SQL-syntaks, fx et enkelt anførselstegn efterfulgt af en kommandolinje. Databasen kan da fejlagtigt opfatte den indsatte kode som en del af den oprindelige forespørgsel og fx springe adgangskodekontrollen helt over, så angriberen logges ind uden at kende en gyldig adgangskode.

Sådan fungerer et SQL injection-angreb

Angrebet opstår, fordi den kode der håndterer databasekald i backend-udviklingen bygger sine forespørgsler ved simpelthen at sætte brugerens input direkte ind i SQL-teksten. Når input ikke behandles som ren data, men som en del af selve kommandoen, kan tegn som anførselstegn, semikolon eller kommentartegn (–) ændre forespørgslens betydning. En angriber kan på den måde få databasen til at returnere flere eller andre data end tilsigtet, eller endda udføre helt nye kommandoer, fx slette eller ændre indhold i en tabel.

Mange moderne applikationer udveksler data via et REST API mellem frontend og backend, og også her kan sårbarheden opstå, hvis parametre der sendes til API’et bliver brugt ukritisk i en databaseforespørgsel. Det er altså ikke afgørende, om input kommer fra et synligt formularfelt eller fra et API-kald i baggrunden — svagheden ligger i, hvordan input behandles, når det når frem til databasen.

Typer af SQL injection

In-band SQL injection

Ved denne type ser angriberen resultatet af angrebet direkte i applikationens svar, fx ved at bruge kommandoen UNION til at koble ekstra data fra andre tabeller sammen med de data, applikationen normalt viser.

Blind SQL injection

Her får angriberen ikke selve dataene at se i svaret, men kan alligevel udlede information ved at stille databasen spørgsmål, der kun kan besvares sandt eller falsk, og observere forskelle i applikationens opførsel eller svartid.

Out-of-band SQL injection

Denne mindre almindelige variant bruges typisk, når angrebet hverken kan ses direkte i svaret eller udledes via tidsforskelle, og angriberen i stedet forsøger at få databaseserveren til at sende data ud via en helt anden kanal, fx netværkstrafik.

Konsekvenser af et vellykket angreb

Et SQL injection-angreb kan i praksis føre til at følsomme oplysninger som brugernavne, adgangskoder eller betalingsdata bliver læst, ændret eller slettet. I nogle tilfælde kan en angriber også opnå udvidede rettigheder på databaseserveren, hvilket kan give adgang til dele af systemet ud over selve databasen. SQL injection regnes ikke som en ukendt eller nyopdaget sårbarhedstype på samme måde som en zero-day sårbarhed — teknikken har været kendt i mange år — men den forekommer stadig, fordi ældre eller mangelfuldt testet kode fortsat sætter brugerinput direkte ind i SQL-forespørgsler.

Sådan beskytter man sig mod SQL injection

Den mest udbredte beskyttelse er at bruge såkaldte forberedte forespørgsler (prepared statements) eller parametriserede forespørgsler, hvor brugerens input altid behandles som data og aldrig som en del af selve SQL-kommandoen. Det kan desuden bidrage til sikkerheden at validere og afgrænse hvilke tegn og formater et inputfelt accepterer, samt at give databasebrugere, som en applikation logger ind med, færrest mulige rettigheder — så skaden begrænses, selv hvis en sårbarhed skulle blive udnyttet.

Eksempel
En angriber skriver administrator'-- i et loginfelts brugernavn, hvorved SQL-forespørgslens adgangskodekontrol udelades, og angriberen logges ind uden at kende en gyldig adgangskode.
Ofte stillede spørgsmål
Hvad er forskellen på in-band og blind SQL injection?
Ved in-band SQL injection kan angriberen se resultatet af angrebet direkte i applikationens svar, mens angriberen ved blind SQL injection må udlede oplysninger indirekte via sandt/falsk-svar eller forskelle i svartid, fordi selve dataene ikke vises.
Kan SQL injection ramme et API og ikke kun en formular?
Ja. Hvis parametre der sendes til et REST API bliver brugt ukritisk i en databaseforespørgsel på backend, kan sårbarheden opstå på samme måde som ved et synligt inputfelt på en hjemmeside.
Hvordan adskiller SQL injection sig fra en zero-day sårbarhed?
SQL injection er en veldokumenteret angrebsteknik, der har eksisteret i mange år, mens en zero-day sårbarhed er en ukendt svaghed, som endnu ikke er opdaget eller rettet af leverandøren.
Er parametriserede forespørgsler nok til at stoppe SQL injection?
Parametriserede forespørgsler reducerer risikoen markant, fordi brugerinput altid behandles som data. Kombineret med begrænsede databaserettigheder og inputvalidering giver det et mere robust forsvar.
Hvilken type data kan et SQL injection-angreb typisk afsløre?
Afhængigt af hvad databasen indeholder, kan et angreb potentielt afsløre brugernavne, adgangskoder, kontaktoplysninger eller andre data, som applikationen har adgang til gennem sin databaseforbindelse.
Vil du forstå forskellen på en kendt angrebsteknik som SQL injection og en helt ukendt, endnu ikke rettet svaghed i et system?
Zero-day sårbarhed →