Naar de inhoud
esif.nl, kennisbank security en intelligence

Aanvalstechnieken

SQL-injectie

Bijgewerkt op · Door Maarten van den Bos

SQL-injectie is een aanval op een website of applicatie waarbij een aanvaller eigen SQL-code invoert in bijvoorbeeld een zoekveld, inlogveld of webadres. Als de applicatie die invoer niet scheidt van haar eigen databaseopdracht, voert de database de code van de aanvaller uit. Die kan dan gegevens inzien, wijzigen of verwijderen die niet voor hem bedoeld zijn.

Wat is SQL-injectie?

SQL-injectie (Engels: SQL injection, afgekort SQLi) is een aanval op de database achter een website of applicatie. SQL staat voor Structured Query Language, de taal waarmee applicaties gegevens opvragen en opslaan in een database. Bij een SQL-injectie laat de aanvaller zijn eigen SQL-code meelopen in gewone invoer, zoals een zoekterm of gebruikersnaam.

OWASP, de internationale stichting voor veilige webapplicaties, deelt SQL-injectie in onder de categorie Injection. Volgens OWASP ontstaat een injectiekwetsbaarheid als onbetrouwbare invoer van een gebruiker naar een interpreter gaat, zoals een database, en die interpreter delen van de invoer als opdracht uitvoert.

In de OWASP Top 10 van 2025, de lijst met de grootste risico’s voor webapplicaties, staat Injection op plaats 5. OWASP noemt SQL-injectie een aanval die niet vaak voorkomt maar grote gevolgen heeft, met meer dan 14.000 CVE’s, publiek geregistreerde kwetsbaarheden (bron: OWASP, 2025). Alle applicaties in de OWASP-dataset werden getest op een vorm van injectie.

SQL-injectie lijkt op cross-site scripting, dat ook onder Injection valt. Het verschil is het doelwit: SQL-injectie richt zich op de database op de server, cross-site scripting op de browser van de bezoeker.

Hoe werkt SQL-injectie?

SQL-injectie werkt wanneer een applicatie invoer direct aan een databaseopdracht vastplakt. OWASP geeft het voorbeeld van een applicatie die een klantnummer uit het webadres in de opdracht zet. De aanvaller vult in plaats van een klantnummer de tekst ' OR '1'='1 in. Daardoor verandert de betekenis van de opdracht en krijgt hij alle records uit de tabel met accounts te zien. Gevaarlijkere varianten kunnen gegevens wijzigen of verwijderen.

OWASP noemt als kern van de oplossing: houd gegevens gescheiden van opdrachten. In stappen:

  1. Gebruik geparametriseerde queries of een veilige API, zodat invoer altijd als gegeven wordt behandeld en nooit als opdracht.
  2. Controleer invoer aan de serverkant op wat is toegestaan. Dit is volgens OWASP geen volledige verdediging, omdat veel velden speciale tekens nodig hebben.
  3. Escape speciale tekens in de dynamische queries die overblijven.
  4. Test de code met geautomatiseerde tools, zoals statische en dynamische applicatiebeveiligingstests, voordat die live gaat.
  5. Zet een WAF in als extra laag, niet als vervanging van veilige code.

Voorbeeld uit de praktijk

Tussen 15 en 21 oktober 2015 werd het Britse telecombedrijf TalkTalk aangevallen met SQL-injectie. De aanvaller kreeg toegang tot persoonsgegevens van 156.959 klanten, en bij 15.656 klanten ook tot bankrekeningnummers en sort codes (bron: ICO).

De Britse privacytoezichthouder ICO legde TalkTalk een boete op van 400.000 pond. De ICO noemde SQL-injectie een veelvoorkomende aanval die al meer dan 10 jaar goed bekend is en waartegen bekende verdedigingen bestaan. Het voorbeeld laat zien dat een oude, bekende kwetsbaarheid nog steeds tot een groot datalek kan leiden.

SQL-injectie in de praktijk van een security-professional

Tegen SQL-injectie beginnen de maatregelen bij de ontwikkelaar. Met security by design zijn veilige databasekoppelingen de standaard in elk project. Een security architect legt vast welke frameworks en werkwijzen teams gebruiken, en een security consultant toetst of dat in de praktijk gebeurt.

