Wat is SQL injection?
Leer alles over een SQL injectie en hoe jij dit kan voorkomen!
In het kort
SQL injectie is een type cyberaanval waarbij een hacker kwaadaardige code gebruikt om de database van een website te manipuleren en toegang te krijgen tot gevoelige informatie.
Een SQL injectie aanval stelt een hacker in staat gegevens te zien waar hij geen toegang toe heeft of die hij niet kan bemachtigen. De gegevens zijn vaak gevoelig en niet bedoeld om te delen met anderen.
Wat wil de hacker met de gegevens? Gewoonlijk zal de hacker de gegevens uit de webapplicatie verwijderen of ze helemaal veranderen om problemen te veroorzaken. In sommige gevallen zal de aanvaller een SQL injectie aanval uitvoeren op de server van de webapplicatie om de werking ervan te compromitteren.
Kanttekening: In dit artikel ga je veel Engelse termen lezen, dit komt omdat SQL eigenlijk altijd in het Engels gebruikt wordt, veel Nederlandse programmeurs geven ook de voorkeur aan het gebruik in Engels.
De impact van een SQL injectie
Vooral grote bedrijven ondervinden schade van SQL injectie aanvallen. Het spreekt voor zich dat een SQL injectie aanval veel negatieve gevolgen heeft. Zo zal je bedrijf privé gegevens van klanten verliezen: dat is vreselijk voor de reputatie van je bedrijf. Het is tevens illegaal om dit soort informatie te verliezen vanwege de wet op de gegevensbescherming. Er zit een kans in dat je ook nog eens aangeklaagd zal worden door de overheid. Daarom is het essentieel om preventieve maatregelen te nemen om een SQL injectie aanval te voorkomen.
Voorbeeld van een SQL injection attack
Laten we eens een voorbeeld van een SQL injectie aanvoel. Stel je voor dat je een e-commerce website hebt. Je hebt een categorie gewijd aan de verkoop van sneakers. Een gebruiker is geïnteresseerd in het kopen van sneakers, dus bezoekt hij die categorie op je website. Wanneer de gebruiker op de categorie klikt, zal zijn browser vragen:
https://fake-website.com/products?categorie=Sneakers.
Je webapplicatie zal een SQL-query uitvoeren om relevante informatie over die categorie uit de database te halen. De SQL-query zal waarschijnlijk als volgt luiden:
Select * FROM products WHERE category = ‘Sneakers’ AND released = 1
In dit geval vraagt de SQL query de database om details van de producten categorie die je hebt, specifiek, je sneakers categorie.
Released = 1 is een restrictie. De nummer 1 zit in de link om producten te verbergen die nog niet gelanceerd zijn. Bijvoorbeeld, je hebt andere variaties van sneakers die je later wilt uitbrengen. De 1 zal ervoor zorgen dat ze niet beschikbaar zijn voor het publiek.
Het kan zijn dat jouw webapplicatie geen enkele manier om zich tegen een SQL injectie aanval te beschermen. Een aanvaller kan dus, helaas, op een manier als deze aanvallen:
https://fake-website.com/products?category=Sneakers’–
Dit zal resulteren in een SQL query die er als volgt uitziet:
Selecteer * FROM products WHERE category = ‘Sneakers’–‘ AND released = 1
De dubbele streepjes reeks is een indicator die aangeeft dat de query een reactie is. Als het systeem gelooft dat de query een commentaar is, kan het niet weten dat het om een aanval gaat. Vervolgens verwijdert het dubbele streepje de rest van de query (AND released = 1), waardoor informatie over al je producten in je categorie wordt vrijgegeven. Ook informatie die nog niet aan het publiek zijn vrijgegeven. Verder kan de aanvaller een SQL aanval sturen om alles te zien wat je nog meer op je website verkoopt.
De aanvaller zal op deze manier aanvallen:
https://fake-website.com/products?catgory=Sneakers’+OR+1=1–.
Dit zal resulteren in een SQL query die er als volgt uitziet:
Select * FROM products WHERE category = ‘Sneakers’ OR 1=1–‘ AND released = 1
Het versturen van deze query geeft informatie over alle artikelen op je website. Er zijn nog veel meer manieren waarop een aanvaller een SQL injectie aanval kan uitvoeren. Laten we ze kort aanstippen.
- Booleans
De aanvaller stuurt een SQL query om snel een resultaat uit de database terug te geven. Door de Boolean methode te gebruiken, kan de aanvaller bepalen of het geretourneerde resultaat waar of onwaar was. Dit gebeurt zonder dat je kan zien dat jouw database benaderd is. Met deze manier van aanvallen kan men je database uitlezen zonder dat jij dit door hebt.
- Tijdsvertraging
De aanvaller stuurt een query om de database te laten wachten. Hij creëert hiermee een tijdvertraging. Met deze methode weet de aanvaller aan de hand van de tijd die de database nodig heeft om te reageren of de vraag die hij stuurde waar of onwaar was.
- Buiten-band-netwerk
De aanvaller kan een out-of-band aanval uitvoeren als de server die de database gebruikt bepaalde benodigde eigenschappen heeft. De aanvaller zal via het out-of-band kanaal gegevens onttrekken en die ergens anders plaatsen. Deze soort aanval rekent erop dat de server een DNS of HTTP verzoek aanmaakt om de privé gegevens naar de aanvaller over te brengen.
SQL injectie aanvallen
De SQL injectie aanvallen die het meeste voorkomen, zitten in de ‘where clause’ van een select query. Het kan echter ook binnen verschillende query types gebeuren. Denk dan aan ‘update statements’, ‘insert statements’, ‘select statements’, en ‘order by clausule’.
Zo voorkom je een SQL injectie aanval
Er is goed nieuws: je kunt vandaag al maatregelen nemen om een SQL injectie aanval te voorkomen. Het is namelijk zo dat het merendeel van de SQL injectie kwetsbaarheden snel kan gevonden worden.
- Een kwetsbaarheidsscanner gebruiken
Een optie is om een ‘web kwetsbaarheden scanner’ te gebruiken. Je kunt deze scanner gebruiken door tests op te zetten tegen elke ingang van de applicatie. Via deze weg kun je zoeken naar fouten, systematische verschillen en de antwoorden die je op de applicatie krijgt.
- Ingangsvalidatie en WAF
Schrijf een code die onwettige gebruikers kan identificeren. Let wel: dit is geen kogelvrije methode als dit het enige is dat je doet om een SQL injectie aanval te voorkomen Het is het beste als je deze methode gebruikt terwijl je ook een web application firewall installeert. De WAF filtert SQLI en andere online bedreigingen uit.
Als de WAF signaleert dat er een onwettige gebruiker is, zal hij eerst de IP gegevens verifiëren voor hij het verzoek blokkeert. Als de IP gegevens een slechte reputatie hebben, worden ze op basis daarvan geblokkeerd.
Stay safe!