“Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

34
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 [email protected] czerwiec 2010

description

 

Transcript of “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

Page 1: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

[email protected]

czerwiec 2010

Page 2: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

OWASP 2

Plan

Co to jest SQL injection?

Jak przebiegają ataki?

Jak możemy się bronić?

Page 3: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

OWASP 3

Co to jest SQL injection?

Page 4: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

OWASP 4

Błędy typu injection

Zmuś aplikację, żeby wykonywała Twój kod

dzięki sprytnemu manipulowaniu danymi

wejściowymi

Page 5: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

...

Page 6: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 7: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

OWASP 7

Jak oni to robią?

Page 8: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 9: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #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--

Page 10: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 11: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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…

Page 12: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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]

Page 13: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

OWASP 13

Jak się bronić?

Page 14: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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...

Page 15: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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'

Page 16: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

OWASP 16

Jak się bronić?

Prepared statements

Page 17: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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();

Page 18: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 19: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

OWASP 19

Jak się bronić?

Escape'owanie danych

Page 20: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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. "\"

Page 21: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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)");

Page 22: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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!

Page 23: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 24: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

OWASP 24

Jak się bronić?

Procedury składowane

Page 25: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 26: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 27: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 28: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 29: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

OWASP 29

Jak się bronić?

Metody uzupełniające

Page 30: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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]

Page 31: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #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

Page 32: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 33: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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

Page 34: “Jak ocalić swoje dane przed SQL injection?” - Krzysztof Kotowicz na KrakSpot Tech #1

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