Aplikacje internetowe

Bełdziowe spojrzenie na aplikacje internetowe

Analiza struktury bazy danych

W chwili wykrycia podatności skryptu na SQL Injection najtrudniejszym zadaniem jest zdobycie informacji na temat struktury bazy, dzięki czemu możliwa będzie analiza zgromadzonych w niej danych. Pierwszym miejscem gdzie należy szukać jakichkolwiek informacji są błędy zwracane przez skrypt. Możemy w nich znaleźć, albo informację o zapytaniu SQL, albo o ścieżce do loga przechowującego listę błędów. Należy mieć jednak na uwadze, że dane te pojawiają się tam sporadycznie. Poniżej znajduje się opis kilku sposobów, które mają za zadanie pomóc w poznaniu struktury bazy.

Information_schema

Information_schema jest wirtualną bazą dostępną w mySQL od wersji 5. Zawiera ona między innymi informacje o strukturze bazy. Wykorzystując UNION SELECT w łatwy sposób możemy uzyskać dostęp do listy baz, tabel oraz kolumn.

Jako podatny skrypt posłuży nam kod, z którego korzystaliśmy w poprzedniej notce – zostanie on delikatnie zmieniony, tak aby zamiast jednego rekordu zwracał wszystko co zwróci zapytanie.

...
$sql = 'SELECT title, body FROM pages WHERE id = ' . $_GET[ 'id' ];
$q = mysql_query( $sql );

while( $z = mysql_fetch_array( $q ) )
   var_dump( $z ) ;

Teraz wystarczy tylko wstrzyknąć proste zapytanie mające na celu pobranie nazw wszystkich tabel:

1 union select 1,TABLE_NAME from information_schema.TABLES

Podczas eksploracji bazy information_schema wystarczy skupić się na tabeli COLUMNS, ponieważ zawiera ona nazwy wszystkich interesujących elementów – baz, tabel, kolumn.

Aby zabezpieczyć się przed powyższa metodą wystarczy rozważnie nadać uprawnienia użytkownikowi komunikującemu się z bazą. Jeśli ograniczymy jego dostęp tylko do wymaganych baz, będziemy mieli pewność, że nie uzyska on dostępu do information_schema.

Pliki bazy danych

W przypadku mySQL w wersji niższej niż 5 wszystkie dane są zapisywane w plikach – pliki z rozszerzeniem *.frm znajdujące się w katalogu bazy danych. Aby uzyskać do nich dostęp wystarczy skorzystać z mechanizmów opisanych w notce Obsługa plików, a SQL Injection.

PROCEDURE ANALYSE( )

Procedura ANALYSE( ) zwraca informację na temat przetworzonego zapytania. W jej wyniku otrzymujemy zbiór danych statystycznych, optymalne typy oraz informację o użytych kolumnach. Co ważne w skład nazwy kolumn wchodzi również nazwa bazy danych oraz tabeli. Tak więc wstrzykując następujący kod:

1 procedure analyse( )

otrzymujemy strukturę zapytania.


Tagi: ,
Kategoria: Bezpieczeństwo, Bazy danych


7 komentarzy

  1. eloszk napisał(a):

    kiedys sie bawilem tym, i nawet chcialem zabezieczyc sie przed pierwsza metoda, ale ludzie na jakims forum mnie od tego odciagneli, juz teraz nie pamietam czy ich argumentem bylo, ze information_schema jest potrzebna, czy nie mozna tego zrobić. Możesz napisać cos wiecej jakie uprawnienia nadac userowi? Moze byc z lini komend albo z phmyadmina, jol siema.

  2. i tam, skoro nie korzystasz z information_schema to po co umożliwiać do niej dostęp? :)

    a co do uprawnień to sprawa jest prosta, należy nadawać najniższe możliwe, tyle można napisać – jakie konkretnie nadać to już zależy wyłącznie od funkcjonalności aplikacji

  3. Nie wydaje mi się, aby takie to było proste. Wykonanie nawet:

    REVOKE ALL PRIVILEGES, GRANT OPTION FROM user@localhost

    zabierze uprawnienia do wszystkich baz ale nie do INFORMATION_SCHEMA.

  4. hmm fakt, tak więc jedyne co pozostaje to wyłapywanie odwołań do information_schema na poziomie kodu / IDS

  5. Polecam zapoznanie się z dokumentacją: http://dev.mysql.com/doc/refman/5.0/en/information-schema.html
    W szczególności:
    /Each MySQL user has the right to access these tables, but can see only the rows in the tables that correspond to objects for which the user has the proper access privileges./ – czyli każdy widzi, ale tylko swoje obiekty. Warto sprawdzić co widzi użytkownik, który podłączył się do domyślnie zainstalowanej bazy, a nie ma jeszcze żadnych uprawnień.
    /The SELECT … FROM INFORMATION_SCHEMA statement is intended as a more consistent way to provide access to the information provided by the various SHOW statements that MySQL supports / – czyli od 5.0 jest uporządkowane to, co kiedyś można (i nadal) było zobaczyć stosując kilka poleceń z rodziny SHOW. Oczywiście w kontekście sqlinjection i UNION jest zdecydowanie lepsze od SHOW.

    Baza złożona z widoków systemowych jest lepszym określeniem niż ‚wirtualna baza danych’.

  6. Piotr Mądry napisał(a):

    (Nie na temat – więc można usunąć).
    Nie mogę jednak nie skorzystać z okazji i **podziękować Ci Michale
    za bezinteresowną pomoc nieznanej osobie choć było już po 22-giej…**

Trackbacks & Pingbacks

  1. Koło fortuny (Blind SQL injection) « guzik

    […] przeglądam blog Michała Ławickiego i w komentarzach uzupełniam artykuły dot. baz danych (vide Analiza struktury bazy danych czy Obsługa plików, a SQL Injection). Dziś przyjrzałem się jego podejściu do Blind SQL […]

Dodaj komentarz