Ten artykuł wyjaśnia, jak przetestować, czy witryna jest bezpieczna przed SQL Injection przy użyciu narzędzia do testów penetracyjnych SQLMAP.
Co to jest SQL Injection?
SQL Injection to technika wstrzykiwania kodu, w której atakujący wykonuje złośliwe zapytania SQL, które kontrolują bazę danych aplikacji internetowej. Dzięki odpowiedniemu zestawowi zapytań, użytkownik może uzyskać dostęp do informacji przechowywanych w bazach danych. SQLMAP testuje czy parametr 'GET’ jest podatny na SQL Injection.
Na przykład, Rozważmy następujący fragment kodu php:
$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
Jeśli użytkownik wprowadzi „value’); DROP TABLE table;-” jako dane wejściowe, zapytanie stanie się
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
co jest dla nas niepożądane, ponieważ tutaj dane wejściowe użytkownika są bezpośrednio kompilowane wraz z wcześniej napisanym zapytaniem sql. Stąd użytkownik będzie w stanie wprowadzić zapytanie sql wymagane do manipulowania bazą danych.
Gdzie można użyć SQLMAP?
Jeśli zaobserwujesz adres url, który jest w formie http://testphp.vulnweb.com/listproducts.php?cat=1, gdzie parametr 'GET’ jest pogrubiony, to strona może być podatna na ten tryb SQL injection, a atakujący może być w stanie uzyskać dostęp do informacji w bazie danych. Ponadto, SQLMAP działa, gdy jest oparty na php.
Prostym testem sprawdzającym, czy Twoja witryna jest podatna na ataki, byłoby zastąpienie wartości w parametrze żądania get gwiazdką (*). Na przykład,
http://testphp.vulnweb.com/listproducts.php?cat=*
Jeśli to skutkuje błędem takim jak błąd podany powyżej, wtedy możemy z całą pewnością stwierdzić, że strona jest podatna na ataki.
Instalacja sqlmap
SQLMAP jest wstępnie zainstalowany z kali linux, który jest preferowany przez większość testerów penetracyjnych. Jednakże, można zainstalować sqlmap na innych systemach linuxowych opartych na debian, używając polecenia
sudo apt-get install sqlmap
Usage
W tym artykule, wykorzystamy stronę internetową, która została zaprojektowana z podatnościami w celach demonstracyjnych:
http://testphp.vulnweb.com/listproducts.php?cat=1
Jak widać, istnieje parametr żądania GET (cat = 1), który może być zmieniony przez użytkownika poprzez modyfikację wartości cat. Tak więc ta strona może być podatna na SQL injection tego typu.
Aby to sprawdzić, używamy SQLMAP. Aby przyjrzeć się zestawowi parametrów, które można przekazać, wpisz w terminalu,
sqlmap -h
Parametry, które wykorzystamy do podstawowego SQL Injection są pokazane na powyższym obrazku. Wraz z nimi użyjemy również parametrów -dbs i -u, których użycie zostało wyjaśnione w kroku 1.
Użycie SQLMAP do przetestowania strony internetowej pod kątem podatności na SQL Injection:
- Krok 1: Wylistuj informacje o istniejących bazach danych
Po pierwsze, musimy wprowadzić adres internetowy, który chcemy sprawdzić wraz z parametrem -u. Możemy również użyć parametru -tor jeśli chcemy przetestować stronę używając proxy. Zazwyczaj chcielibyśmy przetestować czy jest możliwe uzyskanie dostępu do bazy danych. Używamy więc do tego opcji -dbs. -dbs listuje wszystkie dostępne bazy danych.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs
Otrzymujemy następujące wyjście pokazujące nam, że są dwie dostępne bazy danych. Czasami aplikacja poinformuje Cię, że zidentyfikowała bazę danych i zapyta, czy chcesz przetestować inne typy baz danych. Możesz przejść dalej i wpisać 'Y’. Dalej, może zapytać, czy chcesz przetestować inne parametry dla luk, wpisz 'Y’ tutaj, jak chcemy dokładnie przetestować aplikację internetową.
Obserwujemy, że są dwie bazy danych, acuart i information_schema
- Krok 2: Lista informacji o tabelach obecnych w konkretnej bazie danych
Aby spróbować uzyskać dostęp do dowolnej z baz danych, musimy nieznacznie zmodyfikować nasze polecenie. Teraz używamy -D aby określić nazwę bazy danych, do której chcemy uzyskać dostęp, a gdy już mamy dostęp do bazy danych, chcielibyśmy sprawdzić, czy możemy uzyskać dostęp do tabel. Do tego celu używamy zapytania -tables. Uzyskajmy dostęp do bazy danych acuart.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables
Tables
Na powyższym obrazku widzimy, że 8 tabel zostało pobranych. Więc teraz na pewno wiemy, że strona jest podatna na ataki.
- Krok 3: Wylistuj informacje o kolumnach konkretnej tabeli
Jeśli chcemy wyświetlić kolumny konkretnej tabeli, możemy użyć następującego polecenia, w którym używamy -T do określenia nazwy tabeli, oraz -columns do zapytania o nazwy kolumn. Spróbujemy uzyskać dostęp do tabeli 'artists’.
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns
Columns
- Krok 4: Zrzut danych z kolumn
Podobnie, możemy uzyskać dostęp do informacji w konkretnej kolumnie za pomocą następującego polecenia, gdzie -C może być użyte do określenia wielu nazw kolumn oddzielonych przecinkiem, a zapytanie -dump pobiera danesqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump
Z powyższego obrazu widzimy, że uzyskaliśmy dostęp do danych z bazy danych. Podobnie, w takich podatnych na ataki stronach internetowych, możemy dosłownie eksplorować bazy danych w celu wydobycia informacji
Zapobieganie SQL Injection
Wstrzyknięciu SQL można generalnie zapobiec poprzez użycie instrukcji przygotowanych (Prepared Statements). Kiedy używamy instrukcji przygotowanych, w zasadzie używamy szablonu dla kodu i analizujemy kod i dane wprowadzone przez użytkownika osobno. Nie miesza to zapytania wprowadzonego przez użytkownika z kodem. W przykładzie podanym na początku tego artykułu, dane wejściowe wprowadzone przez użytkownika są bezpośrednio wstawiane do kodu i są one kompilowane razem, dzięki czemu jesteśmy w stanie wykonać złośliwy kod. W przypadku przygotowanych instrukcji, w zasadzie wysyłamy zapytanie sql z miejscem na dane wejściowe użytkownika, a następnie wysyłamy rzeczywiste dane wejściowe użytkownika jako oddzielną komendę.
Rozważmy następujący fragment kodu php.
$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));
W tym kodzie dane wejściowe użytkownika nie są łączone z przygotowaną instrukcją. Są one kompilowane osobno. Więc nawet jeśli złośliwy kod zostanie wprowadzony jako dane wejściowe użytkownika, program po prostu potraktuje złośliwą część kodu jako ciąg znaków, a nie polecenie.
Uwaga: Ta aplikacja ma być używana wyłącznie do celów testowych
Powiązany artykuł
Podstawowy SQL injection i łagodzenie skutków
Referece:stackoverflow.com
Ten artykuł został napisany przez Deepaka Srivatsava. Jeśli podoba Ci się GeeksforGeeks i chciałbyś się do niego przyczynić, możesz również napisać artykuł korzystając z adresu contribute.geeksforgeeks.org lub wysłać go pocztą na adres [email protected]. Zobacz, jak twój artykuł pojawia się na stronie głównej GeeksforGeeks i pomóż innym Geekom.