SQL Injection

advertisement
SQL Injection
Kamil Sławiński
1
Plan
Wprowadzenie , model aplikacji
 SQL Injection - Co to jest ?
 Zagrożenia
 Przykłady
 Jak się zabezpieczyć ?
 Podatność
 Podsumowanie

2
WPROWADZENIE
Wszyscy wiemy, że największym bogactwem każdej firmy są
przechowywane w niej dane. Czyni się różne kroki żeby uchronić
dane od kradzieży, nieuprawnionej modyfikacji i zniszczenia.
Jednak wraz z rozwojem sieci Internet, coraz więcej firm decyduje
się na wykorzystanie tego medium do udostępniania wybranych
zasobów dla swoich klientów. Najpopularniejszym sposobem na
realizację tego zadania jest interfejs WWW.
Niestety okazuje się, że udostępnienie takiej funkcjonalności może
otworzyć potencjalnemu intruzowi bardzo łatwą drogę do zdobycia
oraz modyfikacji interesujących go danych.
3
WPROWADZENIE c.d.
Każdy z nas wykorzystuje w swojej pracy dane zgromadzone w
bazach danych. Zwykle nie robimy tego bezpośrednio zadając zapytanie SQL, lecz za pośrednictwem jakiegoś
interfejsu do bazy danych.
Całość aplikacji składa się z trzech warstw:
1. Klient
2. Warstwa pośrednicząca
3. Baza danych
Zwykle dane do zapytania wpisujemy w odpowiednim okienku za
pomocą interfejsu ,a następnie są one przetwarzane przez
warstwe pośredniczącą ,która konstruuje z tych danych
pełnoprawne zapytanie SQL i przesyła je do bazy danych.
Właśnie tutaj tkwi główny cel ataków SQL-injection.
4
SQL Injection – Co to jest?
SQL injection polega na nieautoryzowanym wykonaniu
wyrażeń języka SQL
SQL injection to metoda ataku polegająca na dodaniu do
zapytania wykonywanego przez warstwę
pośredniczącą dodatkowego zapytania SQL.
SQL injection to typ ataku, który korzysta z dziur w
aplikacjach Web'owych.
Wykorzystuje wywołanie zapytania SQL w aplikacji w
której nie przetwarza się danych uzyskanych od
użytkownika
Najczęściej polega na takim skonstruowaniu formuły w
klauzuli WHERE zapytania, by sprawdzanie
wprowadzonych danych nie miało znaczenia.
5
Zagrożenia
W rezultacie może to prowadzić do:
 zdobycia danych, do których użytkownik nie
jest uprawniony
 zmodyfikowania danych, bądź dodania do
bazy dodatkowych danych
 obejścia mechanizmów opartych na
