javascript security

81
JavaScript Security jason harwig

Upload: jason-harwig

Post on 13-May-2015

14.603 views

Category:

Technology


0 download

DESCRIPTION

JavaScript, as it is today, is an insecure language. We need to understand it's shortcomings to improve the security of our applications to protect our users.

TRANSCRIPT

Page 1: JavaScript Security

JavaScript Security

jason harwig

Page 2: JavaScript Security

"How dangerous could this silly little toy

scripting language running inside a browser be?"

Jeff Atwoodcodinghorror.comstackoverflow.com

Page 3: JavaScript Security

douglas crockford

“JavaScript's biggest weakness is that it is

not secure.”

Page 4: JavaScript Security

WhiteHat Security Website Security Statistic Report

"...nine out of 10 websites still have serious

vulnerabilities. .. (XSS) as the top

vulnerability class"

Page 5: JavaScript Security

1. XSS

2. Injection Flaws

3. File Exec

4. Direct Object Reference

5. CSRF

6. Information Leakage

7. Broken Auth

8. Insecure Crypto

9. Insecure Communications

10.Failure to restrict URL access

OWASP Top 10 2007

Page 6: JavaScript Security

browser limitations

Page 7: JavaScript Security

javascript IO

• Ajax

• Image

• iFrame

• Source script

• Bridge to flash, Java applets

Page 8: JavaScript Security

var xhr = new XmlHttpRequest();

xhr.open(...)

Page 9: JavaScript Security

* get or post

NIC Server Google

Page 10: JavaScript Security

var image = new Image();

image.src = url;

* can detect connection success failure

Page 11: JavaScript Security

* get requests only | onload | onerror

NIC Server Google

Page 12: JavaScript Security

f = document.createElement('iframe');

f.src = url;

document.body.appendChild(f);

* only if same domain

Page 13: JavaScript Security

* get requests only

NIC Server Google

Page 14: JavaScript Security

s = document.createElement('script');

s.type = 'text/javascript';

s.src= url;

document.body.appendChild(s);

* if JSON returned

Page 15: JavaScript Security

* get requests only

NIC Server Google

Page 16: JavaScript Security

f = document.createElement('form');

f.method = 'post';

...

f.submit();

Page 17: JavaScript Security

* get or post

NIC Server Google

Page 18: JavaScript Security

white hat

• Mashup / Aggregate content

• SSO Solutions

• Protect users / application integrity

Page 19: JavaScript Security

black hat

• XSS

• CSRF

• JSON hi-jacking

• Cookie session hijacking

• Internal network scanning

• History checking

Page 20: JavaScript Security

cross-site scripting

Page 21: JavaScript Security

same origin policy

Browser IFrameIFrame

Page 22: JavaScript Security

user input

escape it!

Page 23: JavaScript Security

XSS Flavors

• Type 0 - DOM

• Type 1 - Non-Persistant

• Type 2 - Persistant

Page 24: JavaScript Security

type 0

var p = location.href.params;document.body.innerHTML = p

Page 25: JavaScript Security

<script>alert('xss');</script>Search:

Type 1

Page 26: JavaScript Security

<script>alert('xss');</script>Please enter username:

Type 2

Page 27: JavaScript Security

<c:out value="${var}" escapeXml="true"/>Your Username: <script>alert('xss');</script>

Page 28: JavaScript Security

html filtering

Page 29: JavaScript Security

samy is my hero

from http://fast.info/myspace/

Page 30: JavaScript Security

0

1,750

3,500

5,250

7,000

12:34pm 1:30am 8:35am 9:30am 10:30am 1:30pm

Friend Requests

Page 31: JavaScript Security

<div style="background:url( 'javascript:alert('xss')')">

tag/attribute whitelist

Page 32: JavaScript Security

<div style="background:url( 'java\nscript:alert('xss')')">

'javascript' stripped

Page 33: JavaScript Security

String.fromCharCode(34);

\" stripped

Page 34: JavaScript Security

eval('document.body.inne' + 'rHTML');

innerHTML stripped

Page 35: JavaScript Security

eval('xmlhttp.onread' + 'ystatechange = callback');

onreadystatechange stripped

Page 36: JavaScript Security

to be continued...

Page 37: JavaScript Security

alternatives to escaping?

Page 38: JavaScript Security

google caja / ADsafe

Page 39: JavaScript Security

attack vectors to prevent?

Page 40: JavaScript Security

eval('alert(document.cookie)');(new Function('alert(document.cookie)'))();

code evaluation

Page 41: JavaScript Security

code eval continued

<iframe src="java&#65533;script:alert('xss')"></iframe>

Page 42: JavaScript Security

