Wat is SQL-injectie?

Aanval die misbruik maakt van een webapplicatie die SQL-statements opbouwt door de invoer van de gebruiker eenvoudig aan te plakken, en met de invoer de betekenis van de opdracht verandert om de database onbevoegd te manipuleren. Prepared statements met placeholders zijn de fundamentele tegenmaatregel.

Japanse benaming: SQLインジェクション

“SQL-injectie” komt voor in 3 oefenvragen uit 1 onderwerpen, bijv. Basis van informatiebeveiliging.

Vakgebied: Basis van informatiebeveiliging

Hoe de aanval werkt

Als een applicatie een SQL-statement opbouwt door tekenreeksen zoals „… WHERE name = '”, de invoerwaarde en „'” aan elkaar te plakken, sluit een aanhalingsteken in de invoer de tekenreeks af en wordt alles wat volgt als SQL-opdracht geïnterpreteerd. Met de klassieke invoer uit leerboeken, ' OR '1'='1, wordt de altijd ware voorwaarde „of '1' is gelijk aan '1'” toegevoegd, waardoor de authenticatie kan worden omzeild. Het kan ook leiden tot het lezen, wijzigen of verwijderen van gegevens.

De fundamentele tegenmaatregel

De fundamentele tegenmaatregel is prepared statements met placeholders (geparametriseerde query's). De structuur van het SQL-statement wordt eerst vastgelegd en de invoer wordt daarna alleen als waarden gekoppeld, zodat ze, welke tekens ze ook bevat, nooit deel van een opdracht wordt. De databasebibliotheken en frameworks van veel programmeertalen bieden deze functie. Speciale tekens uit de invoer verwijderen is gevoelig voor leemten, en invoercontroles in de browser kunnen door aanvallers worden omzeild, dus geen van beide is op zichzelf een tegenmaatregel.

Maatregelen die de schade beperken

Bovenop de fundamentele tegenmaatregel komen extra lagen, zoals het account waarmee de applicatie met de database verbindt alleen de minimaal benodigde rechten geven (het principe van minimale rechten), geen gedetailleerde foutmeldingen aan gebruikers tonen en typische aanvalsreeksen detecteren met een WAF (web application firewall). Een WAF is alleen een hulpmiddel en geen vervanging voor het repareren van de applicatie.

Nu oefenen: vragen over SQL-injectie

Waarom worden prepared statements met placeholders (geparametriseerde query's) als tegenmaatregel tegen SQL-injectie als fundamenteler beschouwd dan het verwijderen van gevaarlijke tekens uit de invoer?

  1. AOmdat de invoer wordt versleuteld voordat hij aan de database wordt doorgegeven, zodat aanvallers hem niet kunnen lezen
  2. BOmdat de browser controleert welke soorten tekens worden ingevoerd, zodat kwaadaardige tekenreeksen de server nooit bereiken
  3. COmdat eerst de structuur van het SQL-statement wordt vastgelegd en de invoer daarna alleen als waarden wordt doorgegeven, zodat de invoer, welke tekens hij ook bevat, nooit als deel van de opdracht wordt geïnterpreteerd
Antwoord en toelichting tonen

Antwoord: C. Omdat eerst de structuur van het SQL-statement wordt vastgelegd en de invoer daarna alleen als waarden wordt doorgegeven, zodat de invoer, welke tekens hij ook bevat, nooit als deel van de opdracht wordt geïnterpreteerd

Bij een prepared statement wordt eerst een SQL-statement waarin de waarden door symbolen (placeholders) zijn vervangen, zoals „SELECT … WHERE id = ? AND password = ?”, aan de database doorgegeven om de structuur vast te leggen, en daarna wordt de invoer alleen als waarden gekoppeld (binding). De invoer wordt van begin tot eind als gegevens behandeld, dus zelfs als hij aanhalingstekens bevat, wordt hij nooit deel van een opdracht, zoals een opdracht die een voorwaarde toevoegt. Gevaarlijke tekens verwijderen of escapen vereist dat elke gedetailleerde regel voor elk type database en elke tekencodering zonder uitzondering wordt afgehandeld, en één enkele leemte laat de aanval slagen. Controles van de invoer in de browser kunnen worden omzeild als de aanvaller verzoeken rechtstreeks verstuurt zonder een browser te gebruiken; ze dienen het gebruiksgemak en zijn geen beveiligingsmaatregel. Daarnaast blijft de schade klein als het account waarmee met de database wordt verbonden de minimale rechten krijgt.

Veelgestelde vragen

Kan SQL-injectie worden voorkomen door escapen?

Escapen kan het in sommige gevallen voorkomen, maar elke regel voor elk type database en elke tekencodering moet zonder uitzondering worden afgehandeld, en één enkele leemte laat de aanval slagen. Prepared statements met placeholders zijn daarom de basistegenmaatregel.

Kan SQL-injectie worden voorkomen door de lengte van de invoer te beperken?

Nee. Ook korte tekenreeksen kunnen de betekenis van een opdracht veranderen. Beperkingen van de lengte of van de soorten tekens zijn aanvullende maatregelen; de fundamentele tegenmaatregel is prepared statements.

“SQL-injectie” in de toelichting

Vragen met “SQL-injectie” (3)

  1. Waarom worden prepared statements met placeholders (geparametriseerde query's) als tegenmaatregel tegen SQL-injectie als fundamenteler beschouwd dan het verwijderen van gevaarlijke tekens uit de invoer?
  2. Welke van de volgende is een voorbeeld van social engineering?
  3. In een webapplicatie kan iemand zonder het wachtwoord te kennen inloggen door in het wachtwoordveld van het inlogscherm een tekenreeks zoals ' OR '1'='1 in te voeren. Hoe heet deze aanval?

Verwante termen

SQL Social engineering Phishing Berichtauthenticatiecode (message authentication code) Cross-site scripting (XSS) Digitale handtekening Hashfunctie Multifactorauthenticatie (MFA) Principe van minimale rechten (least privilege) Publieke-sleutelcryptografie (asymmetrische cryptografie)

Naar de woordenlijst