Jak włamać się na stronę internetową – atak SQL Injection. SQL Injection od podstaw – strona testowa sql injection.

Jak włamać się na stronę internetową – luka SQL Injection.

W tym poradniku dowiesz się jak włamać się na stronę internetową wykorzystując lukę SQL Injection od podstaw. Krok po kroku przedstawimy ci jak złamać zabezpieczenia wielu stron internetowych i wysłać do bazy danych własne zapytanie SQL – czyli co nieco o hackingu stron internetowych dla początkujących.

flickr, akeg

Ten poradnik służy wyłącznie celom edukacyjnym i wykorzystane tutaj umiejętności mogą być wykorzystane wyłącznie zgodnie z prawem np. posłużą poszerzeniu wiedzy z zakresu bezpieczeństwa internetowego. W tym poradniku przedstawię popularny sposób pozwalający włamać się na strony internetowe, które są podatne na atak SQL Injection. Do celów ćwiczeniowych przygotowałem specjalny skrypt będący formularzem logowania podatny na atak SQL Injection – strona testowa dostępna jest pod adresem: http://test-sql.ugu.pl/

Co to jest SQL Injection ?

Zanim przejdziemy do konkretów, warto dowiedzieć się co to właściwie jest ten atak SQL Injection i skąd wzięła się taka nazwa ? Większość stron internetowych, zbudowana jest z wykorzystaniem baz danych – czyli miejsca, w którym przechowywane są dane zgodnie z określonymi regułami. W bazie danych przechowywane są informacje np. o zarejestrowanych użytkownikach, napisanych postach, newsach i wielu innych rzeczach.

W przypadku stron internetowych wykorzystuje się bazę danych MySQL – składają się one z tabel, natomiast każda tabela zawiera określoną liczbę kolumn i wierszy.

Wiersz to po prostu jeden wpis w tabeli :

Tabela posiada oczywiście klucz główny, który jednoznacznie identyfikuje każdy wiersz tabeli – może również posiadać klucz obcy, który wykorzystuje się do tworzenia relacji pomiędzy tabelami. Nie będę tutaj jednak opowiadał o podstawach relacyjnych baz danych – przedstawię jedynie wycinek informacji, który pozwoli Ci dowiedzieć się czym jest atak SQL Injection i jak go wykorzystać w praktyce.

Atak SQL Injection, można przetłumaczyć jako „zastrzyk SQL” – ponieważ polega na modyfikacji zapytania wysyłanego do bazy danych (ale o tym dalej).

Zapytania SQL Injection

Chcąc wykorzystać informacje zapisane w bazie danych na stronie internetowej, musimy połączyć się z bazą MySQL i wysłać do niej zapytanie – w efekcie otrzymamy to o co zapytamy. W przypadku formularzy logowania zapytanie może mieć postać podobną do poniższego:

SELECT * FROM members WHERE user = ‚   ‚ and pass=’   ‚

 Jeżeli nie miałeś do czynienia wcześniej z poleceniami języka SQL, to spróbuję krótko wyjaśnić co oznacza powyższy zapis.

  • SELECT – oznacza pobranie z bazy danych pewnych informacji
  • * – kolumny, które chcemy pobrać (jeżeli wstawimy * pobierzemy wszystkie kolumny)
  • FROM – skąd
  • members – nazwa tabeli w bazie danych
  • WHERE – filtr, ograniczający wyniki wyszukiwania
  • user, pass – nazwa kolumny

Czyli wpisując login i hasło do formularza możemy wysłać zapytanie w postaci:

SELECT * FROM members WHERE user = ‚ test’ and pass=’ hoot123′

Oznacza to pobierz wszystkie informacje z tabeli members, dla której kolumna user przyjmuje wartość „test” i kolumna pass przyjmuje wartość „hoot123”. Pomiędzy „user” a „test” widnieje jeszcze słówko „and” (z ang. i) – czyli oba warunki muszą być spełnione, aby wyciągnąć informację z bazy danych (czyli gdzie nazwa użytkownika to „test”, a hasło to „hoot123”). W przypadku gdy wpiszemy poprawną nazwę użytkownika, ale błędne hasło nie zostaniemy zalogowani.

SQL Injection w praktyce, od podstaw

