In dit artikel wordt uitgelegd hoe u kunt testen of een website veilig is voor SQL-injectie met behulp van het penetratietestprogramma SQLMAP.
Wat is SQL-injectie?
SQL-injectie is een code-injectietechniek waarbij een aanvaller kwaadaardige SQL-query’s uitvoert die de database van een webapplicatie besturen. Met de juiste set query’s kan een gebruiker toegang krijgen tot informatie die in databases is opgeslagen. SQLMAP test of een ‘GET’ parameter kwetsbaar is voor SQL Injection.
Bedenk bijvoorbeeld het volgende php code segment:
$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
Als de gebruiker “value’); DROP TABLE table;-” als invoer invoert, wordt de query
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
wat voor ons onwenselijk is, omdat hier de invoer van de gebruiker direct wordt gecompileerd samen met de vooraf geschreven sql query. De gebruiker kan dus een sql-query invoeren die nodig is om de database te manipuleren.
Waar kunt u SQLMAP gebruiken?
Als u een web url ziet van de vorm http://testphp.vulnweb.com/listproducts.php?cat=1, waarbij de ‘GET’-parameter vetgedrukt is, dan kan de website kwetsbaar zijn voor deze manier van SQL-injectie en kan een aanvaller toegang krijgen tot informatie in de database. Bovendien werkt SQLMAP als het op php is gebaseerd.
Een eenvoudige test om te controleren of uw website kwetsbaar is, zou zijn om de waarde in de ‘get’-verzoekparameter te vervangen door een asterisk (*). Bijvoorbeeld,
http://testphp.vulnweb.com/listproducts.php?cat=*
Als dit resulteert in een fout zoals hierboven, dan kunnen we met zekerheid zeggen dat de website kwetsbaar is.
Installatie van sqlmap
SQLMAP wordt voorgeïnstalleerd geleverd met Kali Linux, wat de voorkeur geniet van de meeste penetratietesters. U kunt sqlmap echter ook op andere op Debian gebaseerde Linux-systemen installeren met het commando
sudo apt-get install sqlmap
Usage
In dit artikel zullen we gebruik maken van een website die is ontworpen met kwetsbaarheden voor demonstratiedoeleinden:
http://testphp.vulnweb.com/listproducts.php?cat=1
Zoals u kunt zien, is er een GET request parameter (cat = 1) die door de gebruiker kan worden gewijzigd door de waarde van cat te wijzigen. Dus deze website zou kwetsbaar kunnen zijn voor dit soort SQL injectie.
Om dit te testen, gebruiken we SQLMAP. Om de set parameters te bekijken die kunnen worden doorgegeven, typ in de terminal,
sqlmap -h
De parameters die we zullen gebruiken voor de basis SQL Injectie zijn te zien in de bovenstaande afbeelding. Daarnaast zullen we ook de -dbs en -u parameter gebruiken, waarvan het gebruik is uitgelegd in Stap 1.
Het gebruik van SQLMAP om een website te testen op SQL Injectie kwetsbaarheid:
- Stap 1: Geef informatie over de bestaande databases
Dus allereerst moeten we de web url die we willen controleren samen met de -u parameter invoeren. We kunnen ook de -tor parameter gebruiken als we de website willen testen met behulp van proxies. Nu zouden we typisch willen testen of het mogelijk is om toegang te krijgen tot een database. Dus gebruiken we de -dbs optie om dit te doen. -dbs geeft een lijst van alle beschikbare databases.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs
We krijgen de volgende uitvoer die ons laat zien dat er twee databases beschikbaar zijn. Soms vertelt de toepassing u dat de database is geïdentificeerd en vraagt u of u andere databasetypen wilt testen. U kunt uw gang gaan en ‘Y’ typen. Verder kan het vragen of u andere parameters wilt testen op kwetsbaarheden, typ hier ‘Y’ aangezien we de webapplicatie grondig willen testen.
We zien dat er twee databases zijn, acuart en information_schema
- Stap 2: Lijst met informatie over tabellen in een bepaalde database
Om te proberen toegang te krijgen tot een van de databases, moeten we ons commando enigszins aanpassen. We gebruiken nu -D om de naam op te geven van de database waartoe we toegang willen, en eens we toegang hebben tot de database, zouden we willen zien of we toegang kunnen krijgen tot de tabellen. Hiervoor gebruiken we de -tables query. Laten we de acuart database benaderen.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables
Tables
In de bovenstaande afbeelding zien we dat 8 tabellen zijn opgehaald. We weten nu dus zeker dat de website kwetsbaar is.
- Stap 3: Geef informatie over de kolommen van een bepaalde tabel
Als we de kolommen van een bepaalde tabel willen bekijken, kunnen we het volgende commando gebruiken, waarin we -T gebruiken om de tabelnaam op te geven, en -columns om de kolomnamen op te vragen. We zullen proberen toegang te krijgen tot de tabel ‘artists’.
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns
Columns
- Stap 4: Dump de gegevens uit de kolommen
Op dezelfde manier kunnen we toegang krijgen tot de informatie in een specifieke kolom met behulp van het volgende commando, waarbij -C kan worden gebruikt om meerdere kolomnamen op te geven, gescheiden door een komma, en de -dump query de gegevens ophaaltsqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump
Uit de bovenstaande afbeelding kunnen we zien dat we toegang hebben gekregen tot de gegevens uit de database. Op dezelfde manier kunnen we op dergelijke kwetsbare websites letterlijk de databases doorzoeken om er informatie uit te halen
Voorkomen van SQL-injectie
SQL-injectie kan in het algemeen worden voorkomen door gebruik te maken van voorbereide verklaringen. Wanneer we een voorbereide verklaring gebruiken, gebruiken we in principe een sjabloon voor de code en analyseren we de code en de gebruikersinvoer afzonderlijk. Het mengt niet de door de gebruiker ingevoerde query en de code. In het voorbeeld aan het begin van dit artikel, wordt de invoer van de gebruiker direct in de code ingevoegd en ze worden samengevoegd, en daardoor zijn we in staat om kwaadaardige code uit te voeren. Voor prepared statements, sturen we in principe de sql query met een plaatshouder voor de gebruikersinvoer en dan sturen we de werkelijke gebruikersinvoer als een apart commando.
Kijk eens naar het volgende php code segment.
$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));
In deze code wordt de gebruikersinvoer niet gecombineerd met de prepared statement. Ze worden afzonderlijk gecompileerd. Dus zelfs als kwaadaardige code wordt ingevoerd als gebruikersinvoer, zal het programma het kwaadaardige deel van de code gewoon behandelen als een string en niet als een commando.
Note: Deze toepassing mag alleen worden gebruikt voor testdoeleinden
Gerelateerd artikel
Basic SQL injection and mitigation
Referece:stackoverflow.com
Dit artikel is bijgedragen door Deepak Srivatsav. Als je GeeksforGeeks leuk vindt en een bijdrage wilt leveren, kun je ook een artikel schrijven via contribute.geeksforgeeks.org of mail je artikel naar [email protected]. Zie je artikel verschijnen op de GeeksforGeeks hoofdpagina en help andere Geeks.