W dzisiejszym tutorial zajmiemy się atakiem Blind SQL Injction. Tego typu podatność różni się od zwykłego ataku SQL tym, że skrypt nie wyświetla żadnych informacji zwrotnych z bazy danych. Przykładem może być zapytanie SELECT, które tylko sprawdza czy w bazie danych istnieje dany użytkownik czy też nie. Nie zwraca żadnych informacji o tej osobie z DB (nawet loginu), ani nawet błędu składni SQL.
Wbrew pozorom za pomocą podatności typu blind można również wyciągnąć wszystkie informacje z bazy danych. Jest to jednak trochę bardziej uciążliwe i przypomina atak brute-force lub słownikowy. Nie przejmuj się, tak naprawdę po zrozumieniu idei atak jest bardzo prosty, skuteczny. Miej na uwadze że luka mimo że nadal bardzo często występuje, to jej samo znalezienie jest trochę trudniejsze.
Wideo szkoleniowe o Blind SQL Injection
W dzisiejszym filmie w skrypcie szkoleniowym Damn Vulnerable Web Application przeprowadzimy atak blind sql injection. Zademonstrujemy idee tego zagrożenia i w praktyce pokażemy kilka ciekawych funkcji znanej już Tobie aplikacji Burp Suit w darmowej wersji.
Różnice pomiędzy ślepmym a zwykłym SQL Injection
Po obejrzeniu filmu pewnie już sam rozumiesz, że ślepy atak wymaga żmudnego sprawdzania krok po kroku nazw baz danych, tabel i kolumn.
Przydatnym operatorem w tym ataku jest operator LIKE i wieloznacznik %, który w strukturalnym języku zapytań SQL oznacza dowolną wartość. Przykładowo, aby wyświetlić wszystkich użytkowników zaczynających się na literę a i kończących na literę m wystarczy wydać następującą komendę:
select * from users where user LIKE 'a%n'
Operator LIKE przydaje się również w przypadku, gdy programista implementuje typową wyszukiwarkę w tekście na stronie internetowej. Wtedy jako wzorzec w języku PHP może użyć coś w stylu:
select artykul from blog where artykul LIKE '%$fraza%';
W bazie danych MySQL istnieje oczywiście więcej wzorców, jednak to ten procent w ataku blind sql injection jest najczęściej używany. Jak sam widzisz w tych bardzo popularnych atakach wymagana jest znajomość budowania zapytań SQL.
Praca domowa
-> Zadanie 1
W bazie danych DVWA istnieje tabela o nazwie guestbook zawierająca komentarze użytkowników witryny. Zajrzyj do phpMyAdmina i zobacz jej nazwy kolumn. Istnieje tam kolumna comment_id.
Spróbuj za pomocą Blind SQL Injection w Damn Vulnerable Web Application sprawdzić czy komentarz o id 1 istnieje, potem sprawdź czy komentarz o id 999 też istnieje.
Uwaga! Dla wygody możesz skorzystać z rozszerzenia HackBar.
- metodą prób i błędów powinieneś dojść do wniosku, że zwraca 2 kolumny poprzednie zapytanie,
- nie musisz korzystać z LIKE, może być zwykły operator porównania =.
Uwaga! Po wklejeniu poniższych adresów URL do przeglądarki internetowej, powinny znaki specjalne (z procentem) zostać zamienione na spacje przez co całość stanie się bardziej czytelna.
Dla id=1:
http://192.168.0.10/vulnerabilities/sqli_blind/?id=-1%27%20union%20select%201,2%20from%20guestbook%20where%20comment_id=1;%20--%20&Submit=Submit#
Zwraca: User ID exists in the database.
Dla id=999:
http://192.168.0.10/vulnerabilities/sqli_blind/?id=-1%27%20union%20select%201,2%20from%20guestbook%20where%20comment_id=999;%20--%20&Submit=Submit#
Zwraca: User ID is MISSING from the database.
Nie sugeruj się komunikatem „user id”, ponieważ ten tekst został zdefiniowany na sztywno w kodzie PHP.
Tak naprawdę odpowiedzi te zwracają czy komentarz o danym ID istnieje czy też nie. W pierwszym przypadku istnieje, w drugim nie (no chyba że dodałeś w skrypcie DVWA aż 999 komentarzy). Warto zajrzeć do przycisku View Source w DVWA, że tak rzeczywiście jest.
-> Zadanie 2
Z pomocą wiedzy zdobytej w poprzednim zadaniu domowym, wydobądź z tabeli guestbook wartość kolumny name dowolnego komentarza. Możesz podejrzeć jakie istnieją komentarze w phpMyAdminie w celu przyspieszenia tego treningu.
http://192.168.0.10/vulnerabilities/sqli_blind/?id=-1%27%20union%20select%201,2%20from%20guestbook%20where%20name%20LIKE%20%27t%%27;%20--%20&Submit=Submit#
aż dojdziesz do rozwiązania:
http://192.168.0.10/vulnerabilities/sqli_blind/?id=-1%27%20union%20select%201,2%20from%20guestbook%20where%20name%20=%20%27test%27--%20&Submit=Submit#
U mnie komentarz w kolumnie name miał wartość test. Zwróć uwagę na pewną sztuczkę. W celu upewnienia się na końcu testu penetracyjnego, że całe wyrażenie zostało już za pomocą blind sql injection pobrane, zamieniliśmy operator LIKE wraz z wieloznacznikiem % na zwykły operator porównania.
[caption id="" align="aligncenter" width="620"] Wyciągnięta wartość „test” za pomocą blind sql injection z innej tabeli niż dotyczyło pierwotne zapytanie. W ten sposób możesz wyciągać również hasła użytkowników znajdujące się w bazie danych MySQL.[/caption]Podsumowanie o atakach wstrzykiwania blind SQL
To by było dzisiaj na tyle. Miej na uwadze, że podatności typu SQL Injeciton nie występują tylko w web aplikacjach. Narażone są na nie wszystkie programy korzystające z bazy danych i nie filtrujące informacji pochodzących od użytkownika systemu komputerowego. Najczęściej w ten sposób pobierane są przez hakera dane związane z hasłami dostępowymi do strony lub informacjami umożliwiającymi w inny sposób spenetrowanie podatnej strony (np: jakieś wartości funkcji odzyskiwania haseł/loginy do ataku brute-forc THC-Hydrą).
Dlaczego tak dziwna praca domowa? Chcieliśmy, abyś przećwiczył ręczny ślepy atak SQL i zrozumiał, że możesz pobierać informacje z dowolnych tabel bazy danych. W kolejnej lekcji poznasz jak zwykle narzędzia BOMBA automatyzujące ataki na bazy danych. Powodzenia w Twojej pracy domowej! 😉