Przykład 1

advertisement
SQL INJECTION
●
●
●
●
Wykorzystanie błędów w językach
skryptowych
Pomiędzy warstwą programistyczną a
warstwą danych
Bezradne niskopoziomowe mechanizmy
bezpieczeństwa
JSP, ASP, XML, XSL, XSQL, Perl, CGI,
JavaScript, VB, narzędzia do obsługi baz
danych, C, COBOL ...
Przykład 1
●
●
●
Skrypt w JSP połączony z Oracle
W polu formularza wczytywane sal
Konstruowane zapytanie (dla sal=800):
SELECT ename, sal FROM scott.emp
WHERE sal=800
Przykład 1
●
W polu sal wpisujemy:
sal=800 UNION SELECT username,
user_id from all_users
●
Uzyskujemy zapytanie:
SELECT ename, sal FROM scott.emp
WHERE sal=800 UNION SELECT
username, user_id from all_users
Zagrożenia
●
●
●
Dostęp do dowolnych danych w bazie
Możliwość modyfikacji i usunięcia danych
Atak wysokiego poziomu
–
–
–
Omija firewalle i zabezpieczenia na poziomie IP
Omija skanery antywirusowe i filtry treści
Nie istnieją sygnatury dla tego ataku
Przykład – zagrożenia Oracle
Można:
–
–
–
–
Dodać wyrażenie za pomocą UNION
Dodać podzapytania do istniejących
Uzyskać wszystkie dane z bazy
Uzyskać dostęp do zainstalowanych procedur i
pakietów (np. pozwalających na zapisywanie i
czytanie plików systemowych
Przykład – zagrożenia Oracle
Można:
●
●
●
Dodać instrukcje INSERT, UPDATE, DELETE
Dodać języki DDL (do definicji danych)
Dołączyć inną bazę danych
Nie są wykonalne:
●
●
Wielokrotne instrukcje
Odwołanie do bind variables
Przykład 2
●
LoginPage.php:
<HTML>
<BODY>
<FORM ACTION=LoginPage2.php>
Użytkownik: <INPUT NAME=”username”> <br>
Hasło: <INPUT NAME=”password”> <br>
<INPUT TYPE=”submit” VALUE=”Zaloguj”>
</FORM>
Przykład 2
●
LoginPage2.php:
...
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;
}
}
Przykład 2
●
Tworzone zapytanie:
”SELECT id FROM users WHERE username =
'” . $username . ”' AND password = '”
. $password .”'”
●
●
●
. - operator konkatenacji
” - ograniczają poszczególne ciągi znaków
' - fragmenty danych wprowadzane przez
użytkownika
Przykład 2
●
Złośliwe dane:
Użytkownik: 'delete from users-Hasło:
●
Uzyskujemy zapytanie:
”SELECT id FROM users WHERE username =
'” . '; delete from users--” . ”' AND
password = '” . . ”'”;
Przykład 1
●
W efekcie uzyskujemy:
”SELECT id FROM users WHERE username =
'” . '; delete from users--” . ”' AND
password = '” . . ”'”;
●
●
●
' - zakończenie pojedynczego cudzysłowu
; - zakończenie zapytania i rozpoczęcie
nowego
-- - początek komentarza
Przykład 1
●
Wygenerowane zapytanie:
SELECT id FROM users WHERE
username = ''; delete from users
●
●
Zawartość tablicy users zostanie usunięta,
uniemożliwiając innym dostęp do systemu
Można doklejać dowolne zapytania, o ile
pozwala na to API i składnia bazy danych
Metody zapobiegania
●
●
●
●
●
Wszystkie dane z zewnątrz aplikacji powinny
być filtrowane (przede wszystkim słowa
kluczowe)
Stosowanie zasady najmniejszych
przywilejów
Precyzyjne określenie funkcji dostępnych
użytkownikowi za pośrednictwem interfejsu
Oddzielenie dostępu do bazy danych od
interfejsu
Usuwanie zbędnych plików (*.bak)
Przykład 3
●
●
Im więcej intruz wie o strukturze bazy
danych, tym większe prawdopodobieństwo
skuteczności ataku
Podajemy:
Użytkownik: ' HAVING 1 = 1-●
Uzyskujemy zapytanie:
SELECT id FROM users WHERE username =
'' HAVING 1 = 1
Przykład 3
●
Zapytanie:
SELECT id FROM users WHERE username =
'' HAVING 1 = 1
Jest poprawne składniowo, ale niepoprawne
ze względu na strukturę danych.
Zwrócony komunikat:
Attribute users.id must be GROUPed
or used in an aggregate function
Podsumowanie
●
●
●
●
Dane z zewnątrz aplikacji powinny być
filtrowane
Przy nadawaniu uprawnień należy stosować
zasadę najmniejszych przywilejów
Precyzyjne określenie funkcji dostępnych
użytkownikowi za pośrednictwem interfejsu
W środowisku aplikacji nie powinno być
żadnych zbędnych plików
Tematy pokrewne
●
HTML injection
–
–
●
Niedostateczne sprawdzanie danych
wejściowych przez aplikacje sieciowe
Pozwala na zostawianie swoich pułapek na
stronie, przechwytywanie danych
Second-order code injection
–
–
Dostarczenie aplikacji sieciowej potencjalnie
niebezpiecznego kodu, który nie jest od razu
wykonywany lecz przechowany
Przechowany kod (cache, baza danych)
niebezpieczny przy wczytaniu i uruchomieniu
przez ofiarę
Download