SQL Injection - "All your base are belong to us"

SQL Injection (SQLi) jest techniką polegającą na wstrzykiwaniu dodatkowych procedur do zapytania SQL, które wygenerowane przez aplikację jest przekazywane do bazy danych i tam wykonywane.

Język SQL (Structured Query Language) jest językiem wysokiego poziomu. Jest on wykorzystywany, do komunikacji i operowaniu na danych w relacyjnych bazach danych (RDBMS), czyli takich jak popularne MySQL, PostgreSQL, MS SQL czy Oracle. Pierwsze dyskusje na temat tego ataku pojawiły się już w 1998 roku, a wstępny opis został opisany w magazynie Phrack #54. W tym artykule posłużymy się przykładem wykorzystującym PHP i relacyjną bazę danych MySQL.

Jak wygląda atak SQLi?

Aby dokładniej zobrazować na czym polega atak stworzyliśmy przykładową stronę, która wyświetla informacje na temat użytkownika o danym identyfikatorze:


screen01.png
Wywołanie skryptu users.php z parametrem id=2 spowoduje przekazanie wartości 2 do zapytania SQL i wyświetlenie informacji uzyskanych z bazy danych. W kodzie źródłowym strony wygląda to następująco:

screen02.png

Dzięki bezpośredniemu przekazaniu wartości parametru "id" do zapytania SQL intruz może wstrzyknąć dodatkowy kod SQL:

screen03.png


Po tej modyfikacji otrzymamy następujący wynik:


screen04.png

Udało się nam zatem wykonać po stronie serwera SQL następujące zapytanie:

SELECT user_id, first_name, last_name, user, password FROM users WHERE user_id=2 or 1=1 -- limit 1;

Podwójny myślnik w tym przypadku pozwolił na zakomentowanie ograniczenia ilości zwróconych wierszy z bazy danych. Ale czy to groźne? Oczywiście. To dopiero pierwszy krok jaki intruz może wykonać. Taki test pokazuje tylko, że strona może być podatna na ataki SQL Injection. Następnym krokiem może być wyciągnięcie jeszcze bardziej wrażliwych danych. Oto przykład zapytania HTTP:

http://example.com/users.php?id=0 UNION SELECT user_id,user,password,avatar FROM users --


screen05.png
Dzięki tej zmianie udało się wyświetlić dodatkowe informacje, a między nimi zaszyfrowane hasła wszystkich użytkowników. Na tym etapie znaliśmy nazwy poszczególnych kolumn jednak brak takiej wiedzy nie stanowi przeszkody. Od wersji 5.0 MySQL udostępnia wirtualna bazę "information_schema" z której można dodatkowo uzyskać informacje na temat wszystkich dostępnych tabel, ich kolumn, a także innych baz danych do których skrypt ma dostęp.

Jak się ochronić?

Jeśli samodzielnie tworzymy aplikację warto się upewnić czy:
  • korzystamy z predefiniowane zapytania (prepared statements),
  • korzystamy w bazie danych ze składowanych procedur (stored procedures),
  • walidujemy dane wejściowe,
  • kodujemy dane wejściowe (escaping),
  • ograniczamy uprawnienia do minimum.
Na ostatnim etapie warto jednak zawsze zweryfikować całą aplikację i poddać ja testom penetracyjnym. Nawet jeśli sami nie tworzymy strony, a jedynie korzystamy z gotowych rozwiązań, miejmy świadomość, że i w nich pojawiają się błędy. Czas pomiędzy wykryciem podatności, a jej załataniem jest na tyle długi, że z pewnością zostanie wykorzystanie przez intruzów. Aby się chronić przed takimi sytuacjami warto skorzystać z usługi jaką jest Web Application Firewall.

Jak działa WAF (Web Application Firewall)?

WAF w czasie rzeczywistym dokonuje inspekcji wszystkich zapytań HTTP sprawdzając po kolei zdefiniowane reguły bezpieczeństwa, dodatkowo wykorzystywane są zaawansowane algorytmy badania reputacji użytkowników i wykrywania anomalii w ich zachowaniu. W przypadku wykrycia podejrzanych prób manipulacji danymi zapytanie takie jest blokowane i nie trafia do serwera docelowego. W ten sposób klienci korzystający z WAF są zabezpieczani przed ewentualnymi negatywnymi skutkami prób włamań. Warto tutaj nadmienić, że w ten sposób nasi klienci korzystający z oprogramowania typu open source np. Wordpress, Joomla czy osCommerce są chronieni przed błędami typu zero-day, które niestety często są znajdowane w różnych dodatkach/pluginach.

Na poniższym obrazku został przedstawiony efekt działania WAF dla zapytania HTTP, które we wcześniejszej części tego wpisu służyło do pobrania wrażliwych danych:

http://example.com/users.php?id=0 UNION SELECT user_id,user,password,avatar FROM users --











Brak komentarzy :

Prześlij komentarz