Saturday, February 23, 2008

HTTP Range & Request-Range Request Headers

For those that haven't heard of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Range header, here's a link: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2

For everyone who can't be bocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365red reading a link; essentially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Range header is what you use to ask a server for a part of a response, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole response; it's what makes resumeable downloads possible over http.

Anyway, anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r piece of research I presented at 24c3 is pretty simply, but racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r useful:

Flash



If Flash were to allow us to send a Range header, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we would be able to get things sent to us completely out of context.

Until Apache 2.0 this header was only used when requesting static files, so it would not influence a typical XSS, however if we have an application such as vBulletin which protects against FindMimeFromData XSS attacks by searching cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first 256 bytes for certain strings, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we can simply place our strings after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first 256 bytes and get Flash to send a header which looks like this:
Range: bytes=257-2048
To have unscanned data sent in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first 256 bytes, leading to XSS.

However since Apache 2.0 (and possibly in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r webservers, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're irrelevant to this post), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Range handling code is implemented as a filter; this means that it is applied to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output of every request, even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are dynamic requests.

This means that if we were to have a normally unexploitable XSS condition where our use input was printed to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page inside an attribute with quotes eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r encoded or stripped, but all ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r metacharacters left intact, or an xss filter did not encode cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 html attributes you had at all like so:
”>link

Then we could use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Range header to request only our unencoded portion which would result in XSS.

Now, why is this important since Flash has never let anyone send a Range header?

Well, while looking through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Apache source code I found this beautiful snippet:
if (!(range = apr_table_get(r->headers_in, "Range"))) {
range = apr_table_get(r->headers_in, "Request-Range");
}


Which essentially says that if you can't find a Range header, look for a Request-Range header, and untill cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest version of Flash (9,0,115,0), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Request-Range header was not blocked. (I had hoped this would be unpatched when I presented it, but you can't really hope for much when you sit on a bug for almost half a year...)

Firefox


Now cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 part I didn't present. In Firefox 3 Firefox implemented cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new Cross-Site XMLHttpRequest which, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name suggests, lets you make cross-site requests and read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 responses.

There is some documentation here: http://developer.mozilla.org/en/docs/Cross-Site_XMLHttpRequest

The part of those specs which is relevant to this post is that you can allow Cross-Site XMLHttpRequests by including an XML preprocessing instruction; however you can't just XSS it onto cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page as usual because it needs to be before any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r data.

However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XMLHttpRequest object allows you to append both Range and Request-Range headers. And by appending a Range header we can get our XSS-ed instruction to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 start of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 response, and read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 response.

The limitations with this are fairly strict; as far as I can tell, you cannot add to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XHR policy cache with xml instructions, only with headers, and if you attempt to request multiple ranges, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 multi-part boundary which begins cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 response will be sent before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 xml instruction, and so it will not be parsed, so you can only get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page that are after your XSS point. On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hand I wasn't even able to get non-GET requests to work with server-side co-operation, so take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se with a handful of salt.

On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 up side, this does bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .NET RequestValidation mechanism since that does not flag on

Friday, February 22, 2008

Racing to downgrade users to cookie-less aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication

Be warned: this post is a bit out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, and not extremely practical, but I'm posting exploit code and I thought cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack was fun.

If you ever disable cookies and try to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web you will notice that a surprising number of websites that use sessions still work, especially if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are using a session management framework or were written during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser wars when a significant number of people still didn't have cookie support in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir browser, or were suspicious enough to have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m disabled.

All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie-less aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication systems rely on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same idea: passing session tokens through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than being bad practice because it gets logged, etc, FUD, etc, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y also get leaked through referers to 3rd parties. So if we can get an persistent image pointing to our server, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we will have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 session tokens leaked to us. And it does have to be persistent, because unlike cookies, session tokens passed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL are not implicit and are not attached to our reflected html injections.

