62
Defeating cross-site scripting with Content Security Policy François Marier – @fmarier

Defeating Cross-Site Scripting with Content Security Policy (updated)

Embed Size (px)

DESCRIPTION

How a new HTTP response header can help increase the depth of your web application defenses. Also includes a few slides on HTTP Strict Transport Security, a header which helps protects HTTPS sites from sslstrip attacks.

Citation preview

Page 1: Defeating Cross-Site Scripting with Content Security Policy (updated)

Defeating cross-site scriptingwith Content Security Policy

François Marier – @fmarier

Page 2: Defeating Cross-Site Scripting with Content Security Policy (updated)

what is a cross-site scripting(aka “XSS”) attack?

Page 3: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 4: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 5: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 6: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 7: Defeating Cross-Site Scripting with Content Security Policy (updated)

preventing XSS attacks

Page 8: Defeating Cross-Site Scripting with Content Security Policy (updated)

print <<<EOF<html>

<h1>$title</h1>

</html>EOF;

Page 9: Defeating Cross-Site Scripting with Content Security Policy (updated)

$title = escape($title);

print <<<EOF<html>

<h1>$title</h1>

</html>EOF;

Page 10: Defeating Cross-Site Scripting with Content Security Policy (updated)

templating system

Page 11: Defeating Cross-Site Scripting with Content Security Policy (updated)

page.tpl:

<html><h1>{title}</h1></html>

page.php:

render(“page.tpl”, $title);

Page 12: Defeating Cross-Site Scripting with Content Security Policy (updated)

auto-escaping turned ON

Page 13: Defeating Cross-Site Scripting with Content Security Policy (updated)

page.tpl:

<html><h1>{title|raw}</h1></html>

page.php:

render(“page.tpl”, $title);

Page 14: Defeating Cross-Site Scripting with Content Security Policy (updated)

auto-escaping turned ON

escaping always ON

Page 15: Defeating Cross-Site Scripting with Content Security Policy (updated)

browser default = allow all

the real problem:

Page 16: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 17: Defeating Cross-Site Scripting with Content Security Policy (updated)

a way to get the browserto enforce the restrictions

you want on your site

Page 18: Defeating Cross-Site Scripting with Content Security Policy (updated)

$ curl --head http://example.com/

Content-Security-Policy: default-src 'self' ; img-src 'self' data ;

Page 19: Defeating Cross-Site Scripting with Content Security Policy (updated)

$ curl --head https://example.com/login

Content-Security-Policy: default-src 'self' ; img-src 'self' data ; frame-src 'self' https://login.persona.org ; script-src 'self' https://login.persona.org

Page 20: Defeating Cross-Site Scripting with Content Security Policy (updated)

$ curl --head http://fmarier.org/

Content-Security-Policy: default-src 'none' ; img-src 'self' ; style-src 'self' ; font-src 'self'

Page 21: Defeating Cross-Site Scripting with Content Security Policy (updated)

<object>, <applet> & <embed><script>

<style> & <link><img>

<audio>, <video>, <source> & <track><frame> & <iframe>

@font-face

WebSocket, EventSource, & XMLHttpRequest

Page 22: Defeating Cross-Site Scripting with Content Security Policy (updated)

>= 10

Page 23: Defeating Cross-Site Scripting with Content Security Policy (updated)

what does a CSP-enabledwebsite look like?

Page 24: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 25: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 26: Defeating Cross-Site Scripting with Content Security Policy (updated)

unless explicitly allowed by your policy

inline scripts are not executed

Page 27: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 28: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 29: Defeating Cross-Site Scripting with Content Security Policy (updated)

unless explicitly allowed by your policy

external resources are not loaded

Page 30: Defeating Cross-Site Scripting with Content Security Policy (updated)

preparing your website for CSP(aka things you can do today)

Page 31: Defeating Cross-Site Scripting with Content Security Policy (updated)

eliminate inline scripts and styles

Page 32: Defeating Cross-Site Scripting with Content Security Policy (updated)

<script>do_stuff();</script>

Page 33: Defeating Cross-Site Scripting with Content Security Policy (updated)

<script src=”do_stuff.js”>

</script>

Page 34: Defeating Cross-Site Scripting with Content Security Policy (updated)

eliminate javascript: URIs

Page 35: Defeating Cross-Site Scripting with Content Security Policy (updated)

<a href=”javascript:go()”>Go!</a>

Page 36: Defeating Cross-Site Scripting with Content Security Policy (updated)

