Tutorial Blind SQL Techniki wtrysku

Tutorial Blind SQL Techniki wtrysku

Co to jest zastrzyk SQL?

Wtrysk SQL to rodzaj ataku bazy danych, w którym atakujący próbuje ukraść informacje z bazy danych aplikacji internetowej. Może to nawet spowodować wykonanie zdalnego kodu w zależności od środowiska aplikacji internetowych i wersji bazy danych.

Wtrysk SQL ma miejsce z powodu złego odkażania wprowadzania użytkownika. Jeśli weźmiesz dane wejściowe od użytkownika w jakimś języku kodowania (PHP, ASP.Netto) i przekaż ją bezpośrednio do bazy danych serwera bez stosowania filtra na wejściu, może to wynikać z podatności na wtrysku SQL.

Na przykład następujący kod PHP jest podatny na atak wtrysku SQL, ponieważ bezpośrednio przekazuje wejście użytkownika do bazy danych. Atakujący może stworzyć własne złośliwe zapytanie do bazy danych w celu wyodrębnienia danych z bazy danych.

// UserInput jest przechowywany w zmiennej identyfikacyjnej
$ id = $ _get ['id'];
// UserInput jest wykonywany bezpośrednio w bazie danych
$ getId = "Wybierz First_name, Last_name od użytkowników, gdzie user_id = '$ id'";
// W przypadku błędu lub sukcesu wyniki są zwracane użytkownikowi
$ wynik = mysql_query ($ getId) lub die ('
' . mysql_error () . '
');
$ num = mysql_numrows ($ wynik);

Z drugiej strony podano bezpieczny kod takiego kodu do interakcji z bazą danych. Pobiera wkład użytkownika i filtruje z niego złośliwe znaki, a następnie przekazuje je do bazy danych.

$ id = $ _get ['id'];
$ id = StripSlashes ($ id);
$ id = mysql_real_escape_string ($ id);

Normalny vs ślepy wtrysk SQL

Normalne wstrzyknięcie SQL

W normalnym wstrzyknięciu SQL, jeśli atakujący próbuje umieścić pojedynczy cytat (') jako wejście, gdy ten pojedynczy cytat jest wykonywany w bazie danych, baza danych odpowiada błędem. Błąd jest wydrukowany w przeglądarce napastnika.

Kod odpowiedzialny za ten błąd to

// Jeśli baza danych odpowiada błąd, funkcja „lub die ()” zostanie wykonywana
Aby wydrukować błąd
$ wynik = mysql_query ($ getId) lub die ('
' . mysql_error () . '
');

W normalnym wstrzyknięciu SQL atakujący może zobaczyć wyniki błędów i łatwe do identyfikacji i wykorzystania.

Ślepy zastrzyk SQL

W przypadku ślepego wstrzyknięcia SQL, gdy wykonywane jest złośliwe zapytanie, takie jak pojedynczy cytat, błąd bazy danych nie jest wyświetlany w przeglądarce atakującego lub jest wyświetlany w bardzo ogólny sposób, którego nie można łatwo zidentyfikować i wykorzystywać.

Kod Backend odpowiedzialny za to podano poniżej

$ wynik = mysql_query ($ getId); // usunięto „lub umrzeć”, aby stłumić błędy MySQL

W ślepym wstrzyknięciu SQL atakujący nie widzi pełnych wyników, dlatego ten typ SQLI jest trudny do zidentyfikowania i wykorzystania, ale ma taki sam poziom ryzyka, jak normalny SQLI.

Techniki wykrywania ślepego wtrysku SQL

Podczas gdy normalne wstrzyknięcie SQL można wykryć, wysyłając pojedynczy cytat (') jako wejście i badając błąd wyjściowy, wtrysku ślepego SQL nie można wykryć za pomocą tej techniki, ponieważ nie wyświetla żadnego błędu SQL. Istnieje wiele technik wykrywania ślepego wstrzyknięcia SQL, niektóre z nich są podane w następujący sposób

Prawdziwe i fałszywe wykrywanie

Jedną z cech baz danych, w tym MySQL, jest inne zachowanie w sprawie prawdziwych i fałszywych stwierdzeń. Nawet jeśli baza danych nie pokazuje żadnych błędów, możemy zdecydować o użyciu instrukcji True i False. Rozważ następujący scenariusz,

Poniższa strona jest podatna na wtrysk ślepego SQL, co dając mu prawdziwe instrukcja wyświetli wszystkie wpisy w bazie danych

1 'lub 1 = 1#

Podanie fałszywego zapytania jako wejścia nie wyświetli żadnych danych.

1 'lub 1 = 2#

Nawet strona internetowa nie pokazuje żadnych błędów, różnica między dwiema stronami mówi, że nasze zapytania są skutecznie wykonywane w bazie danych.

Wykrywanie oparte na czasie

W bazach danych istnieje funkcja, w tym MySQL, MS-SQL i inne w celu opóźnienia. Możemy użyć funkcji sleep () w naszym zapytaniu, jeśli reakcja bazy danych jest powolna, oznacza to, że nasze zapytanie jest wykonywane pomyślnie, a strona internetowa jest podatna na ślepy wtrysk SQL.

1 'i sen (15)#

Istnieje kolejna czasochłonna funkcja „porównawcza”, której można użyć do opóźnienia odpowiedzi bazy danych

1 'i Benchmark (10000000, SHA1 (1337))#

Powyższa linia wykona funkcję SHA1 () 100000 razy w bazie danych, która doda znaczne opóźnienie w odpowiedzi.

Ślepy wtrysk SQL oparty na czasach w innych bazach danych

MS SQL: ID = 1; Okaż opóźnienie '0: 0: 10'-

Oracle SQL: I [randnum] = dbms_pipe.Recench_message („[randstr]”, [sleepTime])

PostgreSQL: I [randnum] = (Wybierz [randnum] z PG_SLEEP ([sleepTime])))

SQLITE: I [randnum] = jak („abcDefg”, Upper (hex (randomblob ([sleepTime] 00000000/2)))))))))))

