Copyright © The OWASP Foundation
Permission is granted to copy, distribute and/or modify this document
under the terms of the OWASP License.
The OWASP Foundation
OWASP
http://www.owasp.org
Jak ocalić swoje dane przed
SQL injection?
Krzysztof Kotowicz
Web developer
http://web.eskot.pl
Medycyna Praktyczna
czerwiec 2010
OWASP 2
Plan
Co to jest SQL injection?
Jak przebiegają ataki?
Jak możemy się bronić?
OWASP 3
Co to jest SQL injection?
OWASP 4
Błędy typu injection
Zmuś aplikację, żeby wykonywała Twój kod
dzięki sprytnemu manipulowaniu danymi
wejściowymi
OWASP 5
SQL injection w aplikacjach webowych
Kod to polecenia SQL
Dane wejściowe to wszystko, co trafia do bazy:
Parametry z URL
Dane formularzy
Nagłówki HTTP
Cookies (np. ID sesji)
Logi
...
OWASP 6
Czym to grozi?
Nieuprawniony dostęp do aplikacji
Dostęp do całej zawartości bazy / baz na serwerze
Denial of service
Możliwość modyfikacji danych w bazie
Przejęcie serwera baz danych
OWASP 7
Jak oni to robią?
OWASP 8
Dawno, dawno temu...
Wyglądało to tak:
Prosty cel dla atakujących
Łatwo wykryć, łatwo się zabezpieczyć
String query = ”SELECT * FROM accounts WHERE
custID = ” + request.getParameter(”id”)
http://example.com/accountView?id=1 or 1=1
SELECT * FROM accounts WHERE custID = 1 or 1=1
OWASP 9
A teraz…
http://www.site.com/auktion/auktion.php?id_auk=
1+and+1=1+and+ascii(substring((SELECT
password FROM fh_user+WHERE+iduser=1 LIMIT
0,1),1,1))>1
http://127.0.0.1/[path]/?do=featured&action=sho
wmaincatlanding&maincatid=-99999/**/union/**/
all/**/select/**/group_concat(admin_name,char(5
8),admin_password)v3n0m/**/from/**/admin_table--
OWASP 10
A teraz...
Zaawansowane techniki ataku Blind SQLi, 2nd order SQLi, zaciemniany SQLi,...
Narzędzia ułatwiające włamania
Automatyzacja
Nowe luki odkrywane codziennie
OWASP 11
Przykłady z życia
Maj 2010 - Transport publiczny w Holandii –
wyciek danych 168 000 klientów
2009/2010 – TinKode włamuje się na strony
NASA, IBM, US Army, Kaspersky, Yahoo,
Apple
2009 – wyciek 32 mln loginów i haseł z
RockYou.com
W efekcie…
OWASP 12
Wygrywamy!
Błędy injection na pierwszym
miejscu OWASP Top 10 2010 [owasp.org]
Drugie miejsce w CWE/Sans Top
25 Most Dangerous Programming
Errors 2010 [cwe.mitre.org]
40–60% przypadków wycieku
danych i 19% przypadków naruszenia bezpieczeństwa [7safe.com] [blogs.zdnet.com]
[computerworld.com]
OWASP 13
Jak się bronić?
OWASP 14
Jak tego nie robić, czyli blacklisting…
fragm. FAQ banku Sacramento Credit Union
Takie „zabezpieczenie” nic nie da!
Obejście:
DR/**/OP
I wiele innych...
OWASP 15
Jak się bronić przed SQL injection?
Skąd ten błąd? Łączysz kod z danymi
Metody obrony
Oddziel kod od danych
prepared statements
procedury składowane
Escape’uj dane
Stosuj metody uzupełniające
SELECT * FROM users WHERE login = 'login'
OWASP 16
Jak się bronić?
Prepared statements
OWASP 17
Prepared statements – przykład
// przygotuj zapytanie $stmt = $pdo->prepare( "INSERT INTO registry (name, value) VALUES (:n, :v)"); $stmt->bindValue(':n', $_GET['n']); $stmt->bindValue(':v', $_GET['v']); // wykonaj zapytanie $stmt->execute();
OWASP 18
Prepared statements - podsumowanie
Oferują całkowite zabezpieczenie
Wystarczą niewielkie zmiany w kodzie
Mają dobre wsparcie we wszystkich środowiskach
ALE
Nie wszystkie typy poleceń można parametryzować
Nie w każdym miejscu polecenia można wstawić parametr
OWASP 19
Jak się bronić?
Escape'owanie danych
OWASP 20
Escape'owanie – zasada działania
Dane i polecenia wciąż trzymaj w jednej
zmiennej
Zabezpiecz dane przed „przecieknięciem” do
kodu
Liczby rzutuj na (int) / (float)
Teksty otocz apostrofami, apostrof wewnątrz tekstu poprzedź odpowiednim znakiem specjalnym, np. "\"
OWASP 21
Escape’owanie – przykład
// escape'uj dane $n = $pdo->quote($_GET['n'], PDO::PARAM_STR); $v = $pdo->quote($_GET['v'], PDO::PARAM_STR); // wstaw je do tresci zapytania $pdo->exec("INSERT INTO registry (name, value) VALUES ($n, $v)");
OWASP 22
Problem z escape’owaniem
Escape’owanie zależy od kontekstu!
Używany RDBMS
Konfiguracja bazy
Zestaw znaków
Typ danych
Nie ma uniwersalnego sposobu!
OWASP 23
Escape'owanie danych - podsumowanie
Jest proste, ale musisz znać kontekst
Łatwiej zapomnieć o pojedynczej zmiennej
Jeśli ją pominiesz – aplikacja wciąż działa!
Skłania do stosowania niebezpiecznych konstrukcji
sklejanie poleceń
ignorowanie zmiennych numerycznych
Stosuj tylko, jeśli
Programujesz pod konkretną bazę
Nie ma innej możliwości
OWASP 24
Jak się bronić?
Procedury składowane
OWASP 25
Procedury składowane
Polecenie SQL (lub seria poleceń) przenieś na
serwer i zapisz jako procedurę
Po stronie klienta wywołaj ją z określonymi
parametrami
Dane są formalnie oddzielone od kodu
To NIE wystarcza
OWASP
CREATE PROCEDURE SP_ProductSearch(Prodname IN VARCHAR2) AS sql VARCHAR; code VARCHAR; BEGIN sql := 'SELECT ProductID, ProductName, Category, Price WHERE' + ' ProductName=''' || Prodname || ''''; EXECUTE IMMEDIATE sql INTO code; END;
26
Procedury składowane - przykład
OWASP 27
Procedury składowane – problem
Dynamic SQL Dane znów „przemieszane” z kodem w jednej zmiennej
Jak się obronić?
Oddziel kod od danych
Escape'uj
Nie stosuj Dynamic SQL
OWASP 28
Procedury składowane - podsumowanie
Czasochłonne przenoszenie logiki SQL z aplikacji na serwer
Nie są łatwo przenośne pomiędzy RDBMS
Źle zaimplementowane mogą zwiększyć
podatność
Zarówno wywołanie procedury, jak i jej
kod jest podatny
Procedura może mieć większe
uprawnienia niż kod ją wywołujący
OWASP 29
Jak się bronić?
Metody uzupełniające
OWASP 30
Walidacja i filtrowanie danych
Kontrola poprawności danych zewnętrznych
Odbywa się przed przetwarzaniem tych danych
Nie myl z escape'owaniem!
Filter INPUT - escape OUTPUT
Osobne reguły walidacji dla każdego
parametru - sprawdzaj m.in.
Typ zmiennej
Skalar / tablica
Wartości min / max
Długość danych tekstowych! [1]
OWASP 31
Uzupełniające metody obrony
Komplementarne do poprzednich!
Zasada najmniejszych uprawnień
Regularne aktualizacje
Dobra konfiguracja środowiska (np. w PHP)
magic_quotes_* = false
display_errors = false
Dobrze zaprojektowana baza danych
Web Application Firewall / Intrusion Detection
System / Intrusion Prevention System
OWASP 32
Podsumowanie
SQL injection to jeden z największych błędów bezpieczeństwa
Pojedyncza luka może spowodować duże szkody
Łatwo się przed nim zabezpieczyć:
Stosuj prepared statements wszędzie, gdzie
możesz
W pozostałych wypadkach - escape'uj
Uważaj na Dynamic SQL w procedurach
składowanych
Filtruj dane przychodzące
OWASP 33
Open Web Application Security Project
Ogólnoświatowa, otwarta społeczność skupiona na podnoszeniu poziomu bezpieczeństwa aplikacji
130 lokalnych oddziałów (polski od maja 2007 r.)
Można zupełnie za darmo dołączyć
Organizujemy cykliczne spotkania
Tworzymy narzędzia (wykrywanie zagrożeń, edukacja,
bezpieczne tworzenie aplikacji)
Wydajemy dokumenty dot. bezpieczeństwa aplikacji
www.owasp.org
www.owasp.org/index.php/Poland
OWASP 34
Linki
O SQL injection
www.owasp.org/index.php/SQL_Injection
unixwiz.net/techtips/sql-injection.html
delicious.com/koto/sql+injection
slideshare.net/kkotowicz/owasp-sql-injection
Hack me
threats.pl/bezpieczenstwo-aplikacji-internetowych
tinyurl.com/webgoat
mavensecurity.com/dojo.php
Bezpieczeństwo
owasp.org
niebezpiecznik.pl
[email protected] http://blog.kotowicz.net