Säkra webbapplikationer. John Wilander, Omegapoint, KTH maj 2010

Relevanta dokument
Säkerhet i applikationslagret och slaget om webben. John Wilander, Omegapoint, Rätt säkerhet, maj 2010

Modul 6 Webbsäkerhet

OWASP Topp De 10 allvarligaste riskerna i webbapplikationer OWASP East Sweden: Uppstartsmöte

E12 "Evil is going on"

Webbsäkerhet för IT-tekniker VT2014 Johan Leitet Nätverkssäkerhet, 1DV425 johan.leitet.se twitter.com/leitet facebook.

F8 Webbteknologier 1. Dynamiska webbsidor

Moderna Jfokus, Stockholm Monday, February 4, 13

Kryptering. Krypteringsmetoder

Webbservrar, severskript & webbproduktion

TDP013. Webbprogrammering och interaktivitet. AJAX, CORS & jquery. Marcus Bendtsen Institutionen för Datavetenskap (IDA)

E11 "Protection" Föreläsning 11, HT2014 Säkerhet, tillgänglighet. Johan Leitet. Kurs: 1dv403 Webbteknik I

Webbteknik II. Föreläsning 5. Restless farewell. John Häggerud, 2011

Statistik från webbplatser

WWW. Exempel på klientsidan. Överföring av en html-fil. Snyggare variant. Verkligt format. Meddelandeformat för begäran HTTP

SSL/TLS-protokollet och

Karlstads Universitet, Datavetenskap 1

"HTML5 och relaterade API:er"

Webbsidor och webbservrar

Statistik från webbplatser

TDP013 Node.js, JSCoverage, Mocha. Marcus Bendtsen Institutionen för Datavetenskap

E12 "Evil is going on"

Appar med ryggrad. Introduktion till JavaScriptramverket Backbone

Webbsäkerhet. för IT-tekniker VT2013. Johan Leitet johan.leitet.se

Säkerhet. Säkerhet. Johan Leitet twitter.com/leitet facebook.com/leitet. Webbteknik II, 1DV449

Webbaserade informationssystem med PHP och databaser

JAVASCRIPT. Beteende

Innehåll. Dokumentet gäller från och med version

Avancerade Webbteknologier 2. AD11g Göteborg 2012 Säkerhet

SQUID. och andra cachelösningar

Essential Php Security Författare: Shiflett, Chris Antal sidor: 124 Förlag: O'Reilly

ASP.NET MVC. Copyright Mahmud Al Hakim Innehåll

EDA095 HTML. Per Andersson. April 26, Lund University Innehåll: HTML, CSS, DOM, JavaScript

Föreläsningens innehåll. Säker kommunikation - Nivå. IPSec. IPSec - VPN. IPSec - Implementation. IPSec - Består av vad?

Webbaserade informationssystem med PHP och databaser

PAINTFEUD. Erfarenheter

Webbaserade informationssystem med PHP och databaser

PHP. Dynamiska webbsidor

F8 Webbteknologier 2. PHP PHP: Hypertext Preprocessor

Säkerhet. Säker kommunikation - Nivå. Secure . Alice wants to send secret message, m, to Bob.

F8 Webbteknologier 2. EDA095 Nätverksprogrammering. Roger Henriksson Datavetenskap Lunds universitet

1ME323 Webbteknik 3 Lektion 6 API. Rune Körnefors. Medieteknik Rune Körnefors

Databaser på webben. Revision Johan Näsholm, johan@nasholm.com

MVC med Javascript och Ajax. Filip Ekberg

729G28. Webbprogrammering och databaser. Introduktion till webbutveckling med PHP. Jakob Pogulis Institutionen för Datavetenskap (IDA)

Systemkrav och tekniska förutsättningar

Webbprogrammering. Sahand Sadjadee

F9 Webbteknologier 1. EDA095 Nätverksprogrammering. Roger Henriksson Datavetenskap Lunds universitet

Övning MS SQL och MVC del 2

Klient/server. Översikt. Lektion 1: Webbtekniker från Microsoft. Webbteknik från Microsoft. Klient/server. Designmönster. Utrullning.

Server-kod. TDDD80 Mobila och sociala applikationer

Vad gör européer på dagarna? Anders Kraftling SAS-ansvarig Statistiska Centralbyrån

Webbteknik. Innehåll. Historisk återblick Teknisk beskrivning Märkspråk Standardisering Trender. En kort introduktion

PHP. TNMK30 - Elektronisk publicering

