XSS PHP CSP ETC OMG WTF BBQ

Embed Size (px)

Citation preview

Michal paek www.michalspacek.cz @spazef0rze

XSS PHP CSP ETC OMG WTF BBQ

O toku Cross-Site Scripting, hovzm, Content Security Policy i vem ostatnm. Tyto slajdy obsahuj poznmky, kter v pvodn pednce nejsou.

https://commons.wikimedia.org/wiki/File:Standing-rib-roast.jpg

XSSCross-Site Scripting

tok Cross-Site Scripting (XSS) poprv popsal David Ross z Microsoftu u v roce 1999. Od t doby je na webu stle k vidn, nezmizel a pod je tu s nmi. Vvojm se ho toti neda moc eliminovat, i pesto, e o XSS u alespo jednou v ivot slyeli.

Cross-Site Scripting se nevyhb ani znmm, le nejmenovanm firmm. Podvejte se na ze slvy jedn takov a uvidte, kolikrt se na jejich webu objevil. Jednika v alertu na strnce je pro spoustu lid ten tok XSS, ale to vbec nen ve, co doke.

Nzvy foo, bar, foobar a dal slou pro ppad, kdy nevte, jak nco pojmenovat. J kdy nevm, tak to pojmenuju njak takto. Mj SSH kl je sice mj dobr kamard, ale pesto bych nevdl, jak jinak ho pojmenovat.

Trochu m pekvapilo, kdy na m po uloen kle na dal strnce vyskoil n star znm alert. V tomto ppad el Cross-Site Scripting pout k zskn uivatelovo CSRF tokenu z cookie, stailo mu poslat odkaz na strnku, bez JavaScriptu v URL tomu se k Stored XSS. Za nahlen tohoto problmu m Atlassian zaadil do Security Hall of Fame, dky!

LastPass nepouvm jako svj hlavn password manager, take nhodn vygenerovan hlavn heslo mm napsan v jinm sprvci hesel. Nen tedy nic, co by mi ho pipomnlo. A kdy nevm co napsat, tak programuju v JavaScriptu.

Po uloen na m zase vyskoil njak alert, tentokrt ale JavaScript na tomto mst neel k niemu zneut. I pesto m do sn slvy LastPassu zaadili a nahlen tenkrt ocenili 5 body, dky.

echo $row->username;

Z pohledu vvoje vypad tok Cross-Site Scripting napklad takhle. Dostanete za kol nco vypsat, tak to vypete. Narozdl od napklad vyhledvacho polka vs ani nenapadne oetovat uivatelsk jmno. Asi byste se divili, kolik uivatel si do nj schvln vlo njak roztomil JavaScript. Ten se pak spout na kad strnce, kde se jmno vypisuje, tedy napklad i v administraci e-shopu.

Dal a pli ast varianta XSS vypad teba takto. JavaScript, nebo v tomto ppad obrzek, je vloen pmo do URL a uivatel mus na web pijt pes tuto speciln upravenou adresu. Tto variant se k Reflected XSS. Jen pro jistotu, ten obrzek na web nepat, akoliv se tam vlastn docela hod.

The Browser Exploitation Framework (BeEF) Project

Demo

The Browser Exploitation Framework usnaduje spoutn tok XSS. Pomoc nj je mon ovldat vce browser, kter jsou pipojen (hooked) na BeEF server. Browser meme donutit zahrt njakou psniku, zskvat z nj stisknut klvesy nebo v nm zobrazit falen pihlaovac formul. Ukzku naleznete ve videu piblin od 14. minuty.

echo htmlspecialchars($row->username);

Pokud se chcete brnit toku Cross-Site Scripting, mli byste veker uivatelsk vstup vetn uivatelskho jmna oetovat pomoc funkce htmlspecialchars().


var tracking = '';

Pokud budeme vypisovat uivatelsk vstup do JavaScriptu, tak jen samotn htmlspecialchars($vstup) nemus stait. V JavaScriptu se etzce uzavraj do jednoduchch uvozovek (apostrof) a htmlspecialchars() standardn apostrofy nepevd.

echo htmlspecialchars($row->name,ENT_QUOTES);

