Wat is SQL-injectie (SQLi)?
SQL-injectie (SQLi) is een type aanval waarbij aanvallers kwaadaardige SQL-instructies invoeren in een invoerveld om de database te manipuleren.
Deze aanval richt zich op applicaties die er niet in slagen om validatie en gebruikersinvoer correct af te handelen, waardoor ongeautoriseerde toegang tot gevoelige gegevens zoals wachtwoorden of creditcardgegevens mogelijk wordt.
Hoe SQL-injectie werkt
Wanneer een applicatie gebruikersinvoer direct opneemt in een databasequery zonder juiste validatie, kunnen aanvallers het gedrag van de query wijzigen om een kwaadaardige SQL-instructie in te voeren.
Bijvoorbeeld:
SELECT * FROM users WHERE username = 'admin' AND password = '12345';
Een aanvaller zou kunnen invoeren:
' OR '1'='1
Resulterend in:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
Dit levert altijd waar op, waardoor ongeautoriseerde toegang wordt verleend.
Waarom SQL-injectie belangrijk is in cybersecurity
SQL-injectie is de gevaarlijkste en oudste techniek in cybersecurity. Dit type aanval staat consequent vermeld in de OWASP Top 10.
Zelfs kleine kwetsbaarheden stellen een aanvaller in staat om:
- Toegang tot, wijzigen of verwijderen van gegevens
- Authenticatie omzeilen
- Administratieve bewerkingen op de database uitvoeren.
- Het gehele systeem compromitteren.
Veelvoorkomende Soorten SQL-injectie
- Klassieke SQLi : Directe injectie via webformulieren of URL-parameters.
- Blinde SQLi : Aanvallers leiden database-informatie indirect af (bijv. via foutmeldingen of responstijd).
- Union-gebaseerde SQLi : Gebruikt de UNION-operator om resultaten van meerdere queries te combineren.
- Fout-gebaseerde SQLi : Vertrouwt op databasefoutmeldingen om informatie te extraheren.
- Tijd-gebaseerde Blinde SQLi : Benut serverresponstijdvertragingen om queryresultaten te raden.
Hoe SQL-injectie te Voorkomen
1. Gebruik Geparameteriseerde Queries (Voorbereide Statements)
Zorg ervoor dat SQL-commando’s gebruikersinvoer als data behandelen, niet als uitvoerbare code.
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
2. Invoer Validatie en Sanitisatie
Valideer alle invoer van gebruikers, alleen verwachte tekens toestaan.
3. Gebruik ORM-frameworks
Frameworks zoals Prisma, Hibernate, etc., verminderen directe SQL-afhandeling.
4. Principe van Minimaal Recht
Beperk gebruikersrechten, geef alleen de rechten die nodig zijn.
5. Regelmatige Beveiligingstests
Gebruik applicatiebeveiligingstesttools zoals SAST, DAST of IAST om injectiefouten vroegtijdig op te sporen.
Voorbeeld in de echte wereld
Een website van een online winkel leed onder een inbreuk waarbij aanvallers een SQL-injectie in een inlogformulier gebruikten om creditcardgegevens uit de database te halen.