Skoro już wiemy jak wygląda zapytanie wysyłane do bazy danych podczas logowania na stronę internetową – warto zastanowić się, czy istnieje możliwość modyfikacji tego zapytania – tak abyśmy zalogowali się nie znając np. hasła użytkownika ?

Nie będziemy tutaj na sucho wykorzystywali zdobyte umiejętności – ale praktycznie zobaczymy jak to działa – spróbujemy włamać się na stronę wykorzystując SQL Injection. W oknie przeglądarki należy wpisać adres: http://test-sql.ugu.pl/index.php

Pojawi nam się formularz logowania, w którym możemy wpisać dowolne hasło i nazwę użytkownika – w ten sposób dowiemy się jakie zapytanie zostało wysłane do bazy danych:

Jak widać nie znając prawidłowego hasła i nazwy użytkownika nie zalogujemy się – o czym świadczy komunikat „nieprawidłowy login, lub hasło„. Pewnie zauważyliście również, że to co wpiszemy w polu login wędruje do pola user=”, natomiast to co wpiszemy w polu hasło wędruje do pola pass=”. Stąd wniosek, że jest to jedyne miejsce, którym możemy manipulować.

Rzeczą o której już wspominałem jest fakt, że warunki po słowie kluczowym WHERE muszą być spełnione – spróbujmy zatem dokonać pewnej modyfikacji, tak aby warunek zachodził 😉 Jeżeli miałeś do czynienia z jakimkolwiek językiem programowania wiesz, że oprócz operatora logicznego AND istnieje również operator logiczny OR (lub) – w przypadku operatora OR, wystarczy że jeden z warunków będzie poprawny.

Załóżmy, że znamy nazwę użytkownika (np. admin) i chcielibyśmy się zalogować na jego konto nie znając hasła – wtedy moglibyśmy wysłać zapytanie w postaci:

SELECT * FROM members where user =’admin’ and pass=” or ‚1’= ‚1’

Co zrobić, aby polecenie wyglądało tak samo jak powyżej – wystarczy w polu login wpisać admin, natomiast w polu hasło wpisać ‚ or ‚1’= ‚1. Zakładając, że użytkownik „admin” istnieje, należy doprowadzić do sytuacji w której drugi warunek(pass) będzie spełniony – dodajemy operator logiczny OR, oraz równanie 1=1, które jest oczywiście prawdziwe.

Gdy stosujemy operator logiczny OR, wystarczy że jeden z warunków będzie spełniony (został on zaznaczony kolorem zielonym). Wyżej wymienionym sposobem możemy posłużyć się również, gdy nie znamy nazwy użytkownika 🙂

Kolejny sposób, polega na zakomentowaniu wyrażenia, które ma nie być brane pod uwagę – krótko mówiąc to co jest objęte komentarzem nie jest wykonywane przez aplikację. W praktycznie wszystkich językach programowania istnieje możliwość używania komentarzy – w przypadku SQL’a komentarze poprzedzamy dwoma myślnikami tzn. —

SELECT * FROM members where user =’admin’ — ‚ and pass=”

W wyżej wymienionym poleceniu instrukcja ‚ and pass=” została zakomentowana i nie będzie brana pod uwagę – wystarczy zatem wpisać poprawny login, aby uzyskać dostęp do konta ! W polu login w tym wypadku wystarczy wpisać admin’ — (przed/po — jest spacja !).

Poznałeś właśnie metodę pozwalającą włamać się na słabo zabezpieczone strony internetowe – jeżeli jesteś webmasterem, powinieneś zabezpieczyć się przed atakiem SQL Injection. Możliwości SQL Injection jest znacznie więcej – w przyszłości na pewno pojawią się dodatkowe poradniki na ten temat. O zabezpieczeniu się przed tego typu atakiem będzie osobny artykuł – na tę chwilę dodam, że wystarczy filtrowanie znaków wpisywanych do pola formularza.

Tagi:, , ,

