SQL Injection 101: Hvad er SQLi, og hvordan man forebygger angreb
august 06, 2022 • sikkerhed
Hvad er SQL-injektion
SQL-injektion (SQLi) er en type angreb, der giver kriminelle mulighed for at udføre skadelige SQL-udsagn mod sårbare webapplikationer. Angribere kan få adgang til følsomme data, såsom kundeoplysninger, personlige data, forretningshemmeligheder og mere ved at omgå applikationens sikkerhedsforanstaltninger. Her vil vi diskutere SQL-injektion, hvordan det fungerer, og hvordan du kan forhindre angreb.
SQL-injektionsangreb kan ske på enhver hjemmeside, der bruger en SQL-database. Denne type angreb giver angribere adgang til dine essentielle data. De kan se forbrugerinformation, personlige data, forretningshemmeligheder og intellektuel ejendom. Dette er en af de mest alvorlige typer angreb på webapplikationer ifølge OWASP.
Typer af SQL-injektion

In-band SQLi
In-band SQL-injektion er et angreb, hvor angriberen bruger den samme kanal til at sende og modtage forespørgsler. In-band betyder, at svaret opnås ved hjælp af det samme kommunikationsmedium. Angriberens mål er at få svaret i en webbrowser med det samme, hvis det er muligt, når angrebet udføres manuelt med en webbrowser.
Eksempel på in-band SQL-injektion
Den mest almindelige måde for en angriber at udføre en in-band SQL-injektion er at ændre forespørgslen, så de kan se den nuværende brugers personlige oplysninger. Dette kan gøres ved at ændre den værdi, der sendes som en del af forespørgslen. For eksempel, hvis udsagnet skulle vise brugerens navn, kunne angriberen ændre det, så deres navn vises i stedet.
SELECT * FROM users WHERE user_id LIKE 'current_user'
Fejlbaseret SQLi og Union-baseret SQLi er de to mest almindelige former for in-band SQL-injektion.
Fejlbaseret SQLi
En fejlbaseret SQLi-teknik er en in-band SQL-injektionsmetode, der udnytter databaseserverens fejlmeddelelser til at opdage databasens arkitektur. Fejlbaseret SQL-injektion er den mest almindelige type in-band SQL-injektion.
Eksempel på fejlbaseret SQLi:
Hvis en angriber forsøger at logge ind med følgende legitimationsoplysninger:
brugernavn: ' OR 'a'='apassword: anything
Databasen vil returnere en fejl, fordi udsagnet er syntaktisk ukorrekt. Fejlmeddelelsen vil afsløre oplysninger om databasen, som angriberen kan bruge til deres fordel.
Union-baseret SQLi:
In-band SQL-injektion er en måde at få information fra en hjemmeside ved hjælp af UNION-operatøren til at kombinere output fra to eller flere SELECT-udsagn.
Blind SQL-injektion
Blind SQL-injektion er et angreb, hvor angriberen forsøger at få svar fra databasen ved at stille spørgsmål, der vil resultere i et sandt eller falsk svar. Angriberen bruger fejlmeddelelser til at se, om applikationen reagerer anderledes, når en bestemt kode bruges.
Når en hacker bruger SQL-injektion, kan webapplikationen vise kritiske databaseadvarselsmeddelelser, der angiver, at SQL-forespørgselssyntaksen er forkert. Blind SQL-injektion fungerer på samme måde som traditionel SQL-injektion, bortset fra hvordan data hentes fra databasen. Hvis en database ikke har nok information til, at en angriber kan udnytte den, skal en angriber stille en række spørgsmål for at få data.
Blind SQL-injektion er opdelt i blind-boolean-baseret SQLi og blind-tidsbaseret SQLi.
Boolean-baseret Blind SQLi
Boolean-baseret Blind SQL-injektion er et angreb, hvor angriberen forsøger at få svar fra databasen ved at stille spørgsmål, der vil resultere i et sandt eller falsk svar. Angriberen bruger fejlmeddelelser til at se, om applikationen reagerer anderledes, når en bestemt kode bruges.
Eksempel på boolean-baseret Blind SQLi:
Hvis en angriber vil finde ud af databasetypen, vil de bruge følgende udsagn:
SELECT * FROM users WHERE user_id LIKE 'current_user' and database() like '%type%'
Hvis databasen er MySQL, ville output være noget i retning af dette:
Du har en fejl i din SQL-syntaks; tjek manualen, der svarer til din MySQL-serverversion for den rigtige syntaks at bruge nær ‘and database() like ‘%type%” på linje
Tidsbaseret Blind SQL-injektion
Et tidsbaseret Blind-angreb er, når en SQL-kommando sendes til serveren med kode, der får forespørgsler til at udføre langsommere.
Tidsbaserede Blind-angreb giver angribere mulighed for at udtrække data baseret på adgangstid. Et sådant angreb er kendt som et blindt eller inferentielt injektionsangreb. Dette er en type angreb, hvor der ikke er nogen dataflow mellem angriberen og databasen, men fordi der ikke er noget svar, kaldes det også et blindt injektionsangreb.
Responstiden indikerer, om svaret er korrekt eller forkert. Hvis svaret er negativt, vil indtrængeren lave en ny forespørgsel. Denne angrebsteknik er langsom, fordi hackeren skal gennemgå hvert tegn individuelt, især når der angribes massive databaser.
Eksempel på blind SQLi
I dette eksempel forsøger angriberen at afgøre, om brugeren med id=999 findes i databasen. For at gøre dette bruger de følgende udsagn:
IF(SUBSTRING((SELECT password FROM users WHERE user_id=999),0, LEN('secret'))='secret', SLEEP(30), 'false')
Hvis brugeren med id 999 findes i databasen, og deres adgangskode er hemmelig, vil applikationen sove i 30 sekunder. Applikationen vil returnere falsk, hvis brugeren ikke findes i databasen.
Out-of-band SQLi
En person, der ønsker at stjæle data, kan sende SQL-kode til en databaseserver på en måde, der ikke er en del af den sædvanlige kommunikation mellem serveren og andre computere. Dette kan gøres ved at sende information til serveren gennem DNS- eller HTTP-forespørgsler.
Appens svar vil ikke blive påvirket af, om der returneres data, om der er et problem med databasen, eller hvor lang tid det tager at udføre forespørgslen. Out-of-band kan bruges i netværksinteraktioner til at udløse begivenheder efter behov. Afhængigt af en injiceret betingelse kan disse aktiveres betinget for at opnå viden én bit ad gangen.
Data kan også lække via flere netværksprotokoller fra netværksinteraktioner. Visualiseringen repræsenterer forespørgslen sendt fra webapplikationen til appens database.
Eksempel på out-of-band SQLi
I dette eksempel forsøger angriberen at afgøre, om en bestemt bruger findes i databasen. For at gøre dette bruger de følgende udsagn:
SELECT user_id FROM users WHERE username='$username' AND password='$password' LIMIT 0,0 UNION SELECT NULL,'' INTO OUTFILE '/var/opt/databases/$filename.php'; --
Applikationen vil returnere deres bruger-id, hvis brugeren findes i databasen. Hvis brugeren ikke findes i databasen, vil applikationen oprette en fil, der indeholder PHP-kode, der kan bruges til at udføre systemkommandoer. Angriberen kan derefter bruge denne fil til at køre kommandoer på serveren.
Hvordan man forhindrer en SQL-injektion
Den bedste måde at beskytte mod SQL-injektionsangreb er at bruge inputvalidering, forberedte udsagn og parameteriserede forespørgsler. Koden bør aldrig gøre direkte brug af brugerens input. Udviklere skal rense al input i stedet for blot webformularinput som loginformularer. Enkeltcitater bør elimineres fra enhver tvivlsom kodekomponent. Det er også en god idé at skjule databaseproblemer på live-sider for at undgå utilsigtet at afsløre dem. SQL-injektion kan give information om et databasesystem, som angribere kan bruge til deres fordel.
Hvis du finder et problem med din hjemmeside, bør du tage den offline med det samme og kontakte din hostingudbyder. De kan hjælpe dig med at afgøre, om din side er blevet kompromitteret, og hvilke skridt du skal tage for at løse problemet. I mellemtiden skal du sikre, at alle dine hjemmesides brugere er opmærksomme på problemet og ændrer deres adgangskoder så hurtigt som muligt.
Forebyggelsestips til at undgå SQL-injektioner
Der er nogle få måder at undgå SQL-injektionssårbarheder i dit programmeringssprog og databasesetup. Disse teknikker kan bruges med de fleste databaser, såsom XML. Du kan bruge disse teknikker til at gøre dine databaser mere sikre.
1) Brug af korrekt konstruerede lagrede procedurer
Begyndere bør starte med at lære, hvordan man opretter udsagn med variabler. Dette er lettere end at oprette dynamiske forespørgsler, og det er lettere at forstå. Parameteriserede forespørgsler er, hvor udvikleren opretter al SQL-koden og derefter leverer hver parameter på et senere tidspunkt. Denne metode giver databasen mulighed for at skelne mellem kildekode og information.
Forberedte udsagn hjælper med at sikre, at en forespørgsels mål ikke ændres, selvom nogen forsøger at give SQL-instruktioner.
2) Tillad-liste Input Validering
SQL-forespørgsler bruger bindvariabler på specifikke steder til data. For eksempel, hvis du bruger Python, ville du bruge %s pladsholder. Du kan bruge et regulært udtryk til at validere brugerinput mod tillad-listen for, hvilke tegn der er tilladt i hver bindvariabel.
Hvis du bruger JavaScript, kan du bruge \w til at matche alfanumeriske og understregningstegn.
Tillad-listen skal være så specifik som muligt for at undgå falske positiver.
For eksempel, hvis du leder efter et amerikansk telefonnummer, ville du bruge følgende regulære udtryk:
/^\d{11}$/
Dette ville matche en streng på 11 cifre, der kunne være et telefonnummer. Hvis nogen forsøgte at indsende noget som ‘abcdef‘, ville det ikke matche, og inputtet ville være ugyldigt.
Dette vil hjælpe med at sikre, at dine data er sikre og sunde. Hvis du har brug for at bruge værdier fra kode i stedet for brugerparametre, er det også okay!
Men hvis brugerparameterens værdier målretter mod specifikke tabel- og kolonnenavne, skal parameterværdierne kortlægges til de tilsvarende tabel- og kolonnenavne for at sikre, at ikke-valideret brugerinput ikke kommer ind i forespørgslen.
3) Brug af hvidlister
Filtrer ikke brugerinput baseret på sortlister over dårlige tegn. Brug af tillad-lister over gode tegn, der forventes i specifikke felter, er meget mere effektivt. Dette vil stoppe SQL-injektionsangreb, før de starter.
For eksempel, tillad kun cifre og bindestreger i inputfeltet, hvis du forventer et telefonnummer. Hvis du forventer en e-mailadresse, skal du kun tillade tegn, der er gyldige i en e-mailadresse.
4) Brug de mest opdaterede platforme
PHP har ikke SQLi-beskyttelse i ældre webudviklingsplatforme. Brug den mest opdaterede udgave af programmeringsmiljøet, sproget og tilknyttede teknologier, der er tilgængelige. I stedet for PHP, brug PDO i dette eksempel.
5) Scan din webapplikation regelmæssigt
SQL-injektioner kan være meget svære at opdage. Det er vigtigt at scanne din webapplikation for sårbarheder regelmæssigt.
6) Håndhævelse af mindst privilegium
Princippet om mindst privilegium er et sikkerhedskoncept, der begrænser brugere til den mindste mængde adgang, de har brug for til at udføre deres arbejde. Dette inkluderer at begrænse antallet af konti, brugerne har, og de privilegier, disse konti har.
Mindst begrænsning på funktionalitet (LRF) er praksis og konceptet med at begrænse brugerrettigheder, konti og computerprocesser til kun de ressourcer, der er nødvendige for grundlæggende, acceptable opgaver. Dette hjælper med at opretholde minimale brugerrettigheder eller sikkerhedsniveauer, hvilket er vigtigt for, at folk kan udføre deres arbejde effektivt.
Mindst privilegium er et sikkerhedsprincip, der kræver, at applikationer, systemer og gadgets kun har de tilladelser, der er nødvendige for at udføre en bestemt opgave. På denne måde vil påvirkningen være begrænset, hvis nogen formår at udnytte en sårbarhed og gøre skade. Dette er i modsætning til at give brugere flere tilladelser, end de har brug for, hvilket øger risikoen for betydelig skade i et SQL-angreb.
SQL-injektion – Ofte stillede spørgsmål
In-band SQL-injektion er den mest almindelige type SQL-injektionsangreb. Det opstår, når en angriber kan bruge den samme kommunikationskanal til at levere nyttelasten og indsamle resultater.
Det bedste forsvar mod SQL-injektion er at bruge parameteriserede forespørgsler. Denne type forespørgsel bruger pladsholderværdier til parametre, som leveres på et senere tidspunkt. Denne metode gør det muligt for databasen at skelne mellem kildekode og information.
SQL-injektion kan opdages på flere måder. En metode er at bruge en webapplikationsfirewall (WAF). En WAF er et stykke hardware eller software, der sidder mellem en webapplikation og internettet. Den inspicerer trafik for skadelig aktivitet og kan blokere SQL-injektionsangreb.
Andenordens SQL-injektion opstår, når en angriber kan injicere en nyttelast, der gemmes af webapplikationen og derefter udføres senere. Denne type angreb er sværere at opnå, fordi angriberen skal have en måde at udløse udførelsen af den gemte nyttelast.
Blind SQL-injektion er et angreb, hvor angriberen ikke direkte ser resultaterne af deres nyttelast. I stedet skal de bruge sande eller falske udsagn til at udlede information fra databasen. Denne type angreb er sværere at udføre, men kan være lige så farlig som andre typer SQL-injektion.
En stablet forespørgsel er en type SQL-injektion, hvor angriberen bruger flere forespørgsler til at udtrække information fra databasen. Denne type angreb er sværere at udføre, men kan være meget farlig, hvis det lykkes.
Fejlbaseret SQL-injektion er et angreb, hvor angriberen bruger databasefejl til at udlede information fra databasen. Dette angreb er sværere at udføre, men kan være meget farligt, hvis det lykkes.
sikkerhed
admin er seniorskribent for Government Technology. Hun har tidligere skrevet for PYMNTS og The Bay State Banner og har en BA i kreativ skrivning fra Carnegie Mellon. Hun bor uden for Boston.