Bezpieczeństwo aplikacji webowych cz. I

Autor: Arkadiusz Tobiasz 1 września 2009

W tym artykule, który w zamierzeniach ma być kontynuowany dowiesz się jak pisać bezpieczne aplikacje webowe, a raczej jakich błędów należy unikać przy programowaniu. Obecnie istnieje bardzo wiele typów ataków, których ofiarą może paść nasza strona www, o ile nie jest prawidłowo zabezpieczona. Szczególnie ważne jest bezpieczeństwo stron, które przechowują dane.

Podstawowym błędem jaki popełnia większość początkujących programistów to całkowity brak walidacji wprowadzanych danych wejściowych przez użytkownika naszej strony. Powodem tego jest przede wszystkim założenie, że nikt nie będzie próbował włamać się na jego stronę. Jednak nic bardziej mylnego…

Jak walidować dane? Najlepiej sprawdzać wszystkie dane wejściowe po stronie serwera. Jest jednak wyraźny minus takowego działania, gdyż dane wejściowe są wysyłane na serwer, tam sprawdzane i w razie błędu zwracane z powrotem. Często zdarza się tak, że po podaniu niepoprawnej jednej zmiennej i po powrocie do formularza pozostaje on czysty. Wyświetla się komunikat jaka dana było błędna. Chociaż zdarza się, że takowej informacji nie ma, wtedy użytkownik ma nie lada zagadkę do rozwiązania. Chcąc uniknąć problemów opisanych wyżej należy skorzystać z mechanizmu sesji. Po wysłaniu danych na serwer zapisywane one są w sesji i przy zwróceniu błędu nasz formularz pobiera wprowadzone wcześniej dane z sesji oraz wyświetla komunikat, która dana jest błędna.

Dane wejściowe mogą być także walidowane po stronie klienta, np. za pomocą JavaScript. Jednak takowa walidacja nie zwalnia nas od sprawdzenia danych po stronie serwera. Brak walidacji pociąga za sobą podatność na ataki SQL Injection. Co nieco o tego typie ataków możesz przeczytać tutaj. Raport X-Force 2008 Trend Statistics, który przygotował IBM Internet Security Systems wskazuje, że rok 2008 był rokiem ataków SQL Injection, z których 55% dotyczyło aplikacji webowych. Posłużę się przykładem, aby zobrazować skalę problemu. Pierwszy plik o nazwie loguj.htm wygląda tak:

1
2
3
4
5
6
7
8
9
10
<html>
<body>

<form action="zaloguj.php" method="post">
<input type="text" name="login" />
<input type="password" name="pass" />
<input type="submit" value="zaloguj" />

</body>
</html>

Do powyższego formularza wpisujemy dane, które wędrują do skryptu zaloguj.php wyglądającego tak:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

include("config.php");

$mysqli = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);

if (!$mysqli) {
  die('Nie udało się nawiązać połączenia z bazą danych');
}

$query = "SELECT login FROM users WHERE login = '{$_POST['login']}' AND pass = '{$_POST['pass']}'"; // 1

$res = $mysqli->query($query);

if (!$res) {
   die('Błąd podczas wykonywania zapytania');
}

if ($res->num($res) > 0) {
   echo 'Zalogowano pomyślnie';
} else {
   echo 'Podałeś poprawne dane?';
}

?>

Jak widzicie wprowadzone dane nie są w żaden sposób walidowane i takie jakie zostały podane przez użytkownika są podstawiane do zapytania (1). Jak można się włamać na stronę nie znając hasła? Wystarczy jako zmienną login podać admin’ #, a w zmiennej pass jakiekolwiek słowo. Znak # spowoduje, że pozostałe linie przez MySQL zostaną zinterpretowane jako zwykły komentarz. W związku z powyższym skrypt wykona następujące zapytanie:

1
SELECT login FROM users WHERE login = 'admin' # AND pass = 'jakieś słowo';

W taki oto sposób zalogowaliśmy się bez znajomości hasła. W łatwy sposób uzyskaliśmy dostęp do panelu administracyjnego i możemy wyrządzić szkody na stronie. Innym sposobem na zalogowanie się bez znajomości hasła jest w polu login podanie admin, a w polu pass podanie hasło’ OR 1=1; #. Spowoduje to, że skrypt wykona następujące zapytanie:

1
SELECT login FROM users WHERE login = 'admin' AND pass = 'hasło' OR 1=1; #'

W taki oto sposób także zalogowaliśmy się na stronie bez znajomości hasła. To tylko niektóry z możliwości wykorzystania ataku SQL Injection. W kolejnej części artykułu o tym w jaki sposób za pomocą SQL Injection pobrać informację o strukturze bazy danych, jak modyfikować bazę danych oraz o zabezpieczeniach przed tego typu atakiem. Więcej o bezpieczeństwie aplikacji webowych możesz przeczytać w nr 9/2009 pisma Hakin9.

Odpowiedz

 

Arkadiusz Tobiasz student Akademii Ekonomicznej im. Karola Adamieckiego w Katowicach na specjalnościach informatyka ekonomiczna oraz rachunkowość. Więcej...

jQuery Validation i funkcja remote

Jakiś czas temu zwrócił się do mnie użytkownik z problemem. Chodzi o to, że korzysta on z pluginu walidacji jQuery, […]

Zend Framework: integracja z Uploadify

W tym wpisie postaram się przedstawić Wam w jaki sposób zintegrować skrypt Uploadify z Zend Frameworkiem. Dzięki temu będziemy mogli […]

Javascript: Czasowe wyświetlanie reklamy

Czasami chcemy, aby na pewnym elemencie naszej strony wyświetlała się reklama przez jakiś czas, a następnie zniknęła. W tym wpisie […]

Linux: backup wszystkich baz danych MySQL

Swego czasu pisałem o tym jak z poziomu konsoli można szybko i przyjemnie zrobić backup bazy MySQL. Wszystko jest ładnie […]