Denne artikel forklarer, hvordan du tester, om et websted er sikkert mod SQL-injektion ved hjælp af SQLMAP-værktøjet til penetrationstest.

Hvad er SQL-injektion?

SQL-injektion er en kodeinjektionsteknik, hvor en angriber udfører ondsindede SQL-forespørgsler, der kontrollerer en webapplikations database. Med det rigtige sæt forespørgsler kan en bruger få adgang til oplysninger, der er gemt i databaser. SQLMAP tester, om en ‘GET’-parameter er sårbar over for SQL-injektion.
Tænk f.eks. på følgende php-kodesegment:

$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");

Hvis brugeren indtaster “value’); DROP TABLE table;-” som input, bliver forespørgslen

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

som er uønsket for os, da brugerens input her kompileres direkte sammen med den på forhånd skrevne sql-forespørgsel. Derfor vil brugeren kunne indtaste en sql-forespørgsel, der er nødvendig for at manipulere databasen.

Hvor kan du bruge SQLMAP?

Hvis du observerer en web-url, der er af formen http://testphp.vulnweb.com/listproducts.php?cat=1, hvor parameteren ‘GET’ er med fed skrift, kan webstedet være sårbart over for denne form for SQL-injektion, og en angriber kan få adgang til oplysninger i databasen. Desuden fungerer SQLMAP, når det er php-baseret.

En simpel test for at kontrollere, om dit websted er sårbart, ville være at erstatte værdien i get request-parameteren med en asterisk (*). For eksempel,

http://testphp.vulnweb.com/listproducts.php?cat=* 

Hvis dette resulterer i en fejl som den ovenfor angivne fejl, kan vi endegyldigt sige, at webstedet er sårbart.

Installation af sqlmap

SQLMAP er forudinstalleret med kali linux, som er det foretrukne valg for de fleste penetrationstestere. Du kan dog installere sqlmap på andre debian-baserede linux-systemer ved hjælp af kommandoen

 sudo apt-get install sqlmap 

Usage

I denne artikel vil vi gøre brug af et websted, der er designet med sårbarheder til demonstrationsformål:

 http://testphp.vulnweb.com/listproducts.php?cat=1 

Som du kan se, er der en GET request-parameter (cat = 1), som brugeren kan ændre ved at ændre værdien af cat. Så dette websted kan være sårbart over for SQL-injektion af denne art.
For at teste for dette bruger vi SQLMAP. For at se på det sæt parametre, der kan overføres, skal du skrive i terminalen,

 sqlmap -h 

De parametre, som vi vil bruge til den grundlæggende SQL-injektion, er vist i ovenstående billede. Sammen med disse vil vi også bruge parametrene -dbs og -u, hvis brug er blevet forklaret i trin 1.
Brug af SQLMAP til at teste et websted for SQL-injektionssårbarhed:

  1. Trin 1: Liste over oplysninger om de eksisterende databaser
    Så først skal vi indtaste den web-url, som vi ønsker at kontrollere, sammen med parameteren -u. Vi kan også bruge parameteren -tor, hvis vi ønsker at teste webstedet ved hjælp af proxyer. Nu vil vi typisk gerne teste, om det er muligt at få adgang til en database. Så vi bruger -dbs-indstillingen til at gøre det. -dbs viser en liste over alle tilgængelige databaser.
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs 

    Vi får følgende output, der viser os, at der er to tilgængelige databaser. Nogle gange vil programmet fortælle dig, at det har identificeret databasen, og spørge, om du vil teste andre databasetyper. Du kan gå videre og skrive “Y”. Endvidere kan den spørge, om du vil teste andre parametre for sårbarheder, skriv ‘Y’ herover, da vi ønsker at teste webapplikationen grundigt.

    Vi observerer, at der er to databaser, acuart og information_schema

  2. Trin 2: Liste over oplysninger om tabeller, der findes i en bestemt database
    For at forsøge at få adgang til en af databaserne, skal vi ændre vores kommando en smule. Vi bruger nu -D til at angive navnet på den database, som vi ønsker at få adgang til, og når vi har adgang til databasen, vil vi gerne se, om vi kan få adgang til tabellerne. Til dette formål bruger vi forespørgslen -tables. Lad os få adgang til databasen acuart.
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables 

    Tabeller

    I ovenstående billede kan vi se, at 8 tabeller er blevet hentet. Så nu ved vi helt sikkert, at webstedet er sårbart.

  3. Trin 3: Liste over oplysninger om kolonnerne i en bestemt tabel

    Hvis vi ønsker at se kolonnerne i en bestemt tabel, kan vi bruge følgende kommando, hvor vi bruger -T til at angive tabellens navn og -columns til at forespørge på kolonnens navne. Vi vil forsøge at få adgang til tabellen “artists”.

     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns 

    Spalte

  4. Trin 4: Dump dataene fra kolonnerne
    Sådan kan vi få adgang til oplysningerne i en specifik kolonne ved at bruge følgende kommando, hvor -C kan bruges til at angive flere kolonnenavne adskilt med et komma, og -dump-forespørgslen henter dataene
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump 

    Fra ovenstående billede kan vi se, at vi har fået adgang til dataene fra databasen. På samme måde kan vi på sådanne sårbare websteder bogstaveligt talt udforske gennem databaserne for at udtrække oplysninger

Forebygge SQL-injektion

SQL-injektion kan generelt forhindres ved at bruge Prepared Statements . Når vi bruger en prepared statement, bruger vi grundlæggende en skabelon for koden og analyserer koden og brugerinput separat. Den blander ikke den brugerindtastede forespørgsel og koden. I eksemplet i begyndelsen af denne artikel indsættes det input, som brugeren har indtastet, direkte i koden, og de kompileres sammen, og derfor er vi i stand til at udføre ondsindet kode. For prepared statements sender vi grundlæggende set sql-forespørgslen med en placeholder for brugerinput og sender derefter det faktiske brugerinput som en separat kommando.
Se følgende php-kodesegment:

$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));

I denne kode er brugerinput ikke kombineret med prepared statement. De kompileres separat. Så selv hvis der indtastes ondsindet kode som brugerinput, vil programmet blot behandle den ondsindede del af koden som en streng og ikke som en kommando.

Bemærk: Dette program må udelukkende bruges til testformål
Relateret artikel
Basic SQL injection and mitigation

Referece:stackoverflow.com

Denne artikel er bidraget af Deepak Srivatsav. Hvis du kan lide GeeksforGeeks og gerne vil bidrage, kan du også skrive en artikel ved hjælp af contribute.geeksforgeeks.org eller sende din artikel på mail til [email protected]. Se din artikel blive vist på GeeksforGeeks’ hovedside, og hjælp andre nørder.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.