However this is usually never raised as an issue because everyone has cookies enabled cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se days, and this attack doesn't work against anyone.

However, how do web applications which need to work without JavaScript detect if a user's browsers supports cookies? They simply set a cookie, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user logs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y verify whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a cookie was sent, and if it was not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n start putting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 session id in all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 links and forms on a page. Some applications also check on every subsequent page if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can set a cookie, and if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no way to degrade to cookie-less auth again.

As I wrote previously; I discovered that in Firefox and Opera we can exhaust cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie limit to delete cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's old cookies.

If we assume that we will have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user browsing both a site which degrades to cookie-less auth and our malicious site at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n if you think about this cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you can see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a race condition between when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server sets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user logs in (and in some applications between when a page is served and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next html request is made).

The question is; can we win this race?

In Firefox, it takes approximately 100 miliseconds on my machine to set 1000 cookies over 20 hostnames, with 1 hostname per iframe. So we can win any race.

In my testing Opera is much faster at navigating between pages and setting cookies, however I'm still unsure if we can win this race in Opera.

I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of this post can be improved by having cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iframes on hostnames which looks like a.b.c.d....z.123.ccTLD and are 256 characters long and is made up of 126 levels of hostnames, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first 125 levels are single character portions, so as to maximise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of levels on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hostname.

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n in each iframe we would set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 max number of cookies for .a.b.c.d....z.123.ccTLD cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n .b.c.d....z.123.ccTLD and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n .c.d....z.123.ccTLD etc, until we set a cookie for 123.ccTLD - this would mean we do not havew to navigate between pages at all, and we could do opera's 65536 max cookie limit in 18 iframes; however before doing this we might have to force a lookup to all 2815 hostnames so that we don't hit a bottleneck in Opera's cross-site cooking code.

However, if we cannot get things as fast as in Firefox, we may still be able to win some races.

A lot depends on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 easiest case is where we only have to win one race, and we can keep racing, such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Phorum software which runs sla.ckers.org; it sets a temporary cookie which it checks cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existence of when you login, and if it is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re when you login, it uses cookie-less auth for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole session.

So our race here is against how long it takes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to fill in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 login page; and considering that if we lose cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 race we end up deleting all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookies, we simply race again and again.

vBulletin on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hand, is a much tougher beast. It tries to set a cookie on every page, even when you have begun using cookie-less auth, and also has a redirect page which redirects you in 2 seconds.

So not only do we have to win every race until a user views our image, we also have to be able to beat a two second race.

We can probably stop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 redirect happening by simply running our code (which lags cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system a bit), and winning cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 race like that, but winning cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 race 100% of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time may still be difficult, and would lag cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system enough for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to think of closing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tab/window.

However, when we race we race against everything, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code we use is identical between applications, and would only have to change between browsers.

Anyway, here's some code for Firefox which spins when it doesn't need to be racing, i.e. when it has completely saturated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie jar and writing any additional cookie would simply overwrite earlier cookies that our script set, so that it only lags cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system in bursts.

You need to have 20 subdomains setup which point to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second file; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 easiest way to do this is just wildcard DNS. And have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first file setup on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parent domain, e.g. [1-20].localhost & localhost

main.php:



for ($i=0;$i<20;$i++) {
print '';
}
?>



cookie_sub.php:
header ("Expires: Fri, 17 Dec 2010 10:00:00 GMT"); //To speed up repeated attacks
?>




Exploiting CSRF Protected XSS

XSS vulnerabilities which are protected by CSRF protections, are usually considered unexploitable due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that we have no way of predicting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CSRF token.

However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se protections do nothing more than check that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is first "logged in" and that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CSRF token cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y sent is tied to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir session; nowhere in this chain of events is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re a condition which states that an attacker must be forcing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own session identifier (cookie).

If we are able to force cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim to send a request which contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker's cookie, CSRF token and XSS payload, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we will pass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CSRF protection checks and have script execution.

A General Case