poluting global objects

try { throw EvilArrayFunction;} catch (Array) { }

Page 43: JavaScript Security

xss lessons

• Escape XML

Page 44: JavaScript Security

cross site request forgerythe new kid

Page 45: JavaScript Security

NIC Server Google

Page 46: JavaScript Security

Digg.com

• “digg” a story while logged in

• Cookie authentication

• known url, parameters

Page 47: JavaScript Security
Page 48: JavaScript Security

digg exploit code

mf = window.frames["myframe"];html = '<form name="diggform" \ action="http://digg.com/diginfull" method="post">';html = html+'<input type="text" name="id" value="367034"/>';html = html+'<input type="text" name="orderchange" value="2"/>';html = html+'<input type="text" name="category" value="0"/>';html = html+'<input type="text" name="page" value="0"/>';html = html+'<input type="text" name="t" value="undefined"/>';html = html+'<input type="text" name="row" value="1"/>';html = html+'</form>';mf.document.body.innerHTML = html;mf.document.diggform.submit();

from http://4diggers.blogspot.com/

Page 49: JavaScript Security

Fixes?

• Referral checking?

• quick cookie expiration?

• post?

Page 50: JavaScript Security

session.setAttribute("token", token);

<input type="hidden" value="${token}"/>

solved

Page 51: JavaScript Security

double submit cookie

Page 52: JavaScript Security

digg link

<a href="javascript:dig([num],[id],[digCheck])">digg it</a>

Page 53: JavaScript Security

digg submit js

new Ajax.Request("/diginfull", { "method": "post", "parameters": "id=" + itemd + "&row=" + row + "&digcheck=" + digcheck + "&type=" + type + "&loc=" + pagetype});

Page 54: JavaScript Security

no diggcheck, no digg

Page 55: JavaScript Security

digg.com

• Added random hash as post parameter

• server verifies request

Page 56: JavaScript Security

myspace

• used hash in post to add friends

• XSS vulnerable so the hash could be retrieved

Page 57: JavaScript Security

HDIV

• HTTP Data Integrity Validator

Page 58: JavaScript Security

rsnake joins twitter

Page 59: JavaScript Security
Page 60: JavaScript Security
Page 61: JavaScript Security

crossdomain.xml

<?xml version="1.0" encoding="UTF-8"?><cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"> <allow-access-from domain="*.twitter.com" /> <site-control permitted-cross-domain-policies="master-only"/> <allow-http-request-headers-from domain="*.twitter.com" headers="*" secure="true"/></cross-domain-policy>

Page 62: JavaScript Security

http://www.yourminis.com/search_minis.aspx?q=XSS

Page 63: JavaScript Security

stealing your gmail contacts

Page 64: JavaScript Security

google contacts url

contacts?out=js&callback=google

Page 65: JavaScript Security

google ({ Success: true, Errors: [], Body: { Contacts: [ { id, email, etc. } ] }});

responseText

Page 66: JavaScript Security

google’s solution?

• responseXml

Page 67: JavaScript Security

lessons

• Protect high value forms

• CANNOT be stopped if site is vulnerable to XSS

Page 68: JavaScript Security

json hijacking

Page 69: JavaScript Security

new Ajax.Request('secretStuff', { onSuccess: doWork});

// server responds with[ { sensitive_info: '...' }, { sensitive_info: '...' }]

Page 70: JavaScript Security

So how do I do it?

• Override Array

• Source script

Page 71: JavaScript Security

demo

Page 72: JavaScript Security

solved

/*-secure-

[ { sensitive_info: '...' }, { sensitive_info: '...' }]

*/

Page 73: JavaScript Security

“solved” continued

• protect JSON services behind post

Page 74: JavaScript Security

lessons

• Many experts recommend JSON services shouldn’t serve sensitive data

• use secure comment

• responseXml as alternative

Page 75: JavaScript Security

Session hijacking

Page 76: JavaScript Security

demo

Page 77: JavaScript Security

internal network penetration

Page 78: JavaScript Security

history hijack

Page 79: JavaScript Security

demo

Page 80: JavaScript Security

resources

"Security Now! Podcast"twit.tv/sn

"WhiteHat Security"whitehatsec.com

"Jeremiah Grossman Blog"jeremiahgrossman.blogspot.com

"Digg Hack"4diggers.blogspot.com

"Fortify"fortifysoftware.com/security-resources/

"XSS Generator"ha.ckers.org/xss.html

"Samy is my Hero"fast.info/myspace

"HDIV"hdiv.org

Page 81: JavaScript Security

twitter: jharwig

[email protected]

nearinfinity.com/blogs

[email protected]

81