SQL-injectie

Laatst bijgewerkt: 14/02/2025

SQL-injectie is een veelvoorkomende beveiligingskwetsbaarheid waarbij een aanvaller kwaadaardige SQL-code injecteert in een query die naar de database wordt gestuurd. Hierdoor kan de aanvaller:

  • Gevoelige gegevens bekijken: Zoals gebruikersnamen, wachtwoorden, e-mailadressen of creditcardgegevens.
  • Gegevens manipuleren: Informatie wijzigen, verwijderen of nieuwe gegevens toevoegen.
  • Beheerderstoegang verkrijgen: Door in te loggen zonder geldig wachtwoord.
  • Uitvoeren van beheerfuncties: Zoals het stoppen van de database of het uitlezen van configuratiebestanden.

Het is een van de oudste en nog steeds meest voorkomende vormen van aanvallen op webapplicaties vanwege de eenvoud en de impact die het kan hebben.


Hoe werkt SQL-injectie?

SQL-injectie werkt door gebruikersinvoer direct in een SQL-query op te nemen zonder voldoende validatie of ontsmetting. Hierdoor kan een aanvaller de structuur van de query manipuleren.

Voorbeeld van een kwetsbare query:

<?php
$gebruikersnaam = $_GET['gebruikersnaam'];
$query = "SELECT * FROM gebruikers WHERE gebruikersnaam = '$gebruikersnaam'";
$resultaat = mysqli_query($connectie, $query);
?>
Als een aanvaller de URL als volgt manipuleert:
https://voorbeeld.nl/?gebruikersnaam=' OR '1'='1
Dan wordt de query als volgt uitgevoerd:
SELECT * FROM gebruikers WHERE gebruikersnaam = '' OR '1'='1';

Omdat 1='1' altijd waar is, worden alle gebruikers uit de database opgehaald!


Verschillende soorten SQL-injecties:

1. Classic SQL Injection (Eenvoudige injectie):

    • Aanvaller manipuleert direct de query-structuur.
    • Voorbeeld:
' OR '1'='1
 

2. Union-based SQL Injection:

  • Aanvaller gebruikt de UNION-operator om resultaten uit andere tabellen op te halen.
  • Voorbeeld:
' UNION SELECT gebruikersnaam, wachtwoord FROM admin --

3. Blind SQL Injection:

  • Wanneer de applicatie geen directe uitvoer geeft, maar alleen een succes- of foutmelding.
  • De aanvaller stelt vragen aan de database via true/false-queries.
  • Voorbeeld:
' AND 1=1 -- (Geeft toegang)
' AND 1=2 -- (Geeft geen toegang)

4. Error-based SQL Injection:

  • Door fouten uit te lokken in de database om zo informatie te achterhalen.
  • Voorbeeld:
 ' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT database()),0x3a,FLOOR(RAND(0)*2)) AS x FROM informatie_schema.tafels GROUP BY x) a) -- 

Hoe voorkom je SQL-injectie?

  1. Gebruik van Prepared Statements (Voorbereide statements):

    • Scheidt de querystructuur van de gebruikersinvoer, waardoor manipulatie onmogelijk wordt.
    • Voorbeeld in PHP (MySQLi):
$stmt = $connectie->prepare("SELECT * FROM gebruikers WHERE gebruikersnaam = ?");
$stmt->bind_param("s", $gebruikersnaam);
$stmt->execute();

 

  1. Invoervalidatie en ontsmetting:

    • Controleer en beperk wat gebruikers kunnen invoeren (bijvoorbeeld alleen alfanumerieke tekens voor gebruikersnamen).
  2. Minimale databaseprivileges:

    • Geef databasegebruikers alleen de noodzakelijke rechten (bijv. alleen SELECT voor leesoperaties).
  3. Gebruik van ORM's (Object-Relational Mappers):

    • Frameworks zoals Eloquent (Laravel), Doctrine (Symfony) en Hibernate (Java) ontsmetten automatisch de invoer.
  4. Error handling uitschakelen in productie:

    • Toon geen gedetailleerde foutmeldingen aan eindgebruikers, zodat aanvallers geen informatie kunnen achterhalen.
  5. Wachtwoord hashing:

    • Gebruik veilige hashing-algoritmes zoals bcrypt of argon2 voor wachtwoorden.
  6. Gebruik van Web Application Firewalls (WAF):

    • Een WAF kan verdachte query's en patronen detecteren en blokkeren.

Voorbeeld van een beveiligde query met Prepared Statements:

<?php
$gebruikersnaam = $_GET['gebruikersnaam'];
$stmt = $connectie->prepare("SELECT * FROM gebruikers WHERE gebruikersnaam = ?");
$stmt->bind_param("s", $gebruikersnaam);
$stmt->execute();
$resultaat = $stmt->get_result();
?>
  • Waarom veilig? De query en de parameter worden gescheiden verwerkt, waardoor manipulatie onmogelijk wordt.

Conclusie:

SQL-injectie is een krachtige aanvalsmethode die ernstige schade kan veroorzaken, zoals datadiefstal of het volledig overnemen van de database. Door gebruik te maken van Prepared Statements, invoervalidatie, minimale privileges en beveiligingsframeworks kun je SQL-injecties effectief voorkomen.

 

 

 

Kiyoh

9.9

gebaseerd op 465 beoordelingen

Beoordeel >

Mediawax werkt met o.a.

Installatron Partner Imunify 360 Secured PHP 8 op alle servers Kernelcare Sectio ssl-certificaten Gratis Let's Encrtypt certificaten