Hvad er SQL-injection?

SQL er en kode, der gør det muligt for brugere at interagere med databaser. Men hackere kan angribe de databaser gennem SQL-injections.

07-09-2022 - 8 minutters læsning. Under kategorien: hacking.

Hvad er SQL-injection?

SQL (Structured Query Language) er et kodesprog, der gør det muligt for brugere at interagere med databaser, f.eks. på websteder. Moderne webapplikationer bruger databaser til at administrere data og vise dynamisk indhold til brugerne, hvorfor de er ret essentielle for hjemmesider.

Men cyberkriminelle har fundet en måde at angribe de webapplikationer og kompromittere databaserne. Sådan et angreb kaldes en SQL-injection.

Hvad er SQL-injektion?

SQL-injektion, også kendt som SQLI, er en almindelig angrebsvektor, der kan bruge forberedte udsagn i form af ondsindet SQL-kode til databasemanipulation for at få adgang til information, som skulle have været skjult. Disse oplysninger kan omfatte følsomme data fra virksomheder, brugernavn, kodeord, brugerlister eller private kundeoplysninger. 

Der er flere mulige konsekvenser ved SQL-injektion, og det kan påvirke virksomheder i høj grad. Et vellykket angreb rettet mod virksomheder kan resultere i uautoriseret visning af brugerlister, sletning af data og, i visse tilfælde, at den cyberkriminelle bag angrebet får administrative rettigheder til en database, hvilket kan være meget skadeligt for en virksomhed.

Derudover kan et SQL-injection-angreb føre til, at virksomheder mister kundetillid, hvis personlige oplysninger såsom telefonnumre, adresser og kreditkortoplysninger bliver stjålet og offentliggjort eller solgt videre.

SQL står for Structured Query Language og er en bestemt slags kode. Selvom denne vektor kan bruges til at angribe enhver SQL-database, er angreb ofte rettet mod hjemmesider.

En SQL-injection er altså en slags cyberangreb, hvor en cyberkriminel, ved at indskyde fjendtlig kode (SQL-kode) i en database, kan manipulere den og få adgang til potentielt værdifulde oplysninger, der ligger i den database.

SQL-injection-angreb er en udbredt og farlig form for cyberangreb, da det potentielt kan bruges mod enhver webapplikation eller enhver hjemmeside, der bruger en SQL-baseret database. Og det er der en del, der gør.

Typer af SQL-injection-angreb

Der findes mange typer SQL-injection-angreb, men SQL-injektions kan typisk inddeles i tre kategorier:

  • In-band SQL-injection (Classic)

  • Inferential SQL-injection (Blind)

  • Out-of-band SQL-injection

Man kan opdele SQL-injections baseret på de metoder, de bruger til at få adgang til data og den skade, de potentielt kan medføre.

In-band SQL-injection

Dette er den mest simple form for SQL-injection. Hackeren bruger den samme kommunikationskanal til at starte sit angreb og til at indsamle deres resultater. In-band SQL-injections enkelhed og effektivitet gør det til en af de mest almindelige typer af SQL-angreb.

Der er to undervariationer af denne metode:

  • Fejlbaseret SQL-injection – hackeren udfører handlinger, der får databasen til at skabe fejlmeddelelser. Hackeren kan potentielt bruge dataene fra disse fejlmeddelelser til at indsamle oplysninger om databasens struktur.

  • Union-baseret SQL-injection – Angrebet udnytter UNION SQL-operatoren, som sammenkæder flere udvalgte sætninger genereret af databasen for at få et enkelt HTTP-svar. Dette svar kan indeholde data, der kan udnyttes af hackeren.

Inferentiel (blind) SQL-injection

Hackeren sender forespørgsler til databasen og observerer den respons og adfærd for at lære mere om dens struktur. Denne metode kaldes blind SQL-injection, fordi dataene ikke overføres fra hjemmesidens database til hackeren, og hackeren kan derfor ikke se information om angrebet.

Blind SQL-injections er afhængige af databasens respons og adfærdsmønstre, så de tager typisk lang tid at udføre, men kan være meget skadelige. En blind SQL-injektion kan opdeles i to typer: 

  • Boolean – En hacker sender en SQL-forespørgsel til databasen, der beder applikationen om at returnere et resultat. Resultatet vil variere afhængigt af, om forespørgslen er sand eller falsk. Baseret på resultatet vil oplysningerne i HTTP-svaret enten ændres eller ikke ændres. Hackeren kan derefter finde ud af, om meddelelsen genererede et sandt eller falsk resultat.

  • Tidsbaseret – Hackeren sender en SQL-forespørgsel til databasen, som får databasen til at vente, før den kan reagere. Hackeren kan se på den tid, som det tager databasen at svare, om en forespørgsel er sand eller falsk. Baseret på resultatet vil et HTTP-svar blive genereret øjeblikkeligt eller efter noget tid. Hackeren kan på den måde regne ud, om den anvendte forespørgsel returnerede et sandt eller falsk svar, uden at være afhængig af data fra databasen.

Out of band SQL-injection

Hackeren kan kun udføre denne form for angreb, når visse funktioner er aktiveret på databaseserveren, der bruges af en webapplikation. Denne type angreb bruges primært som et alternativ til in-band og inferentielle SQL-teknikker 

Out-of-band SQL-injektion udføres, når hackere ikke har muligheden for at bruge den samme kanal til at starte angrebet og indsamle information, eller når en server er for langsom eller ustabil til, at disse handlinger kan udføres. Denne type angreb udnytter databaseserverens kapacitet til at oprette DNS- eller HTTP-anmodninger for at overføre data til hackeren.

Eksempel på SQL-injection-angreb