JAVASCRIPT-POWERED LOADRUNNER CHRISTIAN GERDES PERFORMANCE ENGINEER LIGHTS IN LINE AB

JavaScript. Innehåll. Historia. Document object model DHTML. Varför Javascript?

Förbättra Internetsystem genom implementation av AJAX-teknik

Uniform Resource Locator (URL) JavaServer Pages - JSP. Webbklienter. Webbserver. Hypertext Transfer Protocol (HTTP) HTTP Request

IP-baserade program. Telnet

Datasäkerhet och integritet

Övnings hemtentamen med förslag till lösning, webbprogrammering

Modul 8 Hantering av indata

Objektorienterad Programkonstruktion. Föreläsning 10 7 dec 2015

Swedish Association for Software Testing Inspect it AB

E13 "Behind the Wild"

Välkommen! SA S PSA S Im I puls s Mobilite t t e 8 1

PageSpeed Insights. Ta bort JavaScript- och CSS-kod som blockerar renderingen från innehåll ovanför mitten

PageSpeed Insights. Att komprimera resurser med gzip eller deflate kan minska antalet byte som skickas via nätverket.

TDP013. Node.js, Mocha, Istanbul. Anders Fröberg Institutionen för Datavetenskap

teknisk manual Direktbetalning handelsbanken.se/e-handel

Introduk+on +ll programmering i JavaScript

Active Server Pages. Föreläsning 5. Exempel. Exempel. Exempel: Javascript. Klient- och serverscript. Active Server Pages (ASP)

Webbprogrammering grunder

Dokumentation. Ver Sida 1

Swedbank Mobile Loadtesting. LoadRunner Mobile App protocol

PHP. PHP: Hypertext Preprocessor

MVC med Javascript och Ajax. Filip Ekberg

Exemple på Tentauppgifter Webbprogrammering

JS & beteende. TNMK30 - Elektronisk publicering

Installationsanvisningar

Webbprogrammering grunder

Dokumentation. Ver Sida 1

MVC med Javascript och Ajax. Filip Ekberg

HTML. Introduktion till HyperText Markup Language

ASP.NET Thomas Mejtoft

Att bygga VPN. Agenda. Kenneth Löfstrand, IP-Solutions AB. Olika VPN scenarios. IPsec LAN - LAN. IPsec host - host SSH

Android fortsättning. TDDD80 Mobila och sociala applikationer

Identity Management i ett nätverkssäkerhetsperspektiv. Martin Fredriksson

Webbplats analys sarajacob3216.wordpress.com

Version Namn Datum Beskrivning 1.0 Förutsättningar Vitec Ekonomi 1.1 Marie Justering för krav på Windows Server

OWASP AppSec Research 2010 Conference

Integrerad i egen cup-portal Sid 1

Olika slags datornätverk. Föreläsning 5 Internet ARPANET, Internet började med ARPANET

E13 Behind the Wild. Dagens agenda. Cookies Context/ändra context Augmentation (förstärkning) Klassiskt arv Att låna metoder Namespaces Postludium

ASP.NET Web Pages. Copyright Mahmud Al Hakim Först lite Classic ASP :-)

IT för personligt arbete F2

Förra gången. Dagens föreläsning. Digitala Certifikat. Vilka man litar på! X.509. Nyckeldistribution. Säkerhetsprotokoll

PHP - Fortsättning. PHP och MySQL

Föreläsning 4. CSS Stilmallar för webben

Du skall naturligtvis visa körexempel med output där det behövs i din rapport!

Ajax TruClient. Erfarenheter, tips och trix från Swedbank IT. Christian Gerdes Performance Engineer, LIGHTS IN LINE AB

Transkript:

Säkra webbapplikationer John Wilander, Omegapoint, KTH maj 2010

John Wilander, konsult Omegapoint Forskar inom mjukvarusäkerhet Leder svenska OWASP Certifierad inom Javautveckling och Security Development Lifecycle OWASP En öppen, icke-kommersiell community för alla som utvecklar, förvaltar eller köper webbapplikationer med höga säkerhetskrav

Säkerhet Utveckling

IT-säkerhet Systemutveckling

IT-säkerhet Applikationssäkerhet Systemutveckling

Webbens historia (enligt John)

<html> <head> <title>owasp AppSec Research</title> </head> <body> <form action="login" method="post"> <table> <tr><td>username: </td> <td><input name="username" type="text"></td> </tr> <tr><td>password: </td> <td><input name="password" type="password"></td> </tr> <tr><td></td> <td><input type="submit" value="login"></td> </tr> </table> </form> </body> </html> Statiska HTML-sidor 1991

