Tym razem artykuł związany z bezpieczeństwem aplikacji internetowych, a dokładnie opis ataku SQL Injection, który wykorzystywany do dziś umożliwia przejęcie danych logowania na niezabezpieczonej stronie internetowej, lub wykonanie niemal dowolnej operacji na bazie danych. Dowiedz się w jaki sposób można dokonać ataku na stronę internetową i wydobyć informacje o loginach i hasłach użytkowników. Dowiedz się jak sprawdzić podatność strony internetowej na atak SQL Injection.
Atak SQL Injection – metoda ataku na strony internetowe
Na wstępie chciałbym napisać, że artykuł ma służyć tylko i wyłącznie do celów edukacyjnych i zwiększenia waszej wiedzy o zagrożeniach związanych z atakami na strony i aplikacje internetowe.
SQL Injection to metoda ataku komputerowego polegająca na wykorzystaniu luki w zabezpieczeniach opierającej się na niedostatecznym filtrowaniu danych wprowadzanych przez użytkownika. Innymi słowy programista nie przewidział sytuacji, w której użytkownik będzie chciał wprowadzić wartość inną niż oczekiwaną.
Załóżmy, że mamy formularz do wypełniania, w którym proszą nas o podanie kwoty niezbędnej do zrealizowania przelewu (pole kwota). Większość użytkowników w polu kwota wprowadzi wartość liczbową, na przykład 1000, 1500, 200.50, itp., ale całkiem prawdopodobne, że wśród użytkowników znajdzie się taki, który postąpi inaczej i w tym polu wpisze dowolnie inny ciąg znaków, na przykład sto, dwieście, tysiąc pięćset. Bez odpowiedniego filtrowania skrypt będzie próbował przetworzyć wpisaną przez użytkownika wartość, co spowoduje nieoczekiwany rezultat – na przykład pojawienie się błędu (tzw. wyjątku).
Tego typu sytuacje są szczególnie niebezpieczne, ponieważ umożliwiają przejęcie kontroli nad aplikacją, w tym między innymi uzyskanie informacji, których nie powinniśmy poznać (loginy, hasła użytkowników).
Atak SQL Injection – logowanie na konto administratora
Spora liczba stron internetowych posiada formularz umożliwiający logowanie użytkowników. Po wprowadzeniu danych wysyłane jest zapytanie do bazy danych, które sprawdza, czy użytkownik o danym loginie i haśle istnieje.
Przykładowe zapytanie dla danych (login: Przemo, hasło: 12345) będzie miało postać:
SELECT * FROM users WHERE login = ‘Przemo’ AND pass = ‘12345’
Dane zostaną zwrócone, jeżeli rzeczywiście istnieje użytkownik Przemo, dla którego zostało zdefiniowane hasło 12345 – warunkuje to operator relacji AND.
Zobaczmy co się stanie, jeżeli spróbujemy zalogować się na konto administratora (zazwyczaj loginem jest Admin):
SELECT * FROM users WHERE login = ‘Admin’ AND pass = ‘12345’
Jeżeli znamy hasło na konto administratora, to zapytanie zwróci poprawne dane, ale zakładając, że nie znamy hasła pojawi się komunikat o wpisaniu błędnych danych logowania.
Zobaczmy co się stanie, jeżeli programista nie zadbał o odpowiednie filtrowanie wprowadzonych danych. W formularzu logowania spróbujemy wpisać login jak poprzednio (Admin), natomiast w miejscu hasła wstawimy fragment kodu: 12345’ OR ‘1’ = ‘1’
Całe zapytanie będzie miało postać:
SELECT * FROM users WHERE login = ‘Admin’ AND pass = ‘12345’ OR ‘1’ = ‘1’
Nieważne jakie hasło wpiszemy, to zostaniemy zalogowani na koncie Admin, ponieważ spełniony został drugi z warunków, gdzie 1 = 1.
Osoba, która odkryła tego typu lukę na stronie internetowej może zrobić niemal dowolną czynność po stronie bazy danych – zmienić treść artykułów, usunąć tabelę, dodać nowych użytkowników z uprawnieniami administratora itp.
Obrona przed SQL Injection
Wiem, że tego typu wpis może okazać się kontrowersyjny, dlatego nie będę pokazywał na realnym przykładzie jak działa tego rodzaju atak – w Internecie znajdziecie mnóstwo stron, służących do testowania (specjalnie przygotowanych do tego celu).
Poniżej omówię, w jaki sposób można się bronić przed tego rodzaju atakami. Podstawowa zasada – jeżeli korzystamy z gotowych rozwiązań i CMS’ów na przykład WordPress to pamiętajmy o aktualizacji zarówno silnika, oraz wszystkich wtyczek, z których korzystamy. Nie instalujmy również przestarzałych dodatków, a zwłaszcza takich, które pochodzą z niewiadomego źródła.
Atak SQL Injection opiera się głównie na braku odpowiedniego filtrowania danych wejściowych, dlatego powinniśmy skupić się na tym jaki zestaw znaków może wprowadzić użytkownik w różnego rodzaju formularzach udostępnianych na naszej stronie internetowej.
Jeżeli oczekujemy od użytkownika wartości numerycznych korzystajmy z funkcji: is_numeric()
Aby usunąć znaki specjalne wprowadzone przez użytkownika (‘, ” itp.) warto przepuścić je przez fukcję: addslashes()
Szkoda, że w XXI wieku nie wymyślono nic co by gwarantowało 100% pewność braku włamu. Jak się okazuje o to nietrudno, wielu robi to dla zabawy a nie dla zysku.
ciekawe 😀
przyda się 🙂