defeating cross-site scripting with content security policy

42
Defeating cross-site scripting with Content Security Policy Francois Marier <[email protected]>

Upload: francois-marier

Post on 08-May-2015

1.990 views

Category:

Technology


0 download

DESCRIPTION

How a new proposed HTTP response header can help increase the depth of your web application defenses.

TRANSCRIPT

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

Defeating cross-site scriptingwith Content Security Policy

Francois Marier <[email protected]>

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

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

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

preventing XSS attacks

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

print <<<EOF<html>

<h1>$title</h1>

</html>EOF;

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

$title = escape($title);

print <<<EOF<html>

<h1>$title</h1>

</html>EOF;

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

templating system

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

page.tpl:

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

page.php:

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

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

auto-escaping turned ON

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

page.tpl:

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

page.php:

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

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

auto-escaping turned ON

!=

escaping always ON

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

browser default = allow all

the real problem:

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

a way to get the browserto enforce the restrictions

you want on your site

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

$ curl --head https://www.libravatar.org/

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

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

$ curl --head https://www.libravatar.org/account/login/

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

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

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

X-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

<object><script><style><img>

<audio> & <video><frame> & <iframe>

<font>

WebSocket & XMLHttpRequest

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

>= 4 >= 13 >= 10>= 5

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

what does a CSP-enabledwebsite look like?

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

unless explicitly allowed by your policy

inline scripts are not executed

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

unless explicitly allowed by your policy

external resources are not loaded

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

preparing your website for CSP

(aka things you can do today)

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

eliminate inline scripts and styles

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

<script>do_stuff();</script>

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

<script src=”do_stuff.js”>

</script>

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

eliminate javascript: URIs

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

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

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

<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

add headers in web server config

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

<Location /some/page>

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

</Location>

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

not a replacement forproper XSS hygiene

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

great tool to increase thedepth of your defenses

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

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

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

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

fmarier fmarier

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

Credits:

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

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