So how would we go about this? As I mentioned in my "Exploiting Logged Out XSS Vulnerabilities" post, Flash (until 9,0,115,0 and not in IE) allows us to spoof cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Cookie header for a single request, however this suffers from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same problem that we cannot completely over-write cookies; only add an additional Cookie header.

This is indeed a possible attack vector though; if we first make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is "logged out" (and also has no value for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 login cookie) eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r by simply waiting, using a CSRF attack to log cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user out (and hoping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 website also clears it's cookies), or exhausting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser's cookie limit, we can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n add our own Cookie, CSRF token and XSS payload to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request using similar Flash code e.g.

class Attack {
static function main(mc) {
var req:LoadVars = new LoadVars();
req.addRequestHeader("Cookie", "PHPSESSID=our_valid_session_id");
req.x = "y";
req.send("http://site.com/page.php?csrf_token=our_csrf_token&variable=",
"_self", "POST");
// Note: The method must be POST, and must contain
// POST data, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise headers don't get attached
}
}


Then cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application will receive a request with our (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker's) session id, a valid CSRF token and our XSS payload from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim's browser.

Of course, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem with this is that if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is actually logged out (which we forced, due to our inability to simply over-write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie or stop it being sent) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser no longer has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim's cookies, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only attacks we have from this point are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r attacks mentioned in my "Exploiting Logged Out XSS Vulnerabilities" post. And while this is not ideal, it does at least give us something ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than an unexploitable XSS.

Cookie tricks


Again, with this technique we can also set a cookie for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specific path, eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r by having an XSS on a related subdomain or by abusing a cros-site cooking bug, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user will still have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir original cookie intact and we can simply remove our own cookie from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's browser once our XSS has fired.

Abusing RequestRodeo


Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r case where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user would be logged out is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case where we can somehow get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookies stripped from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's request.

The technique I presented at 24c3 talked about abusing one such piece of software which stripped cookies; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RequestRodeo Firefox extension which was created by Martin Johns and Justus Winter which does a good job of protecting against a lot of CSRF attacks by stripping cookies from requests originating from 3rd party sites (i.e. a request going to site.com which was induced by evil.com will not have any cookies attached to it). Which is just what we need.

Of course, this is a nice place to note that this is of course a niche piece of software that doesn't really provide a valid avenue for exploitation in almost any scenario, but as I explained in my post "Understanding Cookie Security" we can also delete all a users' cookies by exhausting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser's global limit on on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 amount of cookies it will store.

Anyway, given that RequestRodeo all cookies (including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ones we are attempting to send via Flash), we still face cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem that we need to be sending a valid session identifier for which we need to be sending a valid CSRF token. We do not face this problem when we remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's cookies, and can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash approach outlined above, but we can also use this approach, which has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 added benifit of still working on everyone (not just those who are unpatched).

Anyway, one interesting feature of PHP and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r frameworks is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y accept session identifiers through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL. This has of course led to easily exploitable Session Fixation attacks; however in PHP at least, if a cookie is being sent, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL is completely ignored.

In our case, no cookie is being sent, since it is eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r being stripped by RequestRodeo, or has been deleted by us, so we can simply supply our session identifier through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL, attach our CSRF token and XSS payload and we're done, except in this case cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser still has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's cookies, and our XSS functions like normal.

The result of this attack is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above if we have deleted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookies from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's browser, however if we have stripped cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookies with RequestRodeo or some similar tool/technique/etc, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r benifit of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user still being logged in when our XSS fires.

Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Cookie Tricks


As I wrote in my post "Understanding Cookie Security", if we have an XSS which is largely unexploitable (except via pure Session Fixation) since it is on a subdomain with no accounts, we can use it to set almost arbitrary cookies for ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r subdomains.

This gives us a perfect avenue, since we can set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path to only over-write cookies for our single CSRF Protected XSS page, and send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appropriate CSRF token and XSS payload for.

Self-Only CSRF Protected Persistent XSS


One case which is much simpler to exploit than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 general case though, is where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are CSRF protections on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form where you submit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual XSS, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSS is a persistent XSS for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user, in that it is rendered on anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r page (which is itself not CSRF protected, since it is used to display racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than edit data)

CAPTCHAs As CSRF Protections


CAPTCHAs are not designed to be CSRF protections, and in certain cases are bypassable.

There are essentially two (not completely broken) types of CAPTCHA systems I have seen in widespread use, one where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 plaintext is simply stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server-side session and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 captcha is included in a form like this:

The ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r is when a form has a hidden input tag which contains a value which is also inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image URL, like so:



The first system is trivially bypassed for CSRF & CSRF Protected XSS attacks by simply inserting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CAPTCHA onto a page, or inside an iframe (to strip/spoof referers), and asking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to solve it.

The second can often be trivially bypassed for CSRF & CSRF Protected XSS attacks since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 id is usually not user-dependant and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CAPTCHA does not keep track of what id it sent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user. Therefore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can simply retrieve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appropriate CAPTCHA, solve it, and put cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 answer along with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding captcha id in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 csrf or csrf protected xss attack.

Conclusion


So essentially if we can somehow trick cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application into using an attacker's session identifier, eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r by altering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie (e.g. via subdomain tricks, Flash, injecting into Set-Cookie headers, or whatever ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r trick we can come up with), or by suppressing or deleting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie and passing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 identifier through anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r means such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n all CSRF protected XSSs are exploitable.

However if we cannot, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we can still exploit some scenarios such as self-only CSRF protected persistent XSS if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logout/login functionality is not CSRF-protected (which very few are). And we can also bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 semi-CSRF protection of CAPTCHAs in several cases.

Exploiting Logged Out XSS Vulnerabilities

Usually when we consider vulnerabilities which are only rendered when a user is logged out (e.g. a side bar which renders a vulnerable login form when logged out, and a menu ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 known methods of attack lie in, first getting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user logged out, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n doing one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:

  • Extracting login information from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Password Manager

  • Modifying a client-side data store, such as cookies or Flash LSO's to create an attack which fires later when a user is logged in

  • Conducting a Session Fixation attack



Some new possibilities for attacking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se vulnerabilities are:


  • Reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Browser Cache via XSS

  • Semi-Logging cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 User Out



Reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Browser Cache via XSS


Most browsers do not let you read pages which have not been explicitly cached, and where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Expires or Cache-Control headers have not been set, except Internet Explorer.

If you use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XmlHttpRequest object to make a request to a resource which has no caching information attached to it you will simply get back cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cached copy which may contain sensitive information such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 person's billing details, or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r juicy information you an use in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r exploits.

But since security people have been parroting on about how websites need to make sure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't let cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser cache something because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user may be using a public computer, etc, etc, this is much less viable, however at least we now have a real reason for recommending people to not let cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser cache things.

Semi-Logging cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 User Out


However before we jump to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conclusion that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability is only triggered when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is logged out let us consider what it really means to be "logged in".

To be "logged in" is to send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web application a cookie header which gets parsed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server/web application framework (e.g. Apache/PHP), and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parsed value is associated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application with a valid session.

So conversely, when are you "logged out"? You're logged out whenever cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above series of events (plus any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r steps I missed) don't fall exactly into place.

So if we start with a user who is currently logged in; instead of logging cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m out completely via CSRF (or just waiting until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y log cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves out), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trick here is to create an exploit which fires when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser still holds cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 users cookies, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application doesn't receive those cookies exactly.

The easiest and most generic place (I found) to attack this chain is to alter what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser sends, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server receives.

Until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest version of Flash (which is 9,0,115,0), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following code ran properly and let us tamper with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Cookie header:

class Attack {
static function main(mc) {
var req:LoadVars = new LoadVars();
req.addRequestHeader("Cookie", "PHPSESSID=junk");
req.x = "y";
req.send("http://site.com/page.php?variable=",
"_self", "POST");
// Note: The method must be POST, and must contain
// POST data, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise headers don't get attached
}
}


Unfortunately this does not work in IE, since IE seems to stop plugins from playing with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Cookie headers it sends.

Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, this does not actually replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Cookie header which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser sends, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r it forces cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser to send an additional Cookie header which would make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relevant part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HTTP request look something like to this:

Cookie: PHPSESSID=valid_id
Cookie: PHPSESSID=junk


Which PHP (and pretty much every ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Server/web application framework) would reconcile into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 single PHPSESSID value of:

valid_id, PHPSESSID=junk

Which is of course not a valid session token, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application treats cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user as logged out, and our XSS executes as if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user was logged out, however since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser still has all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookies, so we can eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r steal cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m or get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to perform actions on our behalf, etc.

The less generic, but still working approach is to overwrite overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookies for your particular path only, eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r via an XSS from a related subdomain or by abusing a cross-site cookie bug in a browser (check my last post).

Understanding Cookie Security

Whenever anyone decides to talk about XSS, one thing which is sure to pop up is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Same Origin Policy which XSS avoids by being reflected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server. The Same Origin Policy is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security restriction which make sure that any pages trying to communicate via JavaScript are on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same protocol, domain and port. However this is misleading since it is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 weakest link that browsers have between domains.

The weakest link across domains is (for lack of a better term) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie policy which determines which domains can set cookies for which domains and which cookies each domain receives.

What's in a cookie


The cookies we use have several fields, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se ones I want to talk about:

  • Name

  • Value

  • Domain

  • Path

  • Expires



First, it must be noticed that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 protocol restriction which is explicit in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Same Origin policy is here implicit, since cookies are an extension to HTTP, and so would only be sent for http, however cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 distinction between http and https is only enforced if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Secure flag is set.

Secondly, unlike cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same origin policy, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie policy has no restrictions on ports, explicit or implicit.

And 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 domain check is not exact. From RFC 2109:
   Hosts names can be specified eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r as an IP address or a FQHN
string. Sometimes we compare one host name with anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. Host A's
name domain-matches host B's if

* both host names are IP addresses and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir host name strings match
exactly; or

* both host names are FQDN strings and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir host name strings match
exactly; or

* A is a FQDN string and has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form NB, where N is a non-empty name
string, B has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form .B', and B' is a FQDN string. (So, x.y.com
domain-matches .y.com but not y.com.)

Note that domain-match is not a commutative operation: a.b.c.com
domain-matches .c.com, but not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reverse.


Effectively, this means that that any subdomains of a given domain can set, and is sent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookies for that domain, i.e. news.google.com can set, and is sent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookies for .google.com. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore a second subdomain, e.g. mail.google.com can also set, and is sent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookies for .google.com - This effectively means that by setting a cookie for google.com, news.google.com can force cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's browser to send a cookie to mail.google.com.

Resolving Conflicts


But what if two cookies of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same name should be sent to a given page, e.g. if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a cookie called "user" set for mail.google.com and .google.com with different values, how does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser decide which one to send?

RFC 2109 states that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more specific path attribute must be sent first, however it does not define how to deal with two cookies which have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same path (e.g. /) but different domains. If such a conflict occurs cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n most (all?) browsers simply send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 older cookie first.

This means that if we want to overwrite a cookie on mail.google.com from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subdomain news.google.com, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie already exists, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we cannot over-write a cookie with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path value of / (or whatever cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing cookie is), but we can override it for every ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r path (up to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 maximum number of cookies allowed per host; 50 in IE/Firefox 30 in Opera), i.e. if we pick 50 (or 30 if we want to target opera) paths on mail.google.com which encompass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 directories and pages we want to overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie for, we can simply set 50 /30 separate cookies which are all more specific than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing cookie.

Technically cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spec say that a.b.c.d cannot set a cookie for a.b.c.d or b.c.d only, none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browsers enforce this since it breaks sites. Also, sites should not be able to set a cookie with a path attribute which would not apply to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current page, but since path boundaries are non-existant in browsers, no-one enforces this restriction eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

Cross-Site Cooking


When you think about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above scenario, you end up asking; can I use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same technique to send a cookie from news.com to mail.com? Or some similar scenario where you are going from one privately owned domain to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r in a public registry. The RFC spec did foresee this to some degree and came up with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "one dot rule", i.e. that you can't set a cookie for a domain which does not have an embedded dot, e.g. you cannot set a cookie for .com or .net, etc.

What cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spec did not foresee is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 creation of public registries such as co.uk which do contain an embedded dot. And this is where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fun begins, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no easy solution for this, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RFC has no standard solution, all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browsers pretty much did cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own thing.

IE has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 least interesting and most restrictive system; you cannot set a cookie for a two letter domain of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form ab.xy or (com|net|org|gov|edu).xy. Supposedly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a key in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 registry at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\SpecialDomains which will let you whitelist a domain to allow ab.xy to be set and my registry has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value "lp. rg." for that key, but I haven't been able to set a cookie for ab.pl or ab.rg so go figure.

Opera on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hand has perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most interesting system of all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser vendors. Opera does a DNS lookup on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain you are trying to set a cookie for, and if it finds an A record (i.e. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain has an IP address associated with it) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you can set a cookie for it. So if ab.xy resolves to an IP cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you can set a cookie for it, however this breaks if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TLD resolves, as is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case for co.tv

Firefox 2 seems to have no protections. I was unable to find any protections in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source and was able to get foobar.co.uk to set cookies for .co.uk, so ummm, why does no-one ever mention this? I have no clue....

Firefox 3 on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hand has a huge list of all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domains for which you cannot set cookies, which you can view online here. Hurray for blacklists.....

Exhausting Cookie Limits


Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting aspect of cookies is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a limit on how many cookies can be stored, not only per host, but in total, at least in Firefox and Opera. IE doesn't seem to have such a restriction.

In Firefox cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 global limit is 1000 cookies with 50 per host (1.evil.com and 2.evil.com are different hosts), and on Opera it is 65536 cookies with 30 per host. IE does not seem to have a global limit but does have a host limit of 50 cookies. When you reach cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 global limit, both browsers go with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RFC recommendation and start deleting cookies.

Both Firefox and Opera simply choose to delete cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 oldest cookies, and so by setting eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r 1000 or 65536 cookies depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser, you effectively clear cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's cookie of anything anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r domain has set.

Conclusion


By eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path attribute to point to more specific pages we can effectively overwrite cookies from ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r domains that we can set cookies for, which includes all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 co.xy domains. Also, if we are attacking Firefox or Opera we can simply delete cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing cookies if we need to force our cookie to be sent to a path for which a cookie is already set (e.g. /).

You may also be able to induce some weird states, if you somehow manage to only delete one cookie where an applicaiton expects two, or similar, but I doubt that would be very exploitable.

CSRF-ing File Upload Fields

It seems I'm destined to have everything I sit on for a while patched or found and disclosed by someone else, *sigh*, I guess that's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way things go though.

Oh well, pdp has an interesting post over at gnucitizen.org about how to perform CSRF attacks against File upload fields using Flash: http://www.gnucitizen.org/blog/cross-site-file-upload-attacks/

Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re would be no point publishing this later, here is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method I came up with a while ago to CSRF File upload fields






It relies on a bug in Firefox/IE/Safari where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filenames are not escaped before being put into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 POST body to set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filename parameter and content-type header.

Note: http://kuza55.awardspace.com/files.php is probably vulnerable to a tonne of things; I'm not too worried as it's on free hosting.