Slide 1

Slide 1 text

XSS, CSRF, CSP, JWT, WTF? IDK ¯\_( ツ)_/¯ Dominik Kundel - @dkundel Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 2

Slide 2 text

Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 3

Slide 3 text

XSS, CSRF, CSP, JWT, WTF? IDK ¯\_( ツ)_/¯ Dominik Kundel - @dkundel Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 4

Slide 4 text

Introduction to WEB SECURITY Dominik Kundel - @dkundel Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 5

Slide 5 text

⁇ XSS ⁇ ⁇ CSRF ⁇ ⁇ CSP ⁇ ⁇ JWT ⁇ Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 6

Slide 6 text

Hi! I'm Dominik Kundel! Developer Evangelist at github/dkundel @dkundel [email protected] Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 7

Slide 7 text

Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 8

Slide 8 text

#onesiejs Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 9

Slide 9 text

Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 10

Slide 10 text

Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 11

Slide 11 text

SECURITY! SECURITY! SECURITY! Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 12

Slide 12 text

I THOUGHT OF EVERYTHING Only HTTPS powered by Let's Encrypt It even uses HSTS (HTTP Strict Transport Security) no mixed content Sanitized HTML No room for SQL injections Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 13

Slide 13 text

NO REAL DATABASE NO REAL DATABASE INJECTIONS Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 14

Slide 14 text

Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 15

Slide 15 text

BOB ALLISON Security Expert Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 16

Slide 16 text

https://onesie.life Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 17

Slide 17 text

USE HttpOnly COOKIES // Make cookies HTTP only res.cookie('authToken', jwt, { httpOnly: true, signed: true, secure: true }); Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 18

Slide 18 text

USE SAFE JWT IMPLEMENTATIONS const jwt = require('jsonwebtoken'); jwt.verify(token, secret, { algorithms: ['HS256'] }, (err, payload) => { if (err) { console.log('Invalid token!'); return; } console.log('Valid token!'); }); Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 19

Slide 19 text

Don't be the next Equifax Stay up-to-date! Image: Michael Nagle/Bloomberg via Getty Images Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 20

Slide 20 text

LET'S POST SOMETHING! onesie.life Feed Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 21

Slide 21 text

CROSS SITE REQUEST FORGERY hack-onesie.glitch.me/xsrf Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 22

Slide 22 text

WHAT HAPPENED? Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 23

Slide 23 text

window.opener window.opener.location = 'http://my-evil-website.com'; Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 24

Slide 24 text

USE "noopener" Dangerous Link Saf e Link Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 25

Slide 25 text

USE CSRF TOKENS const csrf = require('csurf')({ cookie: true }); app.get('/post', csrf, (req, res, next) => { // pass csrf to front-end via _csrf cookie or // req.csrfToken() in template }); app.post('/post', csrf, (req, res, next) => { // only valid if one of these is the same as the cookie: // req.body._csrf // req.query._csrf // req.headers['csrf-token'] // req.headers['xsrf-token'] // req.headers['x-csrf-token'] // req.headers['x-xsrf-token'] }); Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 26

Slide 26 text

Little Bobby Tables Young Brother Samy '"src="javascript:alert(1); XSS Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 27

Slide 27 text

https://xkcd.com/327/ Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 28

Slide 28 text

Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 29

Slide 29 text

MYSPACE WORM Samy worm / JS.Spacehero worm Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 30

Slide 30 text

TRICKS USED BY SAMY
// avoid blacklisted words like innerHTML through string concat alert(eval('document.body.inne' + 'rHTML')); eval('xmlhttp.onread' + 'ystatechange = callback'); samy.pl/popular/tech.html Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 31

Slide 31 text

OBSTRUSIVE JAVASCRIPT // Different ways to eval new Function(CODE)() // or setTimeout(CODE, 0) // or []["filter"]["constructor"]( CODE )() // or [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[]) [+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]] +[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+ []+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![ ]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+ !+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[ ]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[]) [+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![] +[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+ (!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!! []+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![ Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 32

Slide 32 text

BLOCKING XSS IS NOT TRIVIAL onesie.life Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 33

Slide 33 text

ENCODING CAN BE dangerous! Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 34

Slide 34 text

CSS CAN BE DANGEROUS! twitter.com/jaffathecake/status/968500192210227202 Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 35

Slide 35 text

JSONP JSON with Padding function gotPosts(data) { console.log(data); } Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 36

Slide 36 text

XSS + POOR JSONP = onesie.life Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 37

Slide 37 text

Content-Security-Policy Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 38

Slide 38 text

CSP DEMO onesie.life/secure/home Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 39

Slide 39 text

CSP EXAMPLE HEADER Content-Security-Policy: default-src 'self'; script-src 'nonce-NWo2+pmewRLPWqpsgv6J2w=='; style-src 'nonce-NWo2+pmewRLPWqpsgv6J2w=='; object-src 'none'; img-src 'self' api.adorable.io; font-src 'self' fonts.gstatic.com; block-all-mixed-content; report-uri /csp-report; Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 40

Slide 40 text

CSP IS NOT YOUR SECURITY STRATEGY! CSP is a Safety Net! Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 41

Slide 41 text

OTHER THINGS TO LOOK OUT FOR Avoid clickjacking by disallowing framing using X-Frame-Options: deny Check out libraries like helmet for essential HTTP headers. Don't show versions of front-end libs or server Check for types of input(Can cause NoSQL injections) Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 42

Slide 42 text

OTHER THINGS TO DO Consider Security Audits Stay up to date with versions (Greenkeeper) Use tools to detect security vulnerabilites (NSP, Snyk) Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 43

Slide 43 text

Summary Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 44

Slide 44 text

USE SIGNED HttpOnly COOKIES Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 45

Slide 45 text

BE SCEPTICAL OF JWTS Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 46

Slide 46 text

rel="noopener noreferrer" Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 47

Slide 47 text

USE CSRF TOKENS Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 48

Slide 48 text

BLOCKING XSS ISN'T TRIVIAL Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 49

Slide 49 text

BE AWARE OF ENCODING Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 50

Slide 50 text

BE CAREFUL WITH JSONP Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 51

Slide 51 text

USE CSP AS A SAFETY NET Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 52

Slide 52 text

STAY UP-TO-DATE Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 53

Slide 53 text

d-k.im/sec-ngoslo Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 54

Slide 54 text

bit.ly/onesie-life Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec

Slide 55

Slide 55 text

Dominik Kundel Thank you! d-k.im/sec-ngoslo github/dkundel @dkundel [email protected] Dominik Kundel | @dkundel | #angularoslo #ndcoslo #websec