Abyste htmlspecialchars() donutili pevdt i apostrofy, muste pidat pznak ENT_QUOTES. Jene kvli pevodu 4 znak (, ", ') je tohle pomrn dlouh zpis.

{$row->username}

Nejlep vc, co mete udlat pro obranu proti Cross-Site Scriptingu je pout njak ablonovac systm, kter vstup sprvn a sm automagicky oetuje. Nemete pak na oeten zapomenout. Toto je ukzka sprvn oetenho vpisu uivatelskho jmna v Nette, resp. v ablonovacm systmu Latte.

$el = Html::el() add('Uivatel ') add(Html::el('b')add($rowname)) add(' pidn');

$thisflashMessage($el);

Pi pouit framework a ablonovacch systm je poteba dvat pozor na jejich sprvn pouit. Framework Nette obsahuje hezkou tdu pro vytven HTML kdu, kter se d pout napklad pro zobrazovn flash message s formtovnm zprvy. Najdete v tto ukzce zobrazen flash message Uivatel Michal pidn chybu, kter umouje provst XSS? Aktualizace: v Nette/Utils 2.4.0 byla metoda add() pejmenovna na jasnj addHtml() a byla pidna nov metoda addText().

$el = Html::el() setText('Uivatel ') add(Html::el('b')setText($rowname)) add(Html::el()setText(' pidn'));

$this->flashMessage($el);

Msto metody add() byste mli pout metodu setText(), ta oetuje uivatelsk vstup. Slova Uivatel a pidn bychom sice mohli pipojit pomoc add(), ale pro jistotu pouijeme tak setText(). V budoucnu by toti nkdo mohl text nahradit za uivatelsk vstup a nemusel by si vimnout, e m zmnit i jmno metody. Aktualizace: v Nette/Utils 2.4.0 byla metoda add() pejmenovna na pesnj addHtml() a byla pidna nov metoda addText(), tu mete pout tak.

XSSAuditor/Filter

Webov vvoji zapomnaj vstupy oetovat a zapomnat budou z rznch dvod inadle. Proto se vrobci browser u ped asem rozhodli, e zavedou nkolik dalch rovn obrany, kter mohou problm do jist mry zmenit. Jedna z takovch rovn je tzv. XSS Auditor (nkdy nazvno jako XSS filtr), kter je v Chrome a IE. Do Firefoxu si ho mete pidat instalac rozen NoScript. XSS filtr me zabrnit toku Reflected XSS tm, e v poadavku, nap. v adrese nebo formulovch polch hled JavaScript a zkoum, jestli se nevrtil v odpovdi serveru a pokud ano, tak jeho sputn zablokuje, ale strnku zobraz.

X-XSS-Protection: 1; mode=block

Vyitn strnky je defaultn nastaven. XSS auditor se nkdy nemus sprvn trefit a me zablokovat sputn sprvnho JavaScriptu nebo pi pokusu o opravu strnky prv me njak Cross-Site Scripting vyrobit. Proto je lep ze serveru poslat hlaviku zobrazenou ve a filtr nastavit do reimu block. Nebo ho pln vypnout pomoc hodnoty 0.

X-XSS-Protection: 1; mode=block; report=https://

Hlavika X-XSS-Protection m nestandardn rozen report. Hodnotou tohoto parametru je adresa, na kterou browser nvtvnka pole report, pokud se XSS auditor aktivuje. Vy se tedy dozvte, jestli na webu nkde mte monost Reflected XSS provst. Report podporuje WebKit a Chromium a prohlee na nich postaven.

request-url + request-body

Browser na uvedenou adresu pole JSON se dvma kli, request-url a request-body. Dozvte se tedy na jak adrese je mon XSS provst a jak poadavek aktivaci XSS auditoru zpsobil a problm pak mete vyeit. Reporty si mete poslat do vlastn aplikace, v budoucnu by tento typ report mohl umt i nstroj report-uri.io.

CSPContent Security Policy

Content Security Policy um zabrnit i ostatnm typm XSS tok, nejenom Reflected variant. CSP podporuj vechny modern browsery (Chrome, Firefox, Edge a nkter dal) a spov v tom, e browseru pomoc whitelistu eknete, kter zdroje (nap. JavaScript, obrzky a dal) a odkud me do aktuln zobrazovan strnky natat. Pokud chcete CSP pouvat pro weby psan v Nette, sledujte vvoj balku spaze/csp-config na GitHubu.

Content Security Policy je v podstat obyejn HTTP hlavika, kterou server prohlei posl. Obsah t hlaviky me bt pomrn dlouh, podle toho, co vechno chci browseru povolit. Hlavika tak me bt na kad strnce jin.

Content-Security-Policy: default-src 'self'

Zkladn nastaven, kter byste mohli chtt pouvat je defaultn povolit natn obrzk, JavaScript a dalch zdroj pouze z domny, na kter je umstna natan strnka. To zajistme pouitm direktivy default-src a hodnoty 'self' v apostrofech. Browser pak napklad JavaScript vloen do strnky pomoc nenate a to i pesto, e v HTML takov znaka opravdu bude. Psnj je nastaven default-src 'none', kter zake natn veho odkudkoliv. Nebojte, postupn jednotliv typy zdroj povolme.

Content-Security-Policy:
default-src 'self';
img-src 'self' https://www.google-analytics.com

CSP direktiva img-src uruje, odkud me browser natat obrzky. Hodnotou 'self' km, e je mohu natat pouze z aktuln domny a druhou hodnotou https://www.google-analytics.com km, e prohle nate i obrzky vloen pomoc . Google Analytics si do strnky vkld obrzek pomoc JavaScriptu, pro sprvnou funknost to musme tedy povolit. Ostatn zdroje, napklad kaskdov styly se natou pouze ze 'self' domny, povol to direktiva default-src. Hlavika by samozejm mla bt na jedn dce, na slajdech je rozdlena z dvodu nedostatku msta.

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 urujeme, odkud browser me sthnout a spustit JavaScript. Hodnoty 'self' a https://www.google-analytics.com opt kaj, e do strnky se me stahovat JavaScript pouze z aktuln domny a z domny https://www.google-analytics.com. Nespust se dokonce ani inline JavaScript, tedy kd napsan mezi znakami a 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 chtli spoutt, muste pidat hodnotu 'unsafe-inline'. U z nzvu je vidt, e tvrci specifikace CSP povauj inline JavaScript za nebezpen. Mohl ho do strnky toti vloit tonk. Pouvat inline JavaScript bych nedoporuoval, nepjemn ale je to, e bez nj nefunguj nkter nstroje jako napklad Google Tag Manager. Pokud ho na strnkch pouvte, muste mt 'unsafe-inline' povolen. Content Security Policy Level 2 pidv monost k inline JavaScriptu pipojit hash nebo token pro oven, m se zaru, e pmo ve strnce bude sputn pouze JS, kter je pedem znm. Podpora tohoto zpsobu zatm nen v browserech moc rozen, bohuel.

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 strnky budete chtt vloit njak iframe, napklad video z YouTube, tak muste domnu povolit pomoc direktivy frame-src. Tato direktiva mus bt uvedena i kdy byste chtli do strnky vloit frame z va domny, default-src 'self' toti nezahrnuje frame-src. Direktiva frame-src je zastaral, v novj verzi CSP je nahrazena direktivou child-src a ta ji do default-src spad. Tu bohuel nepodporuje teba Safari a nejastji to dopad tak, e se prost pole child-src aframe-src zrove, se stejnmi 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 odeslaj formule na strnce. Direktiva do default-src tak nespad. Pomoc form-action 'self' km, e formule bude mon odeslat pouze na aktuln domnu. tonk tak neme vloit njak falen formul, kter si odele k sob.

V HTML 5 je mon do strnky vloit odeslac tlako i mimo samotn formul apomoc atributu form ho s tmto formulem propojit. Pomoc formaction mu pak dokonce mohu zmnit adresu, kam se formul odele. Velkm tlatkem s npisem Neklikejte sem tak mohu uivateli ukrst teba statick CSRF token. Tomuto typu toku se k Scriptless Attack a nejen kvli nmu byste mli omezit, kam vae formule lze odeslat.

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 nabz reportovn, pokud k poruen njak nastaven politiky v browseru dojde. Prohle na zadanou adresu opt odele JSON, tentokrt trochu vt. Pijmn a zobrazovn report si mete napsat sami, ale je vhodnj pout slubu report-uri.io. Uivatel maj toti zavirovan potae, jsou pipojen na zkench Wi-Fi stch, kter do strnek vkldaj reklamy, nebo maj jen nainstalovan patn napsan extenze prohle a tohle vechno zaru, e vm tch report bude chodit celkem dost.

Napsat sprvn zobrazovn report nen zrovna lehk a je zbyten to dlat znovu. Sluba report-uri.io um pehledn zobrazovat reporty, vytvet grafy apod. apome vm zjistit, kde je problm. Ve je vidt report, kter mi oznamuje, e jsem udlal chybu na svm webu, pokusil jsem se toti vloit obrzek ze patnho umstn, kter nen povolen. Mj admin toti nem povoleno vkldat obrzky z https://admin.michalspacek.cz. Bezpenostn tok by byl hlen 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/

Zavdt CSP na existujc web nen jednoduch. Muste udlat inventuru vech mcch kd na webu, zjistit co na strnky vechno vkldte a to zabere njakou dobu. CSP vm me pomoci. Report Only varianta se zapn hlavikou Content-Security-Policy-Report-Only a k browseru, e kdy dojde k poruen njak nastaven politiky, tak m sice poslat report, ale akci (zobrazen obrzku, sputn JS) m stejn provst. To se prv hod pro zavdn CSP na bc web. V logu pak najdete co jet mte povolit, pokud to dv smysl.

Michal paek
www.michalspacek.cz @spazef0rze

Tatra sice nezn bratra, ale je to jednika.
Zante pouvat CSP a bute lep!