Saturday, May 19, 2007

Tracking users with Cache Data

There are several methods that browsers and web servers use to speed up browsing, so that less data needs to be transfered over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network, two of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se methods are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ETag/If-None-Match and Last-Modified/If-Modified-Since headers. The premise is fairly simple for both.

With cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ETag/If-None-Match headers, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server simply sends an ETag header for a resource cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first time it is requested, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n sends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser needs cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same resource it sends an If-None-Match header, and sends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parameter cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server returned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ETag response header, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parameter for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 If-None-Match request header.

If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server responds with a 304 Not Modified status, and does not return a message body (it MUST NOT return a message body), 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 ETag is preserved in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser will keep sending cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same If-None-Match header until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache is deleted, as long as it keeps getting 304 replies.

The system is identical, just with different header names for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Last-Modified/If-Modified-Since headers.

Sadly though, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ETag/if-None-Match headers are only supported by Firefox, whereas cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Last-Modified/If-Modified-Since headers are supported in Firefox and IE - to my knowledge (through my testing) none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se headers are supported in Opera.

As such it would be better to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Last-Modified/If-Modified-Since headers.

All you need to do now is embed a tracking image in each page, and send a unique date each time no If-Modified-Since header is sent, and a blank 304 response at all ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r times.

The biggest problem here though is that you do need a separate http request, and as such cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only way to associate requests is per IP and time frame, e.g. any request made <=10 seconds before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request for a particular date/etag from, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same IP, is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same user. You could also try using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Referer header, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 odds of someone denying cookies, but sending Referers is very low, IMO.

You could also use Javascript instead of images, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you would be able to link requests more easily, but it would require you make an additional request from that page with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 query string and tracking id, or similar.

You would still need to use one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se techniques though, because you need to serve different pieces of javascript to different people, and have that piece of javascript cached as long as possible.

But even given this, this allows you a method to track users who deny cookies between browsing sessions - for tighter correlation during browsing sessions you could use Jeremiah Grossman's Basic Auth Tracking

P.S. This is stored with 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 cache data, so this will only work as long as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image/resource is cached, and clearing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ache manually (or turning cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache off) will stop this technique.

Wednesday, May 16, 2007

Determining sites trusted by NoScript

With cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 (relatively) new XSS filter added to NoScript it has become possible to determine whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a site is trusted or untrusted by seeing if NoScript decides to take action - of course this is not 100% accurate, since all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se features can be turned off, but if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are turned off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you can execute some attacks anyway.

Open Redirect



The easiest method to determine whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a site is trusted is to use an open redirect, because you have control over where a site is sending a user, and as such can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following two pieces of code to check whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r google.com.au is trusted:

detect.php:






query.php:
if (strpos($_SERVER['QUERY_STRING'], "=") !== FALSE) {
print "Untrusted!";
} else {
print "Trusted!
\n";
print "For ID: ".$_SERVER['QUERY_STRING'];
}

?>


The server generated id is not even actually necessary since you can just store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 info in a PHP session, but it is possible to 'attack' people who even have cookies disabled.

Non-Open Redirects



Now, a much more difficult task is attacking non-open redirects. Two things which limit this are:
  • We cannot use Javascript to determine where you've been.

  • We cannot actually pass a parameter to where we will be redirected.


The solution to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first problem lies here: http://ha.ckers.org/blog/20070228/steal-browser-history-without-javascript/

The solution to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second problem is a bit trickier, and relies on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'usual' implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se systems, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than a versatile technique.

Most systems which perform closed redirection have URLs which look like:
http://www.site.com/redir.php?id=123

Where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 id value is first run through intval(), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n put directly into an SQL statement.

Now, we can exploit this fact by sending people to a URL like this:
http://www.site.com/closedredir.php?id=123%26id=%3Cscript%3E

Whereby if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 www.site.com is trusted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we will not be redirected anywhere because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL will be filtered to look like this:
http://www.site.com/redir.php?id=%3F123%26id%3D

And since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 id does not begin with a digit, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 variable, once put through intval() is 0, and eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r no redirect, or a completely different redirect will be done.

If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 site is untrusted though, 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 URL will be unfiltered, and when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 id is run through intval, it will evaluate to 123, and so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user will be redirected to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 usual place.

Controlled Off-Site Resources


If you can control any off-site resources such as images which a site embeds, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n simply putting an ID in one parameter, and