0 Minuten lezen
0 Min
22 jun 2022

Welkom terug bij onze blogserie over de meest gerapporteerde kwetsbaarheden in onze Bug Bounty- en CVD-programma's. 

In onze vorige blogs hebben we al inzichten onthuld over XSS- en IDOR-kwetsbaarheden. Als je die nog niet hebt gelezen, haast je dan en ontdek meer over deze twee meest gerapporteerde kwetsbaarheden. 

Maar vandaag gaan we het hebben over Structured Query Language (SQL) injectie en de soorten van deze kwetsbaarheid bespreken, welke daarvan het meest voorkomend zijn, waar ze zich voordoen, evenals wat de uitkomst van een mogelijke aanval zou kunnen zijn. Hierna ontdek je de manieren om de impact te mitigeren en, het belangrijkst, de stappen die men mogelijk kan ondernemen om deze kwetsbaarheid te voorkomen!

SQL-injectie

SQL, of Structured Query Language, is een de facto standaardtaal die wordt gebruikt voor interactie met databases. Het stelt je in staat om gearchiveerde gegevens uit een database te organiseren, beheren en ophalen. SQL-injectie is een kwetsbaarheid waarbij een aanvaller met een database kan interageren door SQL-instructies te wijzigen. Dit gebeurt vaak via formulieren zoals invoervelden, inlogformulieren of in de URL. 

In-band SQL-injectie

Wanneer de gegevens worden geretourneerd in de reactie van de website, wordt dit in-band SQL-injectie genoemd. Omdat de gegevens onmiddellijk worden geretourneerd, is deze vorm van SQL-injectie gemakkelijk te detecteren. Bij het veroorzaken van een fout worden er informatie over de structuur van een database geretourneerd in de foutmelding. Dit kan vervolgens worden gebruikt om tabellen, kolommen en andere nuttige informatie op te sommen.

Wanneer de structuur van de tabellen bekend is, kan UNION in een verklaring worden gebruikt om gegevens uit willekeurige tabellen op te halen.

Out-of-band SQL-injectie

Wanneer de gegevens worden geretourneerd via een ander kanaal dan de website, wordt dit out-of-band SQL-injectie genoemd. Een aanvaller kan een verzoek doen aan een website die kwetsbaar is voor SQL-injectie met een payload. Deze payload verzamelt informatie uit de database en stuurt deze terug naar een door de aanvaller beheerde dienst. Bijvoorbeeld, in een payload wordt gegevens verzameld die vervolgens terug worden gestuurd naar de luisterdienst van de aanvaller met een DNS-verzoek.
Out-of-band SQL-injectie is minder gebruikelijk omdat deze kwetsbaarheid alleen optreedt wanneer specifieke functies zijn ingeschakeld op de databaseserver.

Blind SQL-injectie

Bij blind SQL-injectie worden er minder gegevens geretourneerd in de respons. Dit maakt het moeilijker om informatie te verkrijgen, maar toch is deze vorm van injectie niet minder gevaarlijk. Ook al is het moeilijker om informatie te verkrijgen, het is nog steeds mogelijk om met de database te interageren en informatie te verwijderen, te wijzigen of te verkrijgen.

Om te weten of een SQL-instructie succesvol was of niet, kan SLEEP(5) worden gebruikt. Dit veroorzaakt 5 seconden vertraging met een succesvolle instructie. Als er geen pauze in de respons is, was de instructie niet succesvol.

Een andere methode om te bepalen of een SQL-instructie succesvol is, is door gebruik te maken van SQL-query's die resulteren in booleaanse waarden. De resulterende waarde zal iets zijn als Waar/Onwaar. Een Waar, of het equivalente van Waar, antwoord bevestigt dat de SQL-instructie succesvol was.

SQL-injectie kan worden misbruikt om gegevens uit een database te extraheren, maar een ander gebruik is het omzeilen van authenticatie. Bijvoorbeeld, bij het inloggen op een website controleert de database of de invoer overeenkomt met de informatie in de database. Als de opgegeven gebruikersnaam en wachtwoord overeenkomen, wordt er een booleaanse waarde Waar geretourneerd. Dit wetende, is het niet eens nodig om gebruikersnamen en wachtwoorden uit de database op te halen. Alles wat nodig is, is een manier om de query die wordt gebruikt om de gebruiker te authentiseren, te dwingen om te evalueren naar Waar. Dit kan gedaan worden door ‘ OF 1=1;– in te voeren in een wachtwoordformulier bij het opgeven van een bestaande gebruikersnaam. Aangezien 1=1 een waarheidsgetrouwe verklaring is, retourneert de database Waar aan de applicatie, waarna een aanvaller inlogt zonder geldige referenties.

Impact

Een SQL-injectie-aanval kan leiden tot ongeautoriseerde toegang tot alle gegevens die in een database zijn opgeslagen, of zelfs de uitvoering van besturingssysteemcommando's. Deze informatie kan vervolgens worden gebruikt om zich voor te doen als een gebruiker, of om meer toegang te krijgen door gebruik te maken van de beheerdersreferenties.

Een andere impact is de wijziging van de database, wat betekent dat de informatie kan worden gewijzigd of verwijderd. Door gegevens te verwijderen kan de beschikbaarheid van een applicatie worden beïnvloed.

Ernst

Vanwege de hoge impact en de vele mogelijkheden met SQL-injectie wordt het vaak beschouwd als een hoge of kritieke kwetsbaarheid.

SQL-injectie voorkomen

Voorbereide instructies met geparametriseerde queries kunnen worden gebruikt om SQL-injectie te voorkomen.

Een voorbereide instructie-query is een manier om een SQL-instructie voor te compileren, zodat je alleen de parameters hoeft op te geven die in de instructie moeten worden ingevoegd voor de uitvoering. 

Dit zorgt ervoor dat een aanvaller de intentie van een query niet kan wijzigen, zelfs als SQL-injectie mogelijk is.

Mitigeren

Er zijn manieren om de impact te mitigeren wanneer preventie van SQL-injectie niet mogelijk is. 

Om SQL-injectie te mitigeren, moet gebruikersinvoer gefilterd worden. Tekens die kunnen worden gebruikt om SQL-injectie uit te lokken, kunnen op een zwarte lijst worden gezet. Een andere manier om ervoor te zorgen dat deze tekens niet kunnen worden gebruikt, is met output-encoding. Met output-encoding worden de tekens die voor SQL-injectie worden gebruikt, omgezet naar een equivalent van dat teken. Op deze manier worden de tekens niet herkend als SQL-taal en zullen ze niet als zodanig worden uitgevoerd. 

Een WAF (Web Application Firewall) kan helpen beschermen tegen SQL-injectie door het verkeer tussen de website en het internet te filteren.

Outputfiltering en een WAF helpen alleen de impact te mitigeren en mogen niet worden vertrouwd om SQL-injectie te voorkomen.

Meer informatie

We hopen dat je deze informatie nuttig vond, en we hebben nog veel meer interessante inzichten over de meest gerapporteerde kwetsbaarheden die nog komen! Blijf op de hoogte voor de aankomende blog!