SQL injection
AanvallenEen soort aanval op webapplicaties waarbij een aanvaller kwaadaardige SQL-code invoert in een invoerveld met als doel toegang te krijgen tot de database van de applicatie, deze te wijzigen of te vernietigen.
SQL injection is een aanvalstechniek waarbij een aanvaller kwaadaardige SQL-code invoert in invoervelden van een webapplicatie om de achterliggende database te manipuleren. Door onvoldoende invoervalidatie kan de ingevoerde code worden uitgevoerd als onderdeel van een databasequery, waardoor de aanvaller data kan uitlezen, wijzigen of verwijderen. SQL injection staat al jaren in de OWASP Top 10 van meest kritieke webapplicatiekwetsbaarheden en blijft een van de meest voorkomende en gevaarlijke aanvalsvectoren voor webapplicaties.
Ondanks dat SQL injection al decennia bekend is en er effectieve verdedigingsmaatregelen bestaan, worden er nog steeds regelmatig succesvolle SQL injection-aanvallen gemeld. Dit komt doordat veel organisaties legacy code gebruiken die niet is bijgewerkt met moderne beveiligingspraktijken, of doordat ontwikkelaars onder tijdsdruk beveiligingsmaatregelen overslaan tijdens het ontwikkelproces. De gevolgen van een succesvolle SQL injection kunnen verstrekkend zijn: van het lekken van complete klantenbestanden tot het volledig overnemen van de databaseserver en het verder compromitteren van het netwerk via de lateral movement techniek.
Hoe werkt SQL injection?
Bij een SQL injection-aanval manipuleert de aanvaller een invoerveld, zoals een zoekveld, inlogformulier of URL-parameter, om SQL-code toe te voegen aan een databasequery. Een eenvoudig voorbeeld: een inlogformulier dat gebruikersnaam en wachtwoord verwacht, stuurt normaal een query als "SELECT * FROM users WHERE username='jan' AND password='geheim'". Als de aanvaller in het gebruikersnaamveld de waarde "' OR '1'='1" invoert, wordt de query veranderd zodat de conditie altijd waar is en alle records worden teruggegeven.
Er zijn verschillende typen SQL injection. Classic SQL injection of in-band SQL injection is de meest directe vorm, waarbij de aanvaller de resultaten direct te zien krijgt in de response van de applicatie. Blind SQL injection wordt gebruikt wanneer de applicatie geen foutmeldingen of queryresultaten toont. De aanvaller stelt dan ja/nee-vragen aan de database via true/false-condities en leidt uit het gedrag van de applicatie af of de conditie waar of onwaar is. Time-based blind SQL injection gebruikt vertragingen in de response om data te extraheren.
Out-of-band SQL injection maakt gebruik van alternatieve communicatiekanalen, zoals DNS- of HTTP-verzoeken, om data uit de database te exfiltreren naar een server van de aanvaller. Second-order SQL injection is een variant waarbij de kwaadaardige payload eerst wordt opgeslagen in de database en pas bij een latere query wordt uitgevoerd. Deze variant is bijzonder lastig te detecteren omdat de injectie en de uitvoering op verschillende momenten en plaatsen in de applicatie plaatsvinden.
Geavanceerde aanvallers kunnen via SQL injection niet alleen data lezen, maar ook opgeslagen procedures aanroepen, bestanden lezen of schrijven op de server, en in sommige gevallen besturingssysteemcommando's uitvoeren. Dit maakt SQL injection een potentieel springplank naar volledige compromittering van de server en het onderliggende netwerk. De combinatie van relatieve eenvoud van uitvoering en potentieel verwoestende impact maakt SQL injection tot een van de gevaarlijkste kwetsbaarheden in webbeveiliging.
Hoe herken je SQL injection?
SQL injection-pogingen kun je herkennen aan specifieke patronen in applicatielogs en webserver-logs. Veelvoorkomende indicatoren zijn invoer die SQL-syntaxis bevat, zoals aanhalingstekens, puntkomma's, commentaartekens (--), UNION SELECT-statements en OR 1=1-constructies. Web Application Firewalls (WAF's) kunnen bekende SQL injection-patronen automatisch detecteren en blokkeren.
Op databaseniveau kun je afwijkende queries detecteren via database activity monitoring. Queries die ongebruikelijk veel data teruggeven, queries vanuit onverwachte bronnen, of queries die proberen systeemtabellen uit te lezen zijn verdachte signalen. Onverklaarbare foutmeldingen in applicaties die database-gerelateerde informatie bevatten, kunnen wijzen op SQL injection-pogingen die nog niet succesvol zijn maar wel actief worden geprobeerd.
Een toename in applicatiefouten, ongebruikelijke responstijden van de database of onverklaarbare datawijzigingen zijn indirecte signalen die op een succesvolle SQL injection kunnen wijzen. SIEM-systemen kunnen logs van webservers, applicaties en databases correleren om aanvalspatronen te identificeren die bij individuele logsystemen over het hoofd worden gezien. Zorg dat je logging voldoende detail bevat om SQL injection-pogingen te kunnen reconstrueren en analyseren. Regelmatige security scans met geautomatiseerde tools zoals SQLMap of Burp Suite helpen bij het proactief identificeren van kwetsbare invoervelden.
Hoe bescherm je je tegen SQL injection?
De meest effectieve bescherming tegen SQL injection is het gebruik van geparametriseerde queries (prepared statements). Hierbij worden de SQL-structuur en de gebruikersinvoer strikt gescheiden, waardoor het technisch onmogelijk is om de querystructuur te manipuleren via invoer. Elke moderne programmeertaal en elk databaseframework biedt ondersteuning voor geparametriseerde queries. Dit moet de standaard zijn voor alle database-interacties in je applicaties.
Implementeer daarnaast invoervalidatie op zowel client- als serverniveau. Gebruik whitelisting om alleen verwachte invoerformaten toe te staan, in plaats van blacklisting van bekende aanvalspatronen. Object Relational Mappers (ORM's) bieden een extra beschermingslaag door SQL-generatie te abstraheren. Pas het least privilege-principe toe op databaseaccounts: de applicatie-account mag alleen de minimaal benodigde rechten hebben en nooit eigenaar zijn van de database of beheerrechten hebben.
Gebruik een Web Application Firewall als extra verdedigingslaag die bekende SQL injection-patronen blokkeert voordat ze de applicatie bereiken. Voer regelmatig code reviews en penetratietesten uit met specifieke aandacht voor SQL injection-kwetsbaarheden. Implementeer secure coding standaarden voor je ontwikkelteam en gebruik Static Application Security Testing (SAST)-tools in je CI/CD-pipeline om SQL injection-kwetsbaarheden te detecteren voordat code in productie gaat. Houd je databasesoftware en applicatieframeworks up-to-date met de laatste beveiligingspatches.
Veelgestelde vragen over SQL injection
Is SQL injection nog steeds een veelvoorkomende aanval?
Ja, SQL injection staat in de OWASP Top 10 van 2025 als onderdeel van de Injection-categorie. Ondanks bekende verdedigingsmaatregelen worden nog steeds regelmatig kwetsbare applicaties gevonden, vooral in legacy systemen en snel ontwikkelde applicaties waar beveiliging niet prioriteit had.
Kan een WAF SQL injection volledig voorkomen?
Een WAF biedt een extra beschermingslaag maar is geen volledige oplossing. Geavanceerde aanvallers kunnen WAF-regels omzeilen via encoding-technieken of onbekende aanvalsvarianten. De primaire verdediging moet in de applicatiecode liggen via geparametriseerde queries.
Welke programmeertalen zijn het kwetsbaarst voor SQL injection?
Geen enkele taal is inherent kwetsbaar. Het probleem zit in hoe de taal wordt gebruikt. PHP-applicaties worden historisch vaak geassocieerd met SQL injection vanwege oudere codepatronen, maar elke taal die string concatenation gebruikt voor SQL-queries is kwetsbaar.
Wat is het verschil tussen SQL injection en cross-site scripting?
SQL injection richt zich op de database via kwaadaardige SQL-code, terwijl cross-site scripting (XSS) zich richt op andere gebruikers via kwaadaardige JavaScript-code in de browser. Beide zijn injection-kwetsbaarheden maar treffen verschillende componenten van de applicatie.
Hoe test je of je applicatie kwetsbaar is voor SQL injection?
Gebruik geautomatiseerde scanners zoals SQLMap, Burp Suite of OWASP ZAP om bekende patronen te testen. Combineer dit met handmatige penetratietesten door beveiligingsexperts die complexere varianten kunnen identificeren. Integreer SAST- en DAST-tools in je ontwikkelproces.
Kan SQL injection leiden tot volledige serverovertake?
Ja, in het ergste geval kan een aanvaller via SQL injection systeemcommando's uitvoeren op de databaseserver, bestanden lezen en schrijven, en volledige controle krijgen over het besturingssysteem. Vandaar dat het least privilege-principe voor databaseaccounts cruciaal is.
Beveilig je webapplicaties. Vergelijk Application Security Testing (AST) aanbieders op IBgidsNL.