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.