<a id=”go-button” href=”#”>Go!</a>

var button = document.getElementById('go-button');button.onclick = go;

Page 37: Defeating Cross-Site Scripting with Content Security Policy (updated)

rolling out CSP

Page 38: Defeating Cross-Site Scripting with Content Security Policy (updated)

start with a loose policy

Page 39: Defeating Cross-Site Scripting with Content Security Policy (updated)

default-src 'self' *.example.com data;

Page 40: Defeating Cross-Site Scripting with Content Security Policy (updated)

default-src 'self' *.example.com data;

options unsafe-inline

Page 41: Defeating Cross-Site Scripting with Content Security Policy (updated)

work towards a stricter policy

Page 42: Defeating Cross-Site Scripting with Content Security Policy (updated)

default-src 'self';

img-src 'self' static.example.com data;

style-src static.example.com;

script-src static.example.com

Page 43: Defeating Cross-Site Scripting with Content Security Policy (updated)

use the reporting mode

Page 44: Defeating Cross-Site Scripting with Content Security Policy (updated)

Content-Security-Policy-Report-Only:default-src 'none' ;

report-uri http://example.com/report.cgi

Page 45: Defeating Cross-Site Scripting with Content Security Policy (updated)

{

"csp-report": {

"document-uri": "http://example.com/page.html",

"referrer": "http://evil.example.com/haxor.html",

"blocked-uri": "http://evil.example.com/foo.png",

"violated-directive": "default-src 'none'",

"original-policy": "default-src 'none' ... "

}

}

Page 46: Defeating Cross-Site Scripting with Content Security Policy (updated)

add headers in web server config

Page 47: Defeating Cross-Site Scripting with Content Security Policy (updated)

<Location /some/page>

Header set Content-Security-Policy "default-src 'self' ; script-src 'self' http://example.org"

</Location>

Page 48: Defeating Cross-Site Scripting with Content Security Policy (updated)

not areplacement for proper

XSS hygiene

Page 49: Defeating Cross-Site Scripting with Content Security Policy (updated)

great tool toincrease the

depth of your defenses

Page 50: Defeating Cross-Site Scripting with Content Security Policy (updated)

@fmarier http://fmarier.org

Spec:http://www.w3.org/TR/CSP/

HOWTO:https://developer.mozilla.org/en/Security/CSP

Page 51: Defeating Cross-Site Scripting with Content Security Policy (updated)

bonusHTTP header

100 %FREE!

Page 52: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 53: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 54: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 55: Defeating Cross-Site Scripting with Content Security Policy (updated)

wouldn't it be nice if the browser...

Page 56: Defeating Cross-Site Scripting with Content Security Policy (updated)

...blocked all HTTP requests there?

Page 57: Defeating Cross-Site Scripting with Content Security Policy (updated)

HTTP StrictTransport Security

Page 58: Defeating Cross-Site Scripting with Content Security Policy (updated)

$ curl --head https://login.persona.org

HTTP/1.1 200 OKVary: Accept-Encoding,Accept-LanguageCache-Control: public, max-age=0Content-Type: text/html; charset=utf8Strict-Transport-Security: max-age= 2592000Date: Thu, 16 Aug 2012 03:29:19 GMTETag: "2943768d6a45793897e83bf8804cd711"Connection: keep-aliveX-Frame-Options: DENYContent-Length: 5374

Page 59: Defeating Cross-Site Scripting with Content Security Policy (updated)
Page 60: Defeating Cross-Site Scripting with Content Security Policy (updated)

HTTPS only site turn HSTS on

Page 61: Defeating Cross-Site Scripting with Content Security Policy (updated)

Spec:http://www.w3.org/TR/CSP/https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec

HOWTO:https://developer.mozilla.org/en/Security/CSPhttps://developer.mozilla.org/en/Security/HTTP_Strict_Transport_Security

@fmarier http://fmarier.org

Page 62: Defeating Cross-Site Scripting with Content Security Policy (updated)

Photo credits:

Biohazard wallpaper: http://www.flickr.com/photos/rockyx/4273385120/

Under Construction: https://secure.flickr.com/photos/aguichard/6864586905/

Castle walls: https://secure.flickr.com/photos/rdale/585105348/

Wash hands: https://secure.flickr.com/photos/hygienematters/4504612019/

Copyright © 2012 François MarierReleased under the terms of the Creative CommonsAttribution Share Alike 3.0 Unported Licence