<html> <head> <title>owasp AppSec Research</title> </head> <body> <form action="login" method="post"> <table> <tr><td>username: </td> <td><input name="username" type="text"></td> </tr> <tr><td>password: </td> <td><input name="password" type="password"></td> </tr> <tr><td></td> <td><input type="submit" value="login"></td> </tr> </form> </body> </html> </table> HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value Cookies 1994

<html> <head> <title>owasp AppSec Research</title> </head> <body> <form action="login" method="post"> <table> <tr><td>username: </td> <td><input name="username" type="text"></td> </tr> <tr><td>password: </td> <td><input name="password" type="password"></td> </tr> <tr><td></td> <td><input type="submit" value="login"></td> </tr> </table> </form> </body> </html> HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value 1995 $(function() { $("#button").click(function() { var username = $("input#username").val(); var password = $("input#password").val(); var datastring = 'username='+ username + '&password=' + password; $.ajax({ type: "POST", url: "LoginAjax", data: datastring, success: function() { $('#login_form').html("<div id='message'></div>"); $('#message').html("<h2>welcome, " + username +"!</h2>").append("<p>you are now logged in to the system.</p>").hide().fadein(1500); }, error: function() { $('#login_form').html("<div id='message'></div>"); $('#message').html("<h2>username and/or password wrong</h2>").hide().fadein(1500); } }); return false; }); }); JavaScript

<html> <head> <title>owasp AppSec Research</title> </head> <body> <form action="login" method="post"> <table> <tr><td>username: </td> <td><input name="username" type="text"></td> </tr> <tr><td>password: </td> <td><input name="password" type="password"></td> </tr> <tr><td></td> <td><input type="submit" value="login"></td> </tr> </table> HTTP/1.1 200 OK </form> </body> Content-type: text/html 1999 </html> Set-Cookie: name=value $(function() { <html> $("#button").click(function() { <head> var username = $("input#username").val(); <title>owasp AppSec Research 2010 Challenge X</title> var password = $("input#password").val(); </head> var datastring = 'username='+ username + '&password=' + password; <body> $.ajax({ <form action="login" method="post"> type: "POST", <table> url: "LoginAjax", <tr><td>username: </td> data: datastring, <td><input name="username" type="text"></td> success: function() { </tr> $('#login_form').html("<div id='message'></div>"); <tr><td>password: </td> $('#message').html("<h2>welcome, " + username +"!</h2>") <td><input name="password" type="password"></td>.append("<p>you are now logged in to the system.</p>") </tr>.hide() <tr><td><div style="color: red">.fadein(1500); <% if ("true".equals(request.getattribute("loginfailed"))) { %> }, Bad login <% } %> error: function() { </div></td> $('#login_form').html("<div id='message'></div>"); <td><input type="submit" value="login"></td> $('#message').html("<h2>username and/or password wrong</h2>") </tr>.hide() </table>.fadein(1500); </form> } </div> }); </body> return false; }); </html> }); jsp-sidor (dynamisk HTML)