Een ethical hacker zoekt tijdens een pentest actief naar invoervelden die kwetsbaar zijn voor SQL-injectie. Dat is ook een vast onderdeel van de opleiding ethical hacking. Omdat API’s steeds vaker gegevens doorgeven aan databases, hoort het testen van API-security daar ook bij.

Veelgestelde vragen

Waar staat de afkorting SQL voor?

SQL staat voor Structured Query Language. Het is een taal waarmee applicaties gegevens in een database opvragen, toevoegen, wijzigen en verwijderen. Bijna elke website met een inlogfunctie, webwinkel of zoekfunctie gebruikt een database die met SQL of een vergelijkbare taal werkt.

Wat is SQL-injectie?

SQL-injectie is een aanval waarbij iemand eigen SQL-code invoert in een veld van een website of applicatie. Als de applicatie die invoer niet goed scheidt van haar eigen opdrachten, voert de database de code uit. De aanvaller kan zo gegevens inzien, wijzigen of verwijderen.

Hoe voorkom je SQL-injectie?

De belangrijkste maatregel is gegevens en opdrachten gescheiden houden met geparametriseerde queries of een veilige API. Controleer daarnaast invoer aan de serverkant, test code op injectie voordat die live gaat en laat een pentest uitvoeren. Een web application firewall is een nuttige extra laag, geen vervanging.

Wat is het verschil tussen SQL-injectie en cross-site scripting?

Beide zijn injectieaanvallen uit de OWASP Top 10. Bij SQL-injectie voert de database op de server de code van de aanvaller uit. Bij cross-site scripting voert de browser van een bezoeker kwaadaardige code uit die via de website binnenkomt. SQL-injectie richt zich dus op de server, cross-site scripting op de gebruiker.

Bronnen

  1. OWASP Top 10:2025, A05 Injection
  2. OWASP Top 10:2025
  3. ICO: TalkTalk cyber attack, how the ICO's investigation unfolded

Gerelateerde begrippen

  • Cross-site scripting (XSS)

    Cross-site scripting (XSS) is een aanval waarbij een aanvaller kwaadaardige code, meestal JavaScript, via een kwetsbare website bij bezoekers laat uitvoeren. De browser vertrouwt de code omdat die van de website zelf lijkt te komen. Zo kan de aanvaller bijvoorbeeld sessiegegevens stelen, de inhoud van de pagina veranderen of bezoekers doorsturen naar een nepwebsite.

  • WAF (web application firewall)

    WAF staat voor web application firewall: een beveiligingslaag die het HTTP-verkeer naar een website of webapplicatie controleert. Een WAF vergelijkt elk verzoek met regels en blokkeert verzoeken die lijken op bekende aanvallen, zoals SQL-injectie en cross-site scripting. Zo beschermt een WAF de applicatie ook wanneer de code zelf nog kwetsbaarheden bevat.

  • Security by design

    Security by design is een ontwerpprincipe waarbij beveiliging vanaf de ontwerpfase wordt meegenomen in een applicatie, product of dienst, in plaats van achteraf te worden toegevoegd. Risicoanalyse, beveiligingseisen en veilige standaardinstellingen horen dan bij elke stap van de ontwikkeling. De Europese Cyber Resilience Act maakt deze aanpak voor digitale producten verplicht.

  • Pentest

    Een pentest, voluit penetratietest, is een gecontroleerde aanval op een computersysteem, netwerk of applicatie. Een getrainde tester kruipt in de rol van aanvaller, zoekt kwetsbaarheden en probeert die uit te buiten. Zo ziet een organisatie hoe ver een echte aanvaller zou komen, voordat die het zelf probeert.

  • API-security

    API-security is het beveiligen van API's: de koppelingen waarmee apps, websites en systemen gegevens uitwisselen. Het doel is dat alleen bevoegde gebruikers en systemen precies bij de gegevens en functies kunnen die voor hen bedoeld zijn. Belangrijke maatregelen zijn authenticatie, autorisatie per object, versleuteling, limieten op gebruik en een actueel overzicht van alle API's.