170 likes | 281 Views
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.
E N D
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ę