Denna artikel förklarar hur man testar om en webbplats är säker mot SQL-injektion med hjälp av verktyget för penetrationstestning SQLMAP.
Vad är SQL-injektion?
SQL-injektion är en teknik för injektion av kod där en angripare utför skadliga SQL-förfrågningar som kontrollerar databasen i en webbapplikation. Med rätt uppsättning frågor kan en användare få tillgång till information som lagras i databaser. SQLMAP testar om en ”GET”-parameter är sårbar för SQL-injektion.
Titta till exempel på följande php-kodsegment:
$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
Om användaren anger ”value’); DROP TABLE table;-” som inmatning blir frågan
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
vilket är oönskat för oss, eftersom användarens inmatning här kompileras direkt tillsammans med den förskrivna sql-frågan. Användaren kommer därför att kunna skriva in en sql-fråga som krävs för att manipulera databasen.
Var kan du använda SQLMAP?
Om du ser en webbadress i formen http://testphp.vulnweb.com/listproducts.php?cat=1, där parametern ”GET” är fet, kan webbplatsen vara sårbar för denna form av SQL-injektion, och en angripare kan få tillgång till information i databasen. Dessutom fungerar SQLMAP när det är php-baserat.
Ett enkelt test för att kontrollera om din webbplats är sårbar skulle vara att ersätta värdet i parametern get request med en asterisk (*). Till exempel,
http://testphp.vulnweb.com/listproducts.php?cat=*
Om detta resulterar i ett fel som det fel som anges ovan kan vi slutgiltigt säga att webbplatsen är sårbar.
Installation av sqlmap
SQLMAP är förinstallerad med kali linux, vilket är det föredragna valet för de flesta penetrationstestare. Du kan dock installera sqlmap på andra debian-baserade linuxsystem med hjälp av kommandot
sudo apt-get install sqlmap
Usage
I den här artikeln kommer vi att använda oss av en webbplats som är utformad med sårbarheter i demonstrationssyfte:
http://testphp.vulnweb.com/listproducts.php?cat=1
Som du kan se finns det en GET-förfråganparameter (cat = 1) som kan ändras av användaren genom att modifiera värdet på cat. Så den här webbplatsen kan vara sårbar för SQL-injektion av det här slaget.
För att testa detta använder vi SQLMAP. För att titta på uppsättningen parametrar som kan skickas, skriv i terminalen,
sqlmap -h
De parametrar som vi kommer att använda för den grundläggande SQL-injektionen visas i bilden ovan. Tillsammans med dessa kommer vi också att använda parametrarna -dbs och -u, vars användning har förklarats i steg 1.
Användning av SQLMAP för att testa en webbplats för SQL-injektionssårbarhet:
- Steg 1: Listan över information om de befintliga databaserna
Så för det första måste vi skriva in webbadressen som vi vill kontrollera tillsammans med parametern -u. Vi kan också använda parametern -tor om vi vill testa webbplatsen med hjälp av proxies. Nu vill vi typiskt sett testa om det är möjligt att få tillgång till en databas. Därför använder vi alternativet -dbs för att göra det. -dbs listar alla tillgängliga databaser.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs
Vi får följande utdata som visar oss att det finns två tillgängliga databaser. Ibland meddelar programmet att det har identifierat databasen och frågar om du vill testa andra databastyper. Du kan gå vidare och skriva ”Y”. Vidare kan den fråga om du vill testa andra parametrar för sårbarheter, skriv ”Y” här eftersom vi vill testa webbapplikationen noggrant.
Vi ser att det finns två databaser, acuart och information_schema
- Steg 2: Listan över information om tabeller som finns i en viss databas
För att försöka få tillgång till någon av databaserna måste vi ändra vårt kommando något. Vi använder nu -D för att ange namnet på den databas som vi vill komma åt, och när vi väl har tillgång till databasen vill vi se om vi kan komma åt tabellerna. För detta använder vi frågan -tables. Låt oss få tillgång till databasen acuart.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables
Tabeller
I bilden ovan ser vi att 8 tabeller har hämtats. Så nu vet vi definitivt att webbplatsen är sårbar.
- Steg 3: Lista information om kolumnerna i en viss tabell
Om vi vill visa kolumnerna i en viss tabell kan vi använda följande kommando, där vi använder -T för att ange tabellens namn och -columns för att fråga efter kolumnnamnen. Vi kommer att försöka få tillgång till tabellen ”artists”.
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns
Columns
- Steg 4: Dump data från kolumnerna
På samma sätt kan vi få tillgång till informationen i en specifik kolumn genom att använda följande kommando, där -C kan användas för att ange flera kolumnnamn separerade med ett kommatecken, och -dump-frågan hämtar datasqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump
Från ovanstående bild kan vi se att vi har fått tillgång till data från databasen. På liknande sätt kan vi på sådana sårbara webbplatser bokstavligen utforska databaserna för att utvinna information
Förhindra SQL-injektion
SQL-injektion kan i allmänhet förhindras genom att använda Prepared Statements . När vi använder ett prepared statement använder vi i princip en mall för koden och analyserar koden och användarinmatningen separat. Den blandar inte ihop användarens inmatade fråga och koden. I det exempel som gavs i början av den här artikeln infogas användarens inmatning direkt i koden och de sammanställs tillsammans, vilket gör att vi kan exekvera skadlig kod. För förberedda uttalanden skickar vi i princip sql-frågan med en platshållare för användarinmatningen och skickar sedan den faktiska användarinmatningen som ett separat kommando.
Konsultera följande php-kodsegment.
$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));
I den här koden kombineras inte användarinmatningen med det förberedda uttalandet. De sammanställs separat. Så även om skadlig kod skrivs in som användarinmatning kommer programmet helt enkelt att behandla den skadliga delen av koden som en sträng och inte som ett kommando.
Notera: Den här applikationen får endast användas i testsyfte
Relaterad artikel
Basisk SQL-injektion och begränsning
Referece:stackoverflow.com
Den här artikeln har bidragits av Deepak Srivatsav. Om du gillar GeeksforGeeks och vill bidra kan du också skriva en artikel via contribute.geeksforgeeks.org eller maila din artikel till [email protected]. Se din artikel dyka upp på GeeksforGeeks huvudsida och hjälp andra Geeks.