SQL INJECTION
description
Transcript of SQL INJECTION
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ę