<html> <head> <title>owasp AppSec Research</title> </head> <body> <form action="login" method="post"> <table> <tr><td>username: </td> <td><input name="username" type="text"></td> </tr> <tr><td>password: </td> <td><input name="password" type="password"></td> </tr> <tr><td></td> <td><input type="submit" value="login"></td> </tr> </table> </form> </body> </html> HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value function xmlhttppost(strurl) { var xmlhttpreq = false; AJAX var self = this; // Mozilla/Safari if (window.xmlhttprequest) { self.xmlhttpreq = new XMLHttpRequest(); } // IE else if (window.activexobject) { self.xmlhttpreq = new ActiveXObject("Microsoft.XMLHTTP"); } self.xmlhttpreq.open('post', strurl, true); self.xmlhttpreq.setrequestheader('content-type', 'application/xwww-form-urlencoded'); self.xmlhttpreq.onreadystatechange = function() { if (self.xmlhttpreq.readystate == 4) { updatepage(self.xmlhttpreq.responsetext); } } self.xmlhttpreq.send(getquerystring()); } $(function() { <html> $("#button").click(function() { <head> var username = $("input#username").val(); <title>owasp AppSec Research 2010 Challenge X</title> var password = $("input#password").val(); </head> var datastring = 'username='+ username + '&password=' + password; <body> $.ajax({ <form action="login" method="post"> type: "POST", <table> url: "LoginAjax", <tr><td>username: </td> data: datastring, <td><input name="username" type="text"></td> success: function() { </tr> $('#login_form').html("<div id='message'></div>"); <tr><td>password: </td> $('#message').html("<h2>welcome, " + username +"!</h2>") <td><input name="password" type="password"></td>.append("<p>you are now logged in to the system.</p>") </tr>.hide() <tr><td><div style="color: red">.fadein(1500); <% if ("true".equals(request.getattribute("loginfailed"))) { %> }, Bad login <% } %> error: function() { </div></td> $('#login_form').html("<div id='message'></div>"); <td><input type="submit" value="login"></td> $('#message').html("<h2>username and/or password wrong</h2>") </tr>.hide() </table>.fadein(1500); </form> } </div> }); </body> return false; }); </html> }); 2005

Utveckling av (o)säker programkod

Windows, Office

Cisco-routers

SAP

Applikationer!

Distribuera, installera, licensiera, uppgradera

2010 Rich Internet Applications

Applikationer utvecklas överallt

Hemsidor övergår i webbapplikationer

Webbapplikationer exponeras för Internet

Alla utvecklare måste förstå säkerhet

Fundamenten för säkra webbapplikationer

Same Origin Cookies Policy SSL

Same Origin Policy

Same Origin Policy

http://sajt.se/x/a.html http://sajt.se/x/b.html http://sajt.se/y/a.html OK http://www.sajt.se/x/a.html https://sajt.se/x/a.html http://sajt.se:8080/x/a.html Inte OK

Same Origin Policy Inte läsa Men exekvera text, skript, css skript, css

Men det är ju inte det vi vill ha :(

Kringå Same-Origin Policy Kommunicera server-side Använd JSONP JSON with Padding Sätt gemensam document.domain

Content Security Policy (förslag från Mozilla) Vitlista på källor för skript

Content Security Policy (förslag från Mozilla) Vitlista på källor för skript

Cookies

HTTP tillståndslöst GET http://www.sajt.se/ HTTP/1.1 HTTP/1.1 200 OK

HTTP tillståndslöst GET http://www.sajt.se/ HTTP/1.1 HTTP/1.1 200 OK

Att hålla en session Sessions-ID i URL www.sajt.se/ ;sessionid=1234 Sessions-ID i gömda formulärfält <INPUT TYPE= hidden NAME= sessionid VALUE= 1234 > Sessions-ID i kaka Set-Cookie: sessionid= 1234

HTTP + session GET http://www.sajt.se/ HTTP/1.1 HTTP/1.1 200 OK

HTTP + session GET http://www.sajt.se/ HTTP/1.1 HTTP/1.1 200 OK Cookie Monster 2009 Sesame Workshop

Sessionsattacker Cookie replay (återanvända) Cookie poisoning (skapa eller manipulera) Cookie hijacking (stjäla) Session fixation (sätta kaka åt offret)

Sessionsskydd Secure (bara skicka krypterat) HTTPOnly (ej tillgänglig för skript) Inget hemmasnickrat

SSL

Klient Protokollversion, sessions-id, kryptoalgoritm, kompressionsmetod Salt Server ClientHello(crypto_info, ) ServerHello(crypto_info, ) server-certifikat CertificateRequest Kontrollera servercertifikat klient-certifikat FatalHandshakeFailureAlert Kontrollera klientcertifikat Symmetriskt krypterat

Var är hänglåset?

<div class="menu_login_container"><form method="post" action="https:// login.facebook.com/login.php?login_attempt=1" id="login_form">

<div class="menu_login_container"><form method="post" action="https:// login.facebook.com/login.php?login_attempt=1" id="login_form"> Samma källkod? JavaScript som sniffar?

Moxie s SSL Strip Avbryter SSL Gör om https till http Normal https till servern Agerar klient

Moxie s SSL Strip Secure cookie? Encoding, gzip? Cachat innehåll? Sessioner?

Moxie s SSL Strip Secure cookie? Encoding, gzip? Cachat innehåll? Sessioner? Strip! Ta bort secure-biten på alla kakor. Strip! Ta bort alla encodings i request. Strip! Ta bort alla if-modified-since i request. Strip! 302 till samma sida, set-cookie expired

SSL Strip & Tor-nätet login.yahoo.com Gmail Hotmail PayPal 114 50 13 9 På 24 h

Antal som avbröt pga saknad kryptering: 0

Same Origin Cookies Policy SSL

Same Origin Content Policy Security Policy Cookies Äkta sessioner? SSL DNSSec?

john.wilander@omegapoint.se