Begrippen

Wat is SQL-injectie?

SQL-injectie is een aanval waarbij invoer van een gebruiker wordt uitgevoerd als onderdeel van een databasequery. Een aanvaller kan zo gegevens lezen of wijzigen, of de inlog omzeilen.

SQL-injectie (SQL injection, SQLi) is een aanval waarbij een aanvaller eigen SQL-code meegeeft. Dat kan in een invoerveld, een URL of een API-parameter. Als de applicatie die invoer rechtstreeks in een databasequery plakt, voert de database de code van de aanvaller uit. Het is een van de oudste webkwetsbaarheden en staat nog steeds in de OWASP Top 10, in de categorie Injection.

Een voorbeeld

Een inlogformulier bouwt deze query: SELECT * FROM users WHERE name = '[naam]' AND password = '[wachtwoord]'. Vult een aanvaller als naam admin' -- in, dan wordt de rest van de query commentaar. De controle op het wachtwoord verdwijnt en de aanvaller is ingelogd als admin. Hetzelfde principe werkt bij zoekvelden, filters, sorteerparameters en API-endpoints.

Drie soorten SQL-injectie

  • In-band; het resultaat van de query is direct zichtbaar in de pagina of in een foutmelding.
  • Blind; de applicatie toont niets, maar reageert anders (waar/onwaar) of trager (op basis van vertraging). De aanvaller leest de database teken voor teken uit.
  • Out-of-band; de database wordt gedwongen zelf een verbinding te maken, bijvoorbeeld een DNS-verzoek met gegevens erin. Hoe dat in de praktijk gaat, leest u in Blinde SQL-injectie achter rate limiting.

Wat een aanvaller ermee kan

Gegevens lezen uit alle tabellen waar het databaseaccount bij kan, dus ook wachtwoordhashes en persoonsgegevens. Gegevens wijzigen of verwijderen. De inlog omzeilen. Bij een database met te veel rechten soms zelfs bestanden lezen of commando’s uitvoeren op de server. Eén SQL-injectie is daarom vaak een kritieke bevinding.

Hoe u SQL-injectie voorkomt

De echte oplossing is één regel: invoer en query nooit aan elkaar plakken. Gebruik prepared statements (geparametriseerde query’s) of een ORM, een bibliotheek die de query’s voor u opbouwt. Geef het databaseaccount van de applicatie alleen de rechten die het nodig heeft. Valideer invoer als tweede laag, niet als eerste. Een web application firewall (WAF) vertraagt een aanvaller, maar herstelt de fout niet.

SQL-injectie in een Pentrox-assessment

De testers van Pentrox zoeken handmatig naar injectie in elk invoerpunt, ook waar een scanner niets ziet. Denk aan JSON-body’s, headers en tweede-orde-injectie via opgeslagen gegevens. Een gevonden injectie wordt bewezen met een onschuldige query, bijvoorbeeld de databaseversie; er worden geen gegevens gekopieerd. Het rapport bevat de exacte plek, de stappen om het na te doen en het herstel in de code.

Klaar om uw omgeving te beveiligen?

Plan een vrijblijvend intakegesprek om uw assessment af te stemmen. Pentrox identificeert kwetsbaarheden in uw applicaties, infrastructuur en cloudomgevingen voordat aanvallers dat doen.

Plan een intakegesprek