Wat is SQL Injection?
SQL Injection is een hack techniek die vaak wordt toegepast op websites en applicaties. Een SQL Injection is een database (SQL, MySQL, Oracle etc.) hack waarmee gegevens uit de database kunnen worden gehaald, gemodificeerd en waarbij de hacker in sommige gevallen controle over de server kan nemen.
In dit artikel geef ik meer uitleg over SQL Injection. Ik ga niet stap-voor-stap uitleggen hoe je een SQL Injection moet toepassen. Na het lezen van dit artikel snap je het idee van een SQL Injection en waarom deze zo gevaarlijk is. Ook lees je hoe je jezelf kunt beschermen.
Wat is een database?
Om te begrijpen wat een SQL injection is moet je eerst begrijpen wat een database is. In de basis is een database een digitaal archief van data. Dit archief bestaat uit verschillende archiefkasten (de tabellen in de database) die allen bepaalde data bevatten die op een gespecificeerde manier geordend is. Elke tabel in de database bestaat uit regels. Deze regels bevatten de data. De kolommen bevatten het type. Dus:
UniekID: | Gebruikersnaam: | Wachtwoord: |
1 | gebruiker1 | testwachtwoord |
2 | gebruiker2 | wachtwoord2 |
3 | gebruiker3 | wwtest3 |
etc…
Waarom een database hacken?
We weten dat een database dus data bevat. Meestal bevat een database zeer waardevolle informatie. De belangrijkste redenen om een database te hacken zijn:
- Inloggegevens voor het CMS verkrijgen of zelf toevoegen
- Datadiefstal, dus b.v. klantgegevens achterhalen voor de verkoop
- De database engine misbruiken om toegang tot de server te krijgen
- Schade, dus data verwijderen om zoveel mogelijk schade aan het bedrijf toe te brengen
Wat moet je weten alvorens je een SQL Injection kunt toepassen?
Om een SQL Injection succesvol toe te passen moet je op de hoogte zijn van SQL commando’s. Als je een doel om te hacken hebt is dat voldoende om informatie te achterhalen.
SQL Injection voorbeeld en waarom het werkt:
-
De doelwebsite beschikt over een zoekmachine om gegevens op te zoeken. Zo kan ik bijvoorbeeld op de term “appel” zoeken. De zoekmachine stuurt dan het volgende commando naar de database:
SELECT * FROM fruit WHERE naam = 'appel'
-
In bovenstaande voorbeeld zal de webpagina alle teksten en producten retourneren waar het woord “appel” in voorkomt. Maar stel nu voor dat de zoekopdracht een apostrof zou bevatten. Dan zou het eruit zien als:
SELECT * FROM fruit WHERE naam = '’t appeltje'
Omdat de apostrof in SQL een belangrijke functie heeft, namelijk het afbakenen van niet numerieke gegevens zal bovenstaande query een foutmelding opleveren. Want de apostrof alleen is geen geldige zoekwaarde. Echter is deze foutmelding het startpunt van een SQL Injection. De foutmelding betekend namelijk dat data niet goed gecontroleerd en verzonden worden. Als dit wel gebeurt zou zijn van zou de apostrof in de query omsloten worden door 2 andere apostroffen of zou deze voorafgaan aan een slash. Bijvoorbeeld:
SELECT * FROM fruit WHERE naam = '’’’t appeltje'
SELECT * FROM fruit WHERE naam = '\’t appeltje'
-
Het feit dat een foutmelding gegenereerd wordt betekend dus dat de apostrof niet juist wordt ontvangen. De databaseserver probeert in dit geval eerst het commando voor de apostrof uit te voeren en daarna het volgende command (t appeltje). Omdat “t appeltje” geen geldig commando is wordt de foutmelding geretourneerd.
Met deze kennis zou de hacker bewust een foutief commando kunnen genereren om meer data retour te krijgen. Want we willen niet alleen alles van “appels” zien maar gewoon alles in de tabel. In dat geval zou de gebruiker het volgende kunnen invoeren:
"appel' OR 'a' = 'a"
Dit resulteert dan in de query:
SELECT * FROM fruit WHERE naam = 'appel' OR 'a' = 'a'
Nu voldoet elke regel aan de query omdat a altijd a is. Dus alles wordt geretourneerd omdat elke regel voldoet.
-
Op dezelfde manier kunnen we ook gegevens verwijderd worden en data toegevoegd worden. De volgende code’s werken op dezelfde manier:
Invoer: “’; drop table fruit–” resulteert in de query:
SELECT * FROM fruit WHERE naam = '`; drop table fruit--
Invoer: “`; insert into fruit values( 4, ‘peer’ )–” resulteert in de query:
SELECT * FROM fruit WHERE naam = '`; insert into fruit values( 4, 'peer' )--
- Als je handig bent met SQL commando’s en de SQL server foutmeldingen retourneert is het relatief makkelijk om de database en tabel structuur te achterhalen. Als je deze weet is het weer relatief eenvoudig om bijvoorbeeld zelf gebruikersnamen en wachtwoorden toe te voegen waarmee je bijvoorbeeld root toegang tot het CMS systeem kunt krijgen. Ook is het mogelijk om bijvoorbeeld prijzen in webshops aan te passen. Nog vervelender wordt het wanneer er middels SQL Injection ook toegang verkregen kan worden tot de server. Dit kan middels de “stored procedure”, het xp_cmdshell commando.
-
Door deze stored procedures aan te roepen kan de hacker belangrijke informatie verkrijgen over de server en deze ook misbruiken.
exec master..xp_cmdshell 'net1 user'
Dit commando laat alle gebruikersaccounts op de machine zien.
exec master..xp_cmdshell 'dir'
Dit commando laat de directory structuur zien vanuit de SQL server werkdirectory.
- Een andere gevaarlijk te misbruiken stored procedure is het xp_regread commando waarmee het register (en dus eventueel de SAM) gelezen en bewerkt kan worden.
Waarom werkt een SQL injection?
In bovenstaande voorbeeld zien we dat een SQL Injection op die manier toegepast kan worden. Dit werkt omdat in dat geval de gebruikersinvoer niet goed gecontroleerd wordt alvorens deze verwerkt wordt. Nog makkelijker wordt het als de SQL server foutmeldingen retourneert. Niet elke SQL server die vatbaar is voor SQL Injections retourneert foutmeldingen. Als de server geen foutmelding genereerd werken dezelfde commando’s wel maar dat merk je pas bij een succesvolle output. Omdat de structuur wat lastiger is om te bepalen is deze manier van een SQL Injection wat lastiger maar niet onmogelijk. Dit type SQL Injection noemen we een “Blind SQL Injection”.
Hoe kan ik me beschermen tegen SQL Injections?
Het is erg belangrijk om jezelf te beschermen tegen SQL Injections. Een SQL Injection is een van de gevaarlijkste exploits die een hacker kan gebruiken. Er zijn zelfs heel veel automatische tools waardoor de hacker alleen maar hoeft toe te kijken hoe de toegang tot je website of server voor hem geregeld wordt.
We weten dat een SQL Injection werkt omdat data niet goed gecontroleerd en toegepast wordt. Je kunt jezelf dan ook beveiligen door:
- Verkeerde input verwijderen. Dit betekend dat je software alle input die betrekking heeft op een SQL commando, string of variabele af moet wijzen alvorens deze doorgezet wordt naar de databaseserver.
- Input leesbaar maken. Als de software een backslash (\) voor speciale tekens als de apostrof plaatst dan weet de SQL server dat dit een leesteken is en geen SQL teken. De apostrof zal hierdoor niet meer gezien worden als een scheidende functie maar gewoon als leesteken. In PHP kan dit middels de mysql_real_escape_string().
- Database rechten. Door rechten in de database goed te zetten kan voorkomen worden dat data in bepaalde tabellen aangepast word en dat bepaalde tabellen gelezen kunnen worden.
- Plaats je website achter een firewall die SQL Injection attacks herkent en blokkeert.
Conclusie:
Ik hoop dat bovenstaande een klein beetje het begrip van een SQL Injection verduidelijkt en benadrukt waarom dit type aanval zo gevaarlijk en doeltreffend is. De beste oplossing is dus het aanpassen van de website software / scripts zodat data netjes afgehandeld wordt. Hoe je een SQL Injection uitvoert lees je uiteraard op mijn blog in een toekomstige post!