Jak ocalić swoje dane przed
                SQL injection?



                         Krzysztof Kotowicz
                ...
Plan


Co to jest SQL injection?
Jak przebiegają ataki?
Jak możemy się bronić?



                        OWASP   2
Co to jest SQL injection?




                            OWASP   3
Błędy typu injection


   Zmuś aplikację, żeby
  wykonywała Twój kod
    dzięki sprytnemu
  manipulowaniu danymi
      wej...
SQL injection w aplikacjach webowych

 Kod to polecenia SQL
 Dane wejściowe to wszystko, co trafia
  do bazy:
       Pa...
Czym to grozi?

 Nieuprawniony dostęp do aplikacji
 Dostęp do całej zawartości bazy /
  baz na serwerze
 Denial of serv...
Jak oni to robią?




                    OWASP   7
Dawno, dawno temu...

 Wyglądało to tak:
String query = ”SELECT * FROM accounts WHERE
  custID = ” + request.getParameter...
A teraz…

http://www.site.com/auktion/auktion.php?id_auk=
1+and+1=1+and+ascii(substring((SELECT
password FROM fh_user+WHER...
A teraz...

 Zaawansowane techniki ataku
  Blind SQLi, 2nd order SQLi,
  zaciemniany SQLi,...
 Narzędzia ułatwiające wła...
Przykłady z życia

 Maj 2010 - Transport publiczny w Holandii –
  wyciek danych 168 000 klientów
 2009/2010 – TinKode wł...
Wygrywamy!

 Błędy injection na pierwszym
  miejscu OWASP Top 10 2010
   [owasp.org]
 Drugie miejsce w CWE/Sans Top
  25...
Jak się bronić?




                  OWASP   13
Jak tego nie robić, czyli blacklisting…




          fragm. FAQ banku Sacramento Credit Union

 Takie „zabezpieczenie” n...
Jak się bronić przed SQL injection?

 Skąd ten błąd? Łączysz kod z danymi

 SELECT * FROM users WHERE login = 'login'

 ...
Jak się bronić?
Prepared statements




                      OWASP   16
Prepared statements – przykład

 // przygotuj zapytanie
 $stmt = $pdo->prepare(
    "INSERT INTO registry (name, value)
  ...
Prepared statements - podsumowanie

 Oferują całkowite zabezpieczenie
 Wystarczą niewielkie zmiany w kodzie
 Mają dobre...
Jak się bronić?
Escape'owanie danych




                       OWASP   19
Escape'owanie – zasada działania

 Dane i polecenia wciąż trzymaj w jednej
  zmiennej
 Zabezpiecz dane przed „przeciekni...
Escape’owanie – przykład



// escape'uj dane
$n = $pdo->quote($_GET['n'], PDO::PARAM_STR);
$v = $pdo->quote($_GET['v'], P...
Problem z escape’owaniem

Escape’owanie zależy od kontekstu!
 Używany RDBMS
 Konfiguracja bazy
 Zestaw znaków
 Typ dan...
Escape'owanie danych - podsumowanie

   Jest proste, ale musisz znać kontekst
   Łatwiej zapomnieć o pojedynczej zmienne...
Jak się bronić?
Procedury składowane




                       OWASP   24
Procedury składowane

 Polecenie SQL (lub seria poleceń) przenieś na
  serwer i zapisz jako procedurę
 Po stronie klient...
Procedury składowane - przykład

CREATE PROCEDURE
  SP_ProductSearch(Prodname IN VARCHAR2) AS
       sql VARCHAR;
       c...
Procedury składowane – problem

 Dynamic SQL
  Dane znów „przemieszane” z kodem w
  jednej zmiennej

 Jak się obronić?
 ...
Procedury składowane - podsumowanie
 Czasochłonne przenoszenie logiki SQL z
  aplikacji na serwer
 Nie są łatwo przenośn...
Jak się bronić?
Metody uzupełniające




                       OWASP   29
Walidacja i filtrowanie danych
 Kontrola poprawności danych zewnętrznych
 Odbywa się przed przetwarzaniem tych danych
 ...
Uzupełniające metody obrony

Komplementarne do poprzednich!
 Zasada najmniejszych uprawnień
 Regularne aktualizacje
 Do...
Podsumowanie

   SQL injection to jeden z największych błędów
    bezpieczeństwa
   Pojedyncza luka może spowodować duże...
Open Web Application Security Project

   Ogólnoświatowa, otwarta społeczność skupiona na
    podnoszeniu poziomu bezpiec...
Linki
    O SQL injection
       www.owasp.org/index.php/SQL_Injection
       unixwiz.net/techtips/sql-injection.html
 ...
Upcoming SlideShare
Loading in …5
×

Jak ocalić swoje dane przed SQL injection?

3,782 views

Published on

Co to jest SQL injection i jak wyglądają współczesne ataki na serwisy? Dlaczego SQL injection jest takie groźne? Jak w praktyce obronić się przed tą luką w bezpieczeństwie i ocalić swoje dane?

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,782
On SlideShare
0
From Embeds
0
Number of Embeds
420
Actions
Shares
0
Downloads
23
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Jak ocalić swoje dane przed SQL injection?

  1. 1. Jak ocalić swoje dane przed SQL injection? Krzysztof Kotowicz Web developer http://web.eskot.pl OWASP Medycyna Praktyczna krzysztof@kotowicz.net czerwiec 2010 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 http://www.owasp.org
  2. 2. Plan Co to jest SQL injection? Jak przebiegają ataki? Jak możemy się bronić? OWASP 2
  3. 3. Co to jest SQL injection? OWASP 3
  4. 4. Błędy typu injection Zmuś aplikację, żeby wykonywała Twój kod dzięki sprytnemu manipulowaniu danymi wejściowymi OWASP 4
  5. 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 5
  6. 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 6
  7. 7. Jak oni to robią? OWASP 7
  8. 8. Dawno, dawno temu...  Wyglądało to tak: 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  Prosty cel dla atakujących  Łatwo wykryć, łatwo się zabezpieczyć OWASP 8
  9. 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_tab le-- OWASP 9
  10. 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 10
  11. 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 11
  12. 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 12
  13. 13. Jak się bronić? OWASP 13
  14. 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 14
  15. 15. Jak się bronić przed SQL injection?  Skąd ten błąd? Łączysz kod z danymi SELECT * FROM users WHERE login = 'login'  Metody obrony  Oddziel kod od danych  prepared statements  procedury składowane  Escape’uj dane  Stosuj metody uzupełniające OWASP 15
  16. 16. Jak się bronić? Prepared statements OWASP 16
  17. 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 17
  18. 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 18
  19. 19. Jak się bronić? Escape'owanie danych OWASP 19
  20. 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 20
  21. 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 21
  22. 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 22
  23. 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 23
  24. 24. Jak się bronić? Procedury składowane OWASP 24
  25. 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 25
  26. 26. Procedury składowane - przykład 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; OWASP 26
  27. 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 27
  28. 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 28
  29. 29. Jak się bronić? Metody uzupełniające OWASP 29
  30. 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 30
  31. 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 31
  32. 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 32
  33. 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 33
  34. 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  krzysztof@kotowicz.net http://blog.kotowicz.net OWASP 34

×