31 komentarzy

  1. przemo pisze:

    Cieszę się, że materiał komuś się podoba – wkrótce inne poradniki pokazujące nowe możliwości SQL Injection.

  2. Tomek pisze:

    Nie rozumiem, jak to wpisać czy tak? –
    http://test-sql.ugu.pl/index.php SELECT * FROM members where user =’admin’ — ‘ and pass=” Czy inaczej plz o help

  3. przemo pisze:

    Proszę jeszcze raz przeczytać poradnik – jedyną możliwością wpisania czegokolwiek jest pole „wpisz login”, oraz „wpisz hasło.

    W dalszej części napisałem:
    „Co zrobić, aby polecenie wyglądało tak samo jak powyżej – wystarczy w polu login wpisać admin, natomiast w polu hasło wpisać ‘ or ’1′= ’1. „

  4. flares pisze:

    dzięki

  5. huhuh pisze:

    Nie działa mi to na stronach, na twojej elegancko śmiga a testowalem na wielu stronach i nic.

  6. Przemo pisze:

    Ponieważ część stron nie jest podatnych na atak SQL Injection (są odpowiednio zabezpieczone).

  7. Karol pisze:

    Wpisuję tak w pole logowania
    Login: admin’–‚
    hasło: or ’1′= ’1

    no i nie działa nie wiem co zle robię czy coś z tymi znakami?

  8. przemo pisze:

    Karol, robiąc to w ten sposób twoje zapytanie do bazy danych jest niewłaściwe – spójrz na stronie jak ono wygląda.
    Spróbuj przetestować tę kombinację:

    Login: admin
    Hasło: ‚or ‚1’=’1

    A dlaczego tak – jeżeli sam do tego nie dojdziesz to postaram się wyjaśnić ?

  9. przemo pisze:

    Na portalu komputerowym pojawiło się kilka dodatkowych artykułów dotyczących SQL Injection, proponuję zapoznać się ze wszystkimi.

  10. Tomek pisze:

    admin’ — to sotatnie to co to i gdzie to bo to nie yo –

  11. przemo pisze:

    Proszę raz jeszcze przeczytać poradnik, bo widzę że chyba nie czytałeś „od deski do deski”.

  12. EpicHacker pisze:

    Ja mam taki błąd. Co mam dalej zrobić ?

    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/admin/domains/diamondmt2.pl/public_html/panel/index.php on line 78

    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home/admin/domains/diamondmt2.pl/public_html/panel/index.php on line 79

  13. przemo pisze:

    Muszę poprawić stronę testową, ponieważ została ona usunięta z hostingu – proszę o cierpliwość 😉

  14. Misiek pisze:

    Ej możesz wytłumaczyć pisz na gg: 46328192
    pliska 🙂

  15. Mnich pisze:

    Zajebisty poradniczek, super stronka, masz coś na WordPressa ? i pytanko czy coś z Havij’em stworzysz ?

    Pozdrawiam.

  16. przemo pisze:

    Pożyjemy zobaczymy 😉

  17. Misiek pisze:

    przemo napisz na gg: 46328192 pliska 🙁

  18. Misiek pisze:

    Czemu nie piszesz na gg ?? xD kiedy będzie strona testowa ?
    😀

  19. Damian pisze:

    Cze, mam pytanie…
    Przeczytałem poradnik od deski do deski ale dalej nie pojmuję gdzie należy wpisać to zapytanie…
    W tabelkę logowania? Wpisując wyświetla mi się, że jest złe hasło tzn. że strona jest odporna na SQL Injection?
    Aaa i twoja stronka testowa nie działa.
    Jeśli możesz to napisz do mnie na gg: 22306314 🙂
    Pozdrawiam

  20. przemo pisze:

    Hej,

    aktualnie strona testowa nie działa, dlatego nie możecie przetestować napisanych tutaj porad – postaram się na dniach ją naprawić (ostatnio nie miałem czasu).

  21. Damian pisze:

    Zabezpieczenie się przed tym to jakies 15 linijek kodu.
    I prawie każda strona jest przed tym zabezpieczona.

    • przemo pisze:

      Masz rację – wiele stron jest przed tym zabezpieczone. Artykuł przyda się zwłaszcza początkującym, którzy piszą własne strony internetowe, lub chcą poznać popularne sposoby „włamywania” się do witryn internetowych

  22. Ola pisze:

    PRZEMO ! mozesz mi pomoc? napisz na mojego maila, blagam !

  23. Jaś pisze:

    Czy o godzinie 21 : 00 jutro baza danych jest otwarta ???

  24. kacperix pisze:

    Tutaj jest treść komentarza.

  25. kacperix pisze:

    Wpisze sobie cos albo NIC!

  26. kacperix pisze:

    NIC!

Napisz komentarz