-

Hoe kun je een SQL injection attack voorkomen?

Als we terugkijken op de meest in het oog springende gegevenshacks in de afgelopen jaren, betreft een groot deel hiervan de zogenaamde SQL injection attacks. Vrijwel alle grote data hacks waren het resultaat van SQL injection attacks. Maar wat is een SQL injection attack eigenlijk en hoe kun je deze voorkomen?

De meeste website-eigenaren hebben last van continue pogingen van internetbots om hun website te hacken. Hiervoor hoef je alleen maar even in je Apache of PHP logfiles te kijken en dan zal je bijvoorbeeld veel aanvragen voor URL’s zien die helemaal niet op je website bestaan. URL’s die vaak gebruikt worden door platformen als WordPress, Magento of andere open source platformen. Denk dan aan login.php, wp-login.php etcetera. Dit zijn dan vaak zogenaamde brute force attacks. Men probeert een login pagina te vinden en deze vervolgens met honderden of duizenden veel voorkomende login combinaties te bestoken.

Definitie van een SQL injection attack

Een SQL injection attack is eigenlijk het van buitenaf uitvoeren van kwaadwillende SQL-queries in de databases waarop websites draaien. Een SQL injection attack kan echt van buitenaf uitgevoerd worden, er is geen rechtstreekse server of database toegang voor nodig. Een SQL injection attack kan wel gebruikt worden om vervolgens rechtstreekse toegang tot de server of database te verkrijgen.

Belangrijk om te weten is dat een SQL injection attack 100 procent te voorkomen is door juiste programmacode. Als ik je echter vertel dat zelfs de grote open source systemen als WordPress, Magento, Joomla en noem ze maar allemaal op gaten hebben of hadden waardoor SQL injection attacks konden plaatsvinden, dan kun je alleen maar vermoeden dat de vele maatwerkwebsites die Twinkle200 leden nog gebruiken al helemaal kwetsbaar zijn.

Wat is een schadelijke URL voor een SQL injection attack?

Alle websites waar een database achter draait zijn in potentie vatbaar voor een SQL injection attack. Dit betreft dus sowieso alle e-commercewebsites, blogsites en dergelijke. Potentieel schadelijk zijn met name de URL’s waarin een of andere parameter wordt meegegeven die vervolgens leidt tot het weergeven van dynamische content uit de database op die webpagina.
Laten we eens even een concreet voorbeeld geven van een URL op bol.com:

https://www.bol.com/nl/l/parfums/N/12428/

Dit betreft een categoriepagina op bol.com van de categorie parfum. Blijkbaar heeft deze parfumcategorie in de database de categorie-ID 12428. De content op deze specifieke webpagina wordt genereerd op basis van deze ID 12428. Op basis van deze ID wordt op de achtergrond een query gedraaid op de bol.com-database waarbij de categorie-informatie wordt opgehaald en weergegeven wordt in de browser.

Nu heb ik geen flauw idee of bol.com zich ingedekt heeft tegen SQL injection attacks. Dus het voorbeeld wat nu wordt gegeven is puur hypothetisch en heb ik zelf niet uitgeprobeerd op deze URL.
Stel dat de bol.com-programmeurs in hun programmeercode ergens de volgende constructie hebben:

idcode = request.POST[‘id’]
sql = “SELECT * FROM categories WHERE id=’” + idcode + “’”
database.execute(sql)

De code die hierboven staat weergegeven is gevoelig voor een SQL injection attack.

Stel dat de gebruiker in de internet browser namelijk de bovenstaande bol.com URL zou wijzigen naar:

https://www.bol.com/nl/l/parfums/N/12428’ OR 1=1/

De SQL query in de programmeercode zou daarmee worden:

SELECT * FROM categories WHERE id=’12428’ OR 1=1’

Dit heeft als gevolg dat alle categorie-informatie wordt weergegeven. Dit is een heel simpel voorbeeld, maar een aanvaller zou op dezelfde wijze een ander SQL statement erachter kunnen plakken wat bijvoorbeeld een uitdraai maakt van alle tabelnamen in de database. Op basis hiervan zou hij vervolgens dezelfde URL kunnen gebruiken om een uitdraai te maken van alle gebruikers en hun wachtwoorden (door de juiste tabelnaam te kiezen).

Wat is het ergste wat een aanvaller zou kunnen doen met een SQL injection attack?

Een SQL injection attack geeft dus min of meer rechtstreekse ongeautoriseerde toegang tot de database. Wat zou een aanvaller kunnen doen? Downloaden, aanpassen of verwijderen van alle data die in de database aanwezig is.

Wat zijn de simpele voorwaarden voor een SQL injection attack?

Eigenlijk zijn er maar twee hele simpele voorwaarden:
• De database moet op SQL gebaseerd zijn (maar alle grote databases zoals MySQL, Oracle, SQL Server zijn gebaseerd op SQL)
• Een gebruiker-gecontroleerde input in een URL die rechtstreeks leidt tot een database query

Hoe kun je een SQL injection attack voorkomen?

Eigenlijk heel simpel. Door de input te controleren. Heb je URL’s op je website (zoals bol.com) waarbij bijvoorbeeld een ID-nummer van een categorie of product tot de output op de webpagina leiden? Zorg dan altijd dat je niet zomaar het veronderstelde ‘ID nummer’ uit de URL overneemt in de query, maar controleer of het überhaupt een nummer is en of het nummer voldoet aan de voorwaarden die je daaraan stelt. Bij URL’s met tekst erin die leidt tot een SQL query wordt het wat moeilijker. Controleer dan tevens of het een string is, maar ook of de input string voldoet aan wat je ervan verwacht.

Standaard systemen en hun beveiliging tegen SQL injection attacks

Magento heeft afgelopen jaar heel veel beveiligingsupdates gelanceerd waarmee een groot deel (of zelfs alle) SQL injection attacks voorkomen zouden moeten worden. WordPress staat algemeen bekend als een platform wat nog steeds erg toegankelijk is voor hackaanvallen. Controleer dus goed of je standaardplatform goed beveiligd is tegen SQL injection attacks. Zeker als je maatwerk gebruikt, moet je dus goed letten op URL’s waarin dit soort parameters zijn opgenomen. Controleer dus goed of de parameter input goed gecontroleerd wordt op het voldoen aan de ‘verwachte’ input voordat het gebruikt wordt in een SQL query.

Deel dit bericht

Plaats een reactie

Uw e-mailadres wordt niet op de site getoond