Jeśli wymienimy podatności w aplikacjach webowych, które miały największy wpływ ze względu na stopień dotkliwości, jakie mogą powodować, bez wątpienia znajdziemy Wstrzyknięcie SQL. Ten słaby punkt może nawet pozwolić atakującemu przejść od wylistowania zawartości bazy danych do uzyskania pełnego dostępu do serweraZobaczmy, z czego się składa.
Termin zastrzyk, odnosi się do wstrzykiwania lub dołączania instrukcji SQL w zapytaniu, które aplikacja wykonuje do bazy danych, odbywa się to z wykorzystaniem dowolnych danych wejściowych, których aplikacja żąda bezpośrednio lub pośrednio od użytkownika, odwołujemy się bezpośrednio do pól, np. formularzy gdzie użytkownik wprowadza określone dane, pośrednio mogą to być parametry przekazywane przez adres URL (GET). Celem wstrzykiwania instrukcji SQL do zapytania jest modyfikacja logiki zapytania lub wyniku, który zostanie zwrócony przez bazę danych.
Jest to typowa forma, w której wymagana jest nazwa użytkownika i hasło, aby uzyskać dostęp do obszaru prywatnego. Kod po stronie serwera, który tworzy zapytanie, wyglądałby mniej więcej tak:
$ nazwa użytkownika = $ _POST ['nazwa użytkownika']; $ hasło = $ _POST ['hasło']; $ sql = "SELECT * FROM users WHERE nazwa użytkownika = '$ nazwa użytkownika' AND hasło = '$ hasło'";Jak widać, w pierwszej kolejności zapamiętywane są odpowiednio nazwa użytkownika i hasło wprowadzone w zmiennych nazwa użytkownika i hasło, a następnie wartości te są uwzględniane w zapytaniu, które zostanie wysłane do bazy danych w celu sprawdzenia, czy dany użytkownik istnieje. Załóżmy, że w naszym przykładzie użytkownik wprowadza jako nazwę użytkownika admin i hasło przepustka123, po wysłaniu formularza utworzone zapytanie będzie wyglądało następująco:
SELECT * FROM users WHERE username = 'admin' AND hasło = 'pass123'Jak widać, po umieszczeniu danych wejściowych znajdują się one między pojedynczymi cudzysłowami, aby wskazać, że jest to ciąg tekstowy. Zapytanie to zostanie wysłane do bazy danych i zwróci wynik z danymi wspomnianego użytkownika, jeśli takie istnieją, a dostęp do obszaru prywatnego będzie dozwolony, w przeciwnym razie zwróci pusty wynik i dostęp zostanie odmówiony.
Jak wspomnieliśmy wcześniej, Wstrzyknięcie SQL Polega na dołączaniu kodu SQL do zapytania, a ta forma pozwala na przejście przez pola wejściowe, dzięki czemu mamy aplikację podatną na wstrzyknięcie SQL.
Wykorzystywanie podatności
Celem wykorzystania tej luki jest uzyskanie dostępu do obszaru prywatnego bez znajomości prawidłowej nazwy użytkownika lub hasła oraz wykorzystanie luki. Musimy więc wstrzyknąć kod SQL, aby utworzyć zapytanie, które zwróci poprawny wynik.
Zobaczmy, jak powstaje zapytanie, jeśli w polu hasła wstawimy następujący kod SQL:
Po utworzeniu zapytania będzie ono wyglądało następująco:
SELECT * FROM users WHERE nazwa użytkownika = 'haker' AND hasło = '' lub 1 = 1 # 'Ważną uwagę należy zwrócić na to, że wstawiany kod znajduje się pomiędzy pojedynczymi cudzysłowami, które zawierają hasło, pojedynczy cudzysłów na początku wstawianego kodu odpowiada za uzupełnienie otwartego cudzysłowu w haśle = 'część zapytanie, w ten sposób uzyskujemy tymczasowo następujące zapytanie:
SELECT * FROM users WHERE nazwa użytkownika = 'haker' AND hasło = ''To zapytanie w tej chwili nie zwróci wyników, ponieważ nie ma takiego użytkownika z tymi danymi uwierzytelniającymi, jednak przeanalizujmy resztę wstawionego kodu:
lub 1 = 1 #Wyrok lub 1 = 1 radykalnie zmienia logikę zapytania, ponieważ jak wiemy w zapytaniu tworzonym przez warunkowe LUB Zwróci true, gdy przynajmniej jedno z dwóch wyrażeń zostanie spełnione, w naszym przypadku pierwszym wyrażeniem jest nazwa użytkownika = 'haker' ORAZ hasło = '' , i drugi lub 1 = 1 , to ostatnie jest zawsze prawdziwe, to znaczy 1 jest zawsze równe 1, ponieważ zapytanie zwróci poprawny wynik.
Na koniec musimy pozbyć się cudzysłowu, który zamyka zdanie, do tego możemy użyć komentarzy użytych w SQL: #, - (podwójny myślnik), cóż /* */ . zatem kompletne zapytanie to:
SELECT * FROM users WHERE nazwa użytkownika = 'haker' AND hasło = '' lub 1 = 1 # 'Wszystko po # będzie brane pod uwagę jako komentarz i nie będzie częścią zapytania.
Aby uzyskać prawidłowy wynik, istnieje wiele innych odmian kodu, które możemy wstawić, na przykład: