Gå til indhold
atlas

SQL injection

Også kendt som: SQL-injektion

Et angreb, hvor tekst skrevet i en formular læses af databasen som en kommando, så en udefrakommende kan læse eller ændre dens data.

Kladde - dette opslag er endnu ikke gennemgået.

Formelt

Et angreb på en webapplikation, der bygger databasekommandoer ved at sætte brugerens input direkte ind i kommandoteksten; særligt udformet input ændrer kommandoens betydning, så databasen udfører instruktioner, udvikleren aldrig havde tænkt sig.

Forklaret enkelt

Som en blanket, hvor der står "Betal beløbet ___ til Anna", og nogen skriver "10 kroner, og betal også alt til mig" i feltet - og ekspedienten gør bare det hele.

I praksis

En lille dansk webshop sender det, der tastes i søgefeltet, direkte videre til databasen; en angriber skriver et lille stykke SQL i stedet for et produktnavn, og siden viser alle kunders mailadresser og hashede adgangskoder.

Hvorfor det betyder noget

Ét svagt formularfelt kan udlevere en hel database, og fejlen dukker stadig op i ny kode årtier efter, at den første gang blev beskrevet - selvom en enkel vane, at holde input adskilt fra kommandoen, forhindrer den.

Teknisk uddybning

Fejlen blev beskrevet offentligt i Phrack nr. 54 i december 1998 af Jeff Forristal (under navnet rain.forest.puppy) og er katalogiseret som CWE-89. Den opstår, når en forespørgsel sættes sammen ved strengsammenkædning, som i "SELECT * FROM users WHERE name = '" + input + "'". Input som ' OR '1'='1 lukker strengen og ændrer WHERE-betingelsen; en afsluttende kommentar (-- eller #) smider resten af den oprindelige sætning væk. Samme mekanisme gælder ORDER BY-led, LIKE-mønstre, stored procedures, der bygger dynamisk SQL med EXEC, og ORM'ers metoder til "rå" forespørgsler.

Udnyttelsesteknikkerne grupperes efter, hvordan data kommer tilbage. In-band-angreb læser resultaterne direkte, enten via UNION SELECT, der føjer kolonner valgt af angriberen til det legitime resultatsæt, når antal og typer af kolonner passer, eller via fejlbaseret udtræk, hvor detaljerede databasefejl lækker værdier. Blinde angreb udleder data én bit ad gangen: booleske varianter sammenligner sidens svar ved sande og falske betingelser, og tidsbaserede varianter bruger funktioner som SLEEP() eller pg_sleep() til at skabe målbare forsinkelser. Out-of-band-teknikker får databasen til at sende data via DNS eller HTTP. Second-order injection gemmer en uskyldigt udseende værdi, som senere sættes ind i en forespørgsel et andet sted, og derfor er validering alene ved indgangen ikke nok. Værktøjer som sqlmap automatiserer det hele.

Det primære forsvar er parameteriserede forespørgsler (prepared statements), hvor SQL-teksten og værdierne sendes hver for sig til databasedriveren, så input aldrig kan tolkes som syntaks. Parametre kan ikke bruges til identifikatorer som tabel- og kolonnenavne eller til nøgleord som ASC og DESC; de skal slås op i en allowlist. Stored procedures er kun sikre, hvis de ikke selv bygger dynamisk SQL. Escaping af brugerinput er en sidste udvej, fordi det afhænger af databasen og tegnsættet og gentagne gange er blevet omgået, fx via multibyte-encodings. Databasekonti med mindst mulige rettigheder, slået stacked queries fra, hvor driveren tillader det, og generiske fejlsider begrænser skaden.

Konsekvensen afhænger af databasen og dens rettigheder: ud over at læse og ændre data kan nogle platforme skrive filer eller køre kommandoer, fx via xp_cmdshell på Microsoft SQL Server. SQL injection er stadig aktuelt; i 2023 masseudnyttede Cl0p-gruppen CVE-2023-34362, en SQL injection i Progress MOVEit Transfer, til at stjæle data fra et stort antal organisationer. Det hører under OWASP Top 10's kategori Injection, A05 i 2025-udgaven.

Hvad du bør lære først

Alt det, dette bygger på - grundlaget først.

  1. Database
  2. →Netværk
  3. →IP-adresse
  4. →Protokol
  5. →Klient
  6. →Pakke
  7. →Port
  8. →Server
  9. →TCP/IP
  10. →HTTP
  11. →Webapplikation
  12. →SQL injection

Relationer

Udnytter
Sårbarhed
Forårsager
Databrud
Bruges sammen med
OWASP Top 10

Kilder og videre læsning

Hvor dataene kommer fra

Dette opslag er skrevet af en AI ud fra kilderne ovenfor og er endnu ikke gennemgået af et menneske. Brug det som udgangspunkt, og tjek alt vigtigt mod kilderne.

Se gennemgangskøenForeslå en rettelse på GitHubDette begreb som JSON

Test dig selv

Indlæser…

Atlas er i beta.