En cyberkriminel, der ønsker at udføre en SQL-injektion, manipulerer en standard SQL-forespørgsel for at udnytte ikke-validerede inputsårbarheder i en database. Der er mange måder, hvorpå dette angreb kan udføres. Her nævnes flere måder for at skabe et overblik over, hvordan SQL-injektioner fungerer.

SQL er et standardiseret sprog, der bruges til at få adgang til og manipulere databaser for at opbygge tilpassede datavisninger for hver bruger. SQL-forespørgsler bruges til at udføre kommandoer, såsom at hente data, udføre opdateringer og fjerne dataposter. Forskellige SQL-elementer implementerer disse opgaver, f.eks. forespørgsler, der bruger SELECT-sætningen til at hente data, baseret på parametre, som brugeren leverer.

Et eksempel på en SQL-forespørgsel (SQL query) til en online shopping hjemmeside (”e-store”) kan være:

    SELECT ItemName, ItemDescription
	FROM Item WHERE ItemNumber = ItemNumber

Ud fra dette skaber webapplikationen en strengforespørgsel, der sendes til databasen som en enkelt SQL-sætning:

    sql_query= "SELECT ItemName, ItemDescription
	FROM Item WHERE ItemNumber = " & Request.QueryString("ItemID")

Et brugerleveret input "http://www.estore.com/items/items.asp?itemid=999" kan derefter generere følgende SQL-forespørgsel:

    SELECT ItemName, ItemDescription
	FROM Item WHERE ItemNumber = 999

Som det kan ses på syntaksen, giver denne forespørgsel navnet og beskrivelsen på varenummer 999 på shopping hjemmesiden.

Det ovennævnte input, som henter information for et specifikt produkt, kan ændres til at være "http://www.estore.com/items/items.asp?itemid=999 eller 1=1".

Som et resultat ser den tilsvarende SQL-forespørgsel sådan ud:

    SELECT ItemName, ItemDescription
	FROM Items WHERE ItemNumber = 999 OR 1=1

Og da udsagnet 1 = 1 altid er sandt, returnerer forespørgslen alle produktnavne og beskrivelser i databasen, også dem, som brugeren muligvis ikke er berettiget til at få adgang til.

Hackere kan også udnytte visse tegn, der er forkert filtreret, til at ændre en SQL-forespørgsel, herunder at bruge et semikolon til at adskille to felter.

F.eks. kan inputtet "http://www.estore.com/items/iteams.asp?itemid=999; DROP TABLE" generere følgende SQL-forespørgsel:

    SELECT ItemName, ItemDescription
	FROM Items WHERE ItemNumber = 999;
	DROP TABLE USERS

Ved denne forespørgsel kunne hele brugerdatabasen risikere at blive slettet.

En anden måde SQL-forespørgsler kan manipuleres på, er med en UNION SELECT-sætning. Dette kombinerer to ikke-relaterede SELECT-forespørgsler for at hente data fra forskellige databasetabeller. 

Inputtet "http://www.estore.com/items/items.asp?itemid=999 UNION SELECT user-name, password FROM USERS" skaber følgende SQL-forespørgsel:

    SELECT ItemName, ItemDescription
	FROM Items WHERE ItemID = '999'
	UNION SELECT Username, Password FROM Users;

Ved at bruge UNION SELECT-sætningen kombinerer denne forespørgsel anmodningen om vare 999’s navn og beskrivelse med en anden, der henter indtastede brugernavn og adgangskode for hver bruger i databasen.

Forebyggelse og sikring mod SQL-injection

Der er flere effektive måder at forhindre SQLI-angreb i at manipulere databaser og måder at minimere skaderne, hvis et angreb finder sted.

Den første måde er inputvalidering, hvor man skriver kode, der kan identificere illegitime brugerinput.

Selvom inputvalidering altid skal betragtes som best practice, er det ikke en skudsikker løsning. I mange tilfælde er det ikke muligt at fastlægge alle legitime og ikke-legitime input, i hvert fald ikke uden at skabe mange falske positiver, som forstyrrer brugeroplevelsen og en applikations funktionalitet. 

Derfor kan man, udover at bruge inputvalidering, anvende en webapplikationsfirewall (WAF) til at filtrere SQL-injections og andre cybertrusler fra. For at en WAF kan identificere og bortfiltrere SQL-injection-angreb, er den afhængig af en stor og konstant opdateret liste over specielt udformede signaturer, der gør det muligt for den at finde og fjerne ondsindede SQL-forespørgsler. Denne liste indeholder normalt signaturer til at adressere specifikke angrebsvektorer og bliver regelmæssigt opdateret for at kunne beskytte nye sårbarheder.

Moderne webapplikationsfirewalls er også ofte integreret med andre sikkerhedsløsninger. En WAF kan modtage yderligere information fra dem og skabe en endnu højere sikkerhed.

En webapplikationsfirewall, der støder på et mistænkeligt, men ikke direkte ondsindet input, kan krydsverificere det med IP-data, før den beslutter, om inputtet skal blokeres eller ej. Den blokerer kun input, hvis der er noget mistænkeligt ved IP'en.

En cloud-baseret WAF kan bruge signaturgenkendelse, IP-data og andre sikkerhedsforanstaltninger til at identificere, validere og blokere SQL-injektioner uden at filtrere særlig mange legitime input fra. Der er selvfølgelig en risiko for, at en WAF blokerer legitime input.

Forfatter Sofie Meyer

Sofie Meyer

Sofie Meyer er copywriter og phishing-aficionado her i Moxso. Hun er uddannet cand.mag. i dansk og har gennem sin uddannelse haft en stor interesse for cyberkriminalitet, hvilket resulterede i et specialeprojekt om phishing.

Se alle indlæg af Sofie Meyer

Lignende indlæg