Wyodrębnienie informacji o bazie danych

Pierwszym krokiem wyodrębnienia bazy danych jest określenie numerów kolumn w bazie danych. Następnie spróbuj znaleźć wrażliwe kolumny, aby wyodrębnić kolejne dane.

Ślepe wstrzyknięcie SQL zachowuje się inaczej z różnymi liczbami kolumn w zapytaniu „porządek według”.

1 'zamówienie przez 1#

Powyższe stwierdzenie jest prawdziwe, ponieważ co najmniej 1 kolumna zawsze istnieje w bazie danych. Teraz spróbuj z bardzo dużą liczbą.

1 'zamówienie przez 10000#

Odpowiedź bazy danych jest inna niż poprzednia. Teraz spróbuj z 2 kolumnami.

Oświadczenie działało, co oznacza, że ​​baza danych ma 2 lub więcej kolumn. Teraz spróbuj z 3 kolumnami.

1 'zamówienie przez 3#

Baza danych nie wysyłała żadnej odpowiedzi, co oznacza, że ​​baza danych ma tylko 2 kolumny. Teraz spróbujemy zrzucić listę tabel w bazie danych, użyjemy do tego następujące zapytanie

1 'Union All SELECT 1, Group_concat (nazwa_beli) z Information_Schema.
Tabele gdzie table_schema = baza danych ()#

Istnieją dwa tabele w bazie danych backend „Book & Users”. Tabela „użytkowników” może zawierać nazwy użytkowników i hasła. Aby wyodrębnić nazwy kolumn z tabeli, wstaw następujące zapytanie.

1 'Union All SELECT 1, Group_concat (nazwa_polutwa) z Information_Schema.
kolumny gdzie table_schema = baza danych ()#

Teraz wyodrębniliśmy nazwy kolumn, obejmuje to kolumny użytkownika i hasła. Te kolumny przechowują nazwy użytkowników klientów i ich hasła.

Teraz spróbujemy wyodrębnić dane za pomocą następującego zapytania

1 'Union All SELECT 1, Group_concat (użytkownik, hasło) od użytkowników#

I w ten sposób możesz wykorzystać ślepy zastrzyk SQL bez polegania na błędach. Hasła wyjściowe są przez większość czasu, które można odszyfrować za pomocą narzędzi takich jak John the Ripper lub Hashcat.

Wniosek:

Wtrysk ślepego SQL jest typem SQLI, który nie pokazuje błędów bazy danych ani nie odpowiada bardzo ogólną komunikatem. Dlatego bardzo trudno jest zidentyfikować wrażliwość wtrysku ślepego SQL na stronie internetowej. Po wykryciu możesz go łatwo wykorzystać za pomocą procesu ręcznego lub zautomatyzowanego za pomocą SQLMAP.