pobieraniu danych z bazy (np. autoryzacji)
6
Przykłady
Przykładem będzie prosty skrypt JSP, który pokazuje
wykonanie zapytania do bazy. Skrypt pobiera od
użytkownika dane do zapytania przez prosty formularz
składający się z jednego pola tekstowego. Np. jeżeli w pole
wpiszemy: sal=800, to otrzymamy listę pracowników,
których wynagrodzenie wynosi 800. Jeżeli przeanalizujemy
kod to okaże się, że to co użytkownik wpisuje w formularz
web-owy jest "doklejane" do zapytania:
SELECT ename, sal FROM scott.emp WHERE ___
Czyli po wpisaniu "sal=800" skrypt skonstruuje zapytanie:
SELECT ename, sal FROM scott.emp WHERE sal=800
7
Przykłady c.d.
Ponieważ użytkownik może wpisywać w formularz web-owy
dowolne ciągi znaków zamiast „sal=800” możemy wpisać
„sal=800 union select username, user_id from all_users”. W
wyniku zostanie skonstruoowane zapytanie:
SELECT ename, sal FROM scott.emp WHERE sal=800
UNION SELECT username, user_id FROM all_users
W rezultacie użytkownik (intruz) uzyskał dostęp do widoku
all_users, a więc wykonał działanie na które twórca
interfejsu nie zezwolił bezpośrednio.
Powyższy przykład jest bardzo prosty, jednak świetnie
ilustruje istotę ataku typu SQL-injection.
8
Przykład 2 - modyfikacja danych
Jest to typowa strona www służącą do uwierzytelniania się. (kod
ponizej)
LoginPage.php
<HTML>
<BODY>
FORM ACTION=LoginPage2.php>
Uzytkownik: <INPUT NAME="username"><BR>
Haslo: <INPUT NAME="password"><BR>
<INPUT TYPE="submit" VALUE="Zaloguj">
</FORM>
</BODY>
Formularz, który pobiera od użytkownika parametry "username" i "password" i wywołuje
kolejny skrypt, który ma za zadanie sprawdzić w bazie danych, czy podane przez
użytkownika login i hasło są prawidłowe.
LoginPage2.php
…
// funkcja do autoryzacji
function MyAuth( $conn,$username,$password) {
$query = "SELECT id FROM users WHERE";
$query .= " username = ‘" . $username . "' AND ";
$query .= " password = ‘" . $password . "'";
$res = pg_query( $query);
}
if (pg_num_rows( $res) == 1) {
$row = pg_fetch_array( $res);
$id = $row[‘id'];
} else {
$id = 0;
}
return $id;
9
Modyfikowanie danych –c.d.
Szczeglnym fragmentem powyższego kodu jest zapytanie:
"SELECT id FROM users WHERE username = ‘"
. $username .
"' AND password = ‘"
. $password .
"'";
Podobnie jak w poprzednim wypadku zapytanie jest konstruowane przez
sklejenie części stałych, zaszytych w programie ze zmiennymi
wprowadzonymi przez użytkownika przez formularz www.
Jeżeli do formularza LoginPage.php wprowadzimy następujące dane:
Użytkownik: ‘; delete from users
Hasło:
Zostanie wykonane polecenie :
"SELECT id FROM users WHERE username = ‘"
. ‘; delete from users-- .
"' AND password = ‘"
..
"'";
10
W wyniku otrzymamy zapytanie :
SELECT id FROM users WHERE username = "; delete from users
W rezultacie, zawartość tablicy users zostanie usunięta, uniemożliwiając
innym użytkownikom na dostęp do systemu!!!

W przypadku Oracle powyższa metoda jest nieskuteczna, gdyż
składnia SQL Oracle nie dopuszcza do wykonywania kilku komend w
jednej linii.
Przykład 3 - ominięcie mechanizmów uwierzytelniających
Funkcja uwierzytelniająca(MyAuth) przedstawiona w przykładzie drugim,
wykonuje zapytanie i sprawdza ilość rekordów zwróconych przez to
zapytanie. Jeżeli zapytanie zwróciło dokładnie jeden rekord, to funkcja
stwierdzi że użytkownik wpisał poprawny login oraz hasło i zwróci
identyfikator użytkownika.
Jeśli w formularzu wpiszemy :
Username: ‘ or 1 = 1--
skrypt wykona zapytanie:
SELECT id FROM users WHERE username = " OR 1 = 1
W rezultacie intruz będzie mógł zalogować się z prawami pierwszego
użytkownika w bazie.
11
Zapobieganie atakom
Ataki SQL-injection są dość ciężkie do wykrycia i zablokowania przez to, że są one
przenoszone przez zwykłe wywołania protokołu HTTP.



Obrona na poziomie bazy danych- użytkownik związany z aplikacją WWW
powinien mieć najmniejszy możliwy zestaw przywilejów, niezbędny do
wykonania działań na bazie.W szczególności należy rozważyć uprawnienia do
wykonywania procedur w bazie oraz uprawnienia do modyfikowania danych.
Filtrowanie zapytań do serwera - wyszukiwanie pewnych słów kluczowych
w wywołaniu HTTP. SELECT, DELETE, INSERT, UPDATE
UNION SELECT ,OR 1=1,OR A=A,-- , ‘ . Wdrożenie tej metody wymaga jednak
szczegółowego ustalenia zestawu wykrywanych znaków.
Filtrowanie na firewallu - filtrowanie zapytań HTTP za pomocą słów (lub
wyrażeń) kluczowych, można zaimplementować na firewallu. Przykładem może
być Checkpoint Firewall-1 , który posiada możliwość analizowania ruchu HTTP
i blokowania na podstawie słów kluczowych.
12
Zapobieganie c.d
Powyższe metody nie dają pełnego zabezpieczenia. Typ
możliwych do zastosowania ataków SQL-injection jest ściśle
zależny od logiki działania aplikacji internetowej oraz sposobu
integracji serwera WWW z bazą danych. Znacznie większy
poziom bezpieczeństwa możemy osiągnąć stosując zasady
bezpiecznego projektowania i programowania aplikacji
internetowych
13
Podatność
Niektóre z produktów podatne na ataki SQL injection:
-Oracle 9i Application Server Portal R1 i R2
-Oracle E-Business Suite 11i
-Oracle Database (Oracle HTTP Server z mod_plsql).
Procedura PL/SQL może być wykonywana z uprawnieniami użytkownika wywołującego lub z
uprawnieniami użytkownika definiującego procedurę. Doklejone przez intruza zapytanie
wywoła się z takimi samymi prawami jak atakowana procedura. W niektórych wypadkach
mogą to być uprawnienia użytkowników SYS lub SYSTEM W rezultacie nieuprzywilejowany
intruz może uzyskać dostęp do dowolnych danych w bazie.
Niektóre pakiety, w których znaleziono opisywane podatności to:

Portal DB Provider Forms,

Portal DB Provider Hierarchy,

Portal DB Provider XML Components,

List of Values.
14
Podsumowanie

Na przykładzie SQL-injection widzimy , że powszechnie stosowanie
mechanizmy obronne (firewall) nie zawsze mogą nas obronić przed skutecznym
atakiem. Istotna jest dobra znajomość i czynne stosowanie zasad bezpiecznego
programowania.

Bardzo ważne jest zrozumienie podstaw i istoty działania
mechanizmów bazodanowych z których korzystamy. Niestety, na
skutek rozwoju technologii developerskich, powszechnego stosowania
generatorów kodu często o tych podstawach zapominamy ,a to stwarza
doskonałe środowisko dla intruzów.
15
Download