Wat is een SQL-injectie? [MakeUseOf Explains]
De wereld van internetbeveiliging wordt geplaagd door open poorten, achterdeurtjes, gaten in de beveiliging, Trojaanse paarden, wormen, kwetsbaarheden voor firewalls en een hele reeks andere problemen die ons dagelijks scherp houden. Voor privé-gebruikers lijken virussen en wormen de slechtste van de mogelijkheden. Maar voor iedereen die een database beheert, is de SQL-injectie een van de meest destructieve beveiligingsproblemen die er zijn.
Databases zijn zeer waardevol op het gebied van computers. Ze zijn essentieel voor het opslaan van gegevens als geheugen en het tonen van de verschillende relaties tussen gegevenspunten. Hier bij MakeUseOf hebben we een groot aantal databases gewijd aan verschillende taken: één voor al onze artikelen, één voor onze gebruikersbasis, één voor ons Rewards-programma en de lijst gaat maar door. Wat gebeurt er wanneer onze databases kwaadwillig worden aangevallen - of zelfs vernietigd?
Wanneer u geen daadwerkelijke toegang tot een database hebt, is de SQL-injectie een van de meest prominente vormen van aanvallen. Blijf lezen om te leren wat het precies is en hoe het zo gevaarlijk kan zijn.
Wat is SQL, Hoe dan ook?
Om SQL-injectie te begrijpen, moet u eerst begrijpen wat SQL is en hoe het zich verhoudt tot een website. SQL, dat staat voor Structured Query Language, is een type programmeertaal die is geoptimaliseerd voor het beheren van tabelgegevens. In alle opzichten is het voor programmeurs een manier om met een database te communiceren en opdrachten te geven.
Wanneer een database wordt gebruikt, worden er SQL-opdrachten gegeven en verwerkt. Als u nadenkt over alle tijden waarop een database wordt behandeld, concludeert u dat dit slechts in een handvol omstandigheden gebeurt:
- Wanneer nieuwe gegevens moeten worden ingevoegd,
- Wanneer de huidige gegevens moeten worden gewijzigd,
- Wanneer oude gegevens moeten worden verwijderd,
- Wanneer een bepaald gegeven moet worden doorzocht en opgehaald.
Elke keer dat een van deze acties moet plaatsvinden, wordt ergens op een server een SQL-opdracht uitgevoerd. Voor het grootste deel bepaalt de programmeur wanneer en waar deze SQL-opdrachten in de broncode voorkomen. Er zijn echter onvermijdelijke omstandigheden waarin een gebruiker een manipulatie van een database kan afdwingen - en die kansen zijn overal om je heen.
Heb je ooit ingelogd op een website? Heb je ooit een opmerking geplaatst op een blogartikel of een antwoord in een forumthread? Heeft u ooit een Facebook-bericht naar een vriend gestuurd? Heeft u een e-mail in Gmail getypt? Gezocht naar een website op Google? Telkens wanneer u een invoerveld op een website ziet (gebruikersnaam, wachtwoord, zoekopdracht, berichtenvenster, enz.), Wordt die tekst naar de database verzonden en gehandeld op.
Nu, als een kwaadwillende gebruiker wilde knoeien met een database, zijn er niet veel keuzes voor hem. Een mogelijkheid zou zijn om daadwerkelijk te winnen fysiek toegang tot de server en vernietig deze aan de basis. Maar verder is het voor de kwaadwillende gebruiker het meest logisch om een bestaande SQL-opdracht te kapen wanneer een invoerveld wordt gebruikt, waardoor de server wordt gedwongen een andere opdracht uit te voeren dan oorspronkelijk was bedoeld.
De SQL-injectietechniek
Deze handeling van het kapen van een bestaande SQL-opdracht is waarnaar SQL-injectie verwijst. Waarom heet het injectie? Omdat het kapen van een SQL-opdracht vereist dat de gebruiker zijn eigen SQL-code injecteert bij gebruik van een invoerveld. Klinkt dat verwarrend? Laat me dit illustreren met een voorbeeld.
Overweeg de aanmeldingspagina van MakeUseOf. Wanneer u uw gebruikersnaam en wachtwoord invoert en klikt “voorleggen“, u dwingt de webserver om een SQL-opdracht te genereren met de informatie die u zojuist hebt gegeven, dat wil zeggen uw gebruikersnaam en wachtwoord. De database ontvangt de informatie, verifieert dat de combinatie gebruikersnaam / wachtwoord correct is en geeft u vervolgens de juiste toegang tot andere delen van de site.
Stel je nu voor wat er zou gebeuren als een kwaadwillende gebruiker zijn gebruikersnaam en wachtwoord niet invoerde, maar in plaats daarvan een SQL-opdracht typte als zijn gebruikersnaam? Als de servercode niet goed is beveiligd, ontvangt de database de gebrekkige gebruikersnaam (wat eigenlijk een SQL-opdracht is) en voert deze in feite uit als een opdracht.
En daarom heet het injectie. De SQL-opdracht wordt met volledig legitieme middelen in de database geïnjecteerd en zodanig gemanipuleerd dat het uiteindelijk iets doet dat niet bedoeld was om te doen.
Een geavanceerd voorbeeld
Tot nu toe heb ik SQL-injectie beschreven in termen van hoog niveau zodat iedereen het kan begrijpen, zelfs degenen zonder programmeerkennis. In dit gedeelte ga ik een concreet voorbeeld geven van hoe deze techniek is mogelijk. Als je een SQL-beginner bent, of als je nog nooit eerder met programmeren hebt gewerkt, kun je dit gedeelte in stilte overslaan.
Wanneer u zich aanmeldt bij een website, is hier een mogelijke manier om de code in SQL te schrijven:
SELECT user_id
VAN gebruikers_db
WHERE gebruikersnaam = "$ gebruikersnaam" EN wachtwoord = "$ wachtwoord"
Kortom, de opdracht vraagt de database om alles terug te sturen user_ids van de tafel users_db die overeenkomen met de ingevoerde combinatie van gebruikersnaam en wachtwoord. Ziet er allemaal goed en dandy uit, toch??
Laten we aannemen dat het inlogformulier de volgende invoer kreeg:
Gebruikersnaam: David
Wachtwoord: fubar 'OF' x '=' x
Merk op dat het wachtwoordveld niet begint of eindigt met een apostrof. Wanneer de server deze inlogpoging ontvangt, zal het alles in het wachtwoordveld opnemen en in plaats van het $ wachtwoord in de code plaatsen. De resulterende SQL-opdracht ziet er als volgt uit:
SELECT user_id
VAN gebruikers_db
WHERE gebruikersnaam = "David" EN wachtwoord = 'fubar 'OF' x '=' x'
Wanneer de server deze opdracht uitvoert, zal het laatste deel van die SQL-opdracht altijd keer terug waar. Dit betekent dat de kwaadwillende gebruiker elke gebruikersnaam kan invoeren en direct toegang kan krijgen tot dat account, omdat de login zou werken, ongeacht of hij het wachtwoord juist had.
Natuurlijk is inloggen op iemands account een nogal milde inbreuk als je het vergelijkt met alle andere mogelijke hackpogingen: hele databases verwijderen, alle gegevens mopperen of zelfs diefstal de gegevens in de databases.
Professionele webontwikkelaars worden steeds beter in het voorkomen van dergelijke trucs, maar af en toe hoor je dat een bedrijf verlies leed door een SQL-injectie-aanval. Als het gebeurt, weet je nu wat het betekent en hoe het mogelijk is.
Image Credit: Intro Image Via Shutterstock, Database Schema Via Shutterstock, HACKED Via Shutterstock