Showing posts with label Security (All). Show all posts
Showing posts with label Security (All). Show all posts

Thursday, July 16, 2009

It's been a while

So it's been a while since I've posted anything here, mostly because this blog was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 product of a hell of a lot of free time (aka high school), I've been going to uni full time and working part time, which hasn't left me with a lot of free time, and on top of that I figured out that if I put cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same content into slides, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than writing blog posts, I can present it at conferences (selling out++) and have a fun time doing so.

In any case, I did some presentations recently and thought I should probably put details up here.

I did a talk last November at Power of Community and XCon about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Same Origin Policy and some new ways of looking at it, where most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new material was along cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 line of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GIFAR attacks Billy Rios came up with that Nate McFeters, etc, ended up presenting at BlackHat which took a lot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wind out of my sails *shrug*, it should be interesting as it covers a lot of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things and points people in some uncommon directions, I've uploaded cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 paper I wrote and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slides here:

Slides
Paper

I also did a talk at RUXCON and 25c3 with Stefano Di Paola (and I even spelled his surname correctly this time! ^_^) called Attacking Rich Internet Applications, so here are some materials:

RUXCON Slides
25c3 Video Recordings

I never ended up releasing this while it worked since I didn't want to kill a bug, but if you look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 video or were at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presentation you may have seen me demonstrate an exploit for Tamper Data, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug is almost identical to this one that I had claimed was exploitable. While my rationale in that post was incorrect (due to me testing with an old version of Tamper Data which was vulnerable in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way described), I came up with an interesting exploit for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug in Firefox 3 which could have gained me code execution by editing about:config entries.

Here is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC exploit:

//This is just a PoC, have a look through about:config for any _string_ entry you would want to change
//This bug is kind of lame, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit is cool, since it uses a Firefox bug to do damage (this should be unexploitable)
//Bug fires when a user graphs a malicious http request (open tamper data, graph cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack request)
header ("HTTP/1.1 200 OK
Mime Type: text/html\",event);' onMouseOut='hide_info();'>
?>


The bug is triggerable on old Tamper Data versions where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Graph Requests functionality worked, and if you graphed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 malicious request/response cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit would set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 app.update.url would be set to jajaja.

The bug works by abusing a lack of access control on any objects that extensions create in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir windows (It wasn't just Tamper Data, it happened in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r extensions), where it was possible to read and modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 objects, and more importantly: call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir functions. When you called a function that an extension had created, it was executed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension, namely chrome code.

It did not end up being necessary or useful for this exploits, however it was possible to call those functions and completely control all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data, etc, via calls such as opener.oTamper.whatever_function.apply(our_obj).

In any case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access control bug died some time in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last few Firefox 3.0.X releases, but I'm not really sure which since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 graphing functionality in Tamper Data hasn't been working for even longer, and it got to be too much effort to double check it.

I also did a presentation at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OWASP Australia Conference in February titled "Examining and Bypassing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IE8 XSS Filter", which might be some nice background for people, but will probably be greatly surpassed by sirdarckcat & thornmaker's upcoming Black Hat presentation. Here are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Slides.

I also did a presentation on Writing Better XSS Payloads at EUSecWest in May, however I haven't uploaded cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slides since I'm trying to submit it to Hack In The Box Malaysia to have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 material reach a wider audience, so unless it is rejected, you'll have to wait until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n to see it... Or email me.

And that's all for now...

Thursday, September 04, 2008

IE8 XSS Filter

IE8 came out recently and a bunch of people have already commented about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 limitations of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSS Filter.

But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are a few more issues that need to be looked at. First of all, if anyone hasn't already done so, I recommend reading this post by David Ross on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 architecture/implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSS Filter.

After talking Cesar Cerrudo, it became clear that we both came 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 easiest way to have a generic bypass technique for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter would be to attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same-site check, and we both came to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conclusion that, if we can somehow force cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to navigate from a page on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 site we want to attack to our xss, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we've bypassed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter.

If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 site is a forum, or a blog, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n this becomes trivial as we're allowed to post links, however even if we cannot normally post links this is still trivial as we can inject links in our XSS as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSS Filter doesn't stop HTML Injection, in any case read this for more details.

However, this is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only way to force a client-side navigation. One particular issue (which is normally not considered much of a vulnerability, unless it allows xss vulns) is when an application lets users control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of a frame, this is often seen in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 help sections of web apps. However navigation caused by an iframe seems to be considered somehow user-initiated (or something) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same-site check is applied so that if we point a frame on a site to an xss exploit, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 xss exploit will trigger.

Initially I had thought this would extend to JavaScript based redirects of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form:
document.location = "http://www.site.com/user_input";
or in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form of frame-breaking code, however this does not seem to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case. IE attempts to determine whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a redirect was user-initiated or not and if it decides it is not user-initiated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it does not apply cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same-site check and simply initiates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSS Filter, though as with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 popup blocker before it has some difficulty being correct 100% of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time, e.g. this counts as a user-initiated navigation:
test

However this is probably a very unrealistic issue as we need to vulnerable site to actually let cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker create such a construct.

Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore HTTP Location redirects and Meta Refreshes are also not considered user navigation so filtering is always applied to those, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore Open Redirects are pretty irrelevant to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSS Filter.

However, Flash-based redirects do not seem to be considered redirects (which is unsurprising given that IE has no visibility into Flash files) and so any Flash-based redirects can be taken advantage of to bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 xss filter, though if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y require a user to click cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it is probably simply easier to just inject a link (as described in Cesar's post)

And that's about all I could think of wrt that check :S

However, if you go read Cesar's post you'll see we now do have a method to generically bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IE8 XSS Filter, and it only requires an additional click from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user, anywhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page.

In a completely different direction, When I first read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 posts that said cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSS filter was going to prevent injections into quoted JavaScript strings, my first thought was "yeah, right, let's see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m try", as I had assumed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y would attempt to prevent an attacker breaking out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string, however cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter has signatures to stop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual payload. Essentially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter attempts to stop you from calling a JavaScript function and assigning data to sensitive attributes, so all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following injections are filtered:
"+eval(name)+"
");eval(name+"
";location=name;//
";a.b=c;//
";a[b]=c;//

among a variety of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r sensitive attributes, however this does still leave us with some limited scope for an attack that may be possible in reasonably complicated JavaScript.

We are still left with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to:
- Reference sensitive variables, which is esnecially useful when injecting into redirects, e.g.
"+document.cookie+"
- Conducting variable assignments to sensitive data, e.g.
";user_input=document.cookie;//
or
";user_input=sensitive_app_specific_var;//
- Make function assignments, e.g. (Note though that you can't seem to assign to some functions e.g. alert=eval doesn't seem to work)
";escape=eval;//

Also, like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 meta-tag stripping attack described by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 80sec guys (awesome work btw, go 80sec!), we can strip ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r pieces of data (which look like xss attacks) such as frame-breaking code, redirects, etc, but note we can't strip single lines of JS as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JS block needs to be syntactically valid for it to start getting executed, so anything potentially active which acts as a security measure beyond cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extent of it's own tag can be stripped.

It's also worth noting that XSS Filter doesn't strip all styles, it only strips those that would allow more styles to slip past it and styles which can execute active code (which is pretty much just expression() )

And that's all for me at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 moment; if anyone's looking for an interesting area for research, see if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IE8 XSS Filter always plays nice with server-side XSS Filters, who knows, maybe being able to break cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context by getting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter to strip stuff you can get your own html to be rendered in a different context that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server-side filter didn't expect.

P.S. Take this all with a grain of salt, this has been derived through black-box testing, and as such any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conclusions above are really just educated guesses.

P.P.S Good on David Ross and Microsoft for making a positive move forward that's going to be opt-out. Obviously everyone is going to keep attacking it and finding weaknesses, but even if this only stops cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scenario where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 injection is right in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 body of 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ý bet365n it's a huge step forward for webappsec; if this effectively blocks injections into JavaScript strings cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n ASP.NET apps just got a whole lot more secure.
Though I still think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HTML-injection issue needs to be fixed, because even if it's an additional step, users are going to click around and we're just going to see attackers start utilising HTML injection

P.P.P.S. Don't forget this is based on security zones, so it can be disabled and is by default opt-in for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 intranet zone, so all those local zone xss's for web servers on localhost or xss's for intranet apps are going to be largely unaffected

Sunday, July 27, 2008

XSS-ing Firefox Extensions

[EDIT]:It turns out I fail at testing things on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest version, see comments for some more details, sorry about that Roee.[/EDIT]

Roee Hay recently posted a blog post on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Watchfire blog about an XSS bug in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Tamper Data extension (it was posted much earlier, but removed quickly; RSS is fun), however when he assessed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impact he was wrong.

The context of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 window is still within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension, and so by executing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following code you can launch an executable:



var file = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\WINDOWS\\system32\\cmd.exe");
file.launch();



(Code stolen from http://developer.mozilla.org/en/docs/Code_snippets:Running_applications)

But even cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n; I had never even heard of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Graphing functionality in Tamper Data, and given cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need to actually use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functionality on a dodgy page, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chance of anyone getting owned with this seems very small to me.

Saturday, July 12, 2008

Some Random Safari Notes

I got to take a quick look at some Safari stuff at work a few days ago, and came away with a few notes that I thought might interest people about Safari:

Cross-Site Cooking works cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way as it does in Firefox 2.0, namely it works just as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RFC describes and we can set cookies for .co.uk, .com.au, etc.

HttpOnly is not supported.

Safari parses Set-Cookie headers like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RFC says, which means that cookies are comma separated (no ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r browsers seem to do this), which means that in ASP.NET and JSP, when you use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 framework's method of setting cookies and you let cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can inject arbitrary cookies by specifying something like ", arbitrary_name=arbitrary_value" as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie value.

Referers are not leaked from https to http, but are leaked from one https site to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r https site.

The safari cache (at lest on windows) is an SQLite database where all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data is double hex encoded; it looks something like X'aabbccddeeff, etc, and when you strip cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first two chars and decode it you get anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r blob which looks identical to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first one, which you cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n need to decode cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way and you get an XML document with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data, I wrote this dodgy PHP function to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conversion for me: (you need to call it twice on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 blob you extract from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 database)

function decode_blob ($blob) {
$ret = "";
for ($i=2,$c=strlen($blob);$i<$c;$i+=2) {
$ret .= chr(hexdec ($blob[$i].$blob[$i+1]));
}
return $ret;
}


On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone (emulator at least; I didn't get to use an actual iPhone), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last character of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password field is shown before you type cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next one in (and untill cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 field loses focus); this makes sense since it's hard to type on iPhones, but it's still curious.

Safari on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone (emulator, again) doesn't seem to actually close, so unless you close cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 emulator (I'm assuming this is equivalent to turning off your iPhone; if that's even possible), all session cookies persist.

Hope that helps someone.

Friday, July 04, 2008

Cookie Path Traversal

Not sure if anyone actually cares about this, but thought I might just throw it out here: I found out a while ago that if a server is running IIS (or something else which accepts windows-style paths), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it is possible to get cookies sent to paths that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do not belong to by using an encoded backslash to indicate a directory delimiter like this: http://www.microsoft.com/en/us/test/..%5Cdefault.aspx

It works on all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browsers I tested (latest versions of IE, Firefox, Opera & Safari).

Not really useful, maybe on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 off chance that, say, you need httpOnly cookies for some reason, and you can see headers for part of a path (e.g. because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a phpinfo page in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 root, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie is for /app), or whatever, supposedly this was considered a security issue by Secunia way back when you could use %2e%2e/ on all servers in all browsers: http://secunia.com/advisories/9680/ (Though I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 premise for that bug is that you can't jump pages, which is of course wrong)

Saturday, April 12, 2008

How much do you trust your DNS operator?

TechCrunch recently broke a story about Network Solutions hijacking users' unused subdomains for advertising. It seems to have only applied to people using Network Solutions for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir shared hosting, and seems to have been removed now. (None of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IPs I tested on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same machine returned advertising for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir non-existent subdomains) And on top of that we know that anyone who is on shared hosting is pretty easy pickings anyway, so this would seem to be a non-issue regarding security.

But Network Solutions doesn't exactly have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cleanest record in terms of ethics and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re isn't anything technically stopping Network Solutions or any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r company operating NS servers for your domain doing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same thing even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're not hosting your content.

So given that this is a security blog, and definitely not an ethics blog, why am I talking about this? Because it introduces security problems.

As I talked about in previous posts about cookies, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are almost always sent to subdomains, and if your DNS operator implements something like this cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n all your users' cookies are being sent to your DNS operator's servers, which means that your cookies are taking two specific network paths which both have to be secure for your credentials to remain safe (three if you count that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DNS request has to be safe).

Now you may trust that your DNS provider isn't going to do anything intentionally malicious with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookies, and are probably making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 valid point that worrying about people having owned ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r networks being a vague and impractical threat to defend most websites against, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a much simpler risk involved here.

Network Solutions has made no effort to secure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se pages from XSS, and why would you? They're essentially brochureware domains. Anyone who has probed a parked domain for XSS has probably seen that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have plenty of XSS holes, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pages Network Solutions served for non-existent were cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same pages that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y serve on parked domains.

So after googling to find a parked Network Solutions domain, I found it was unsurprisingly trivial to XSS it via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 search field.

So; how much do you trust your DNS operator?

Friday, February 22, 2008

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.

Saturday, January 19, 2008

24c3 Presentation and Research

I did a presentation entitled Unusual Web Bugs at 24c3 a few weeks ago, for which you can find slides and video for on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first link.

However, since some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 things I presented were some of my own research which I haven't posted anywhere, I'll write a couple of posts about that in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next couple of days. There isn't too much though, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's no need to get your hopes up, and if you've seen cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 video, you already know it.

[EDIT]P.S. Any comments or criticisms about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presentation would be greatly appreciated[/EDIT]

Thursday, July 19, 2007

Firefox gets httpOnly!

I don't usually report on things here, but since no-one else seems to be saying something, I thought I should.

Anyway, Firefox has finally implemented httpOnly cookies, in 2.0.0.5, as you can see from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir patch notes, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following test case: http://kuza55.awardspace.com/httponly.php

Note: If httpOnly cookies is implemented, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 alert box should be blank, if it is not implemented you should see an alert which says hidden=value


header("Set-Cookie: hidden=value; httpOnly");

?>






So hurrah for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Firefox developers who made this happen, no matter how long it took.

Wednesday, July 11, 2007

Exploiting reflected XSS vulnerabilities, where user input must come through HTTP Request Headers

Contents:


1.0 Introduction
2.0 The User_Agent Header
3.0 (Known) Firefox & Safari Request Header Injection (Sometimes)
4.0 Attacking Caching Proxies
5.0 References

1.0 Introduction


Ever since Adobe patched Flash player to stop attackers spoofing certain headers[1] such as Referer, User-Agent, etc, it has been considered impossible to exploit XSS vulnerabilities where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user input is taken from a request header, e.g. when a website prints out what User-Agent a user's browser is sending, without escaping it. With cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exception of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Referer header which we can control enough to exploit XSS attacks through it.

I want to showcase several ways in which we can still exploit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se vulnerabilities.

2.0 The User_Agent header


If you look at how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 User-Agent header is accessed in certain languages (namely PHP/Perl/Ruby/ColdFusion), you will see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 User-Agent header is not referenced as it is sent over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wire:

PHP:
$_SERVER['HTTP_USER_AGENT']

Perl:
$ENV{'HTTP_USER_AGENT'}

Ruby:
@request.user_agent

ColdFusion:
CGI.HTTP_USER_AGENT

As you can see, all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se languages use an underscore(_) instead of a hyphen(-) when accessing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data, so if we use Flash to send a User_Agent header, like this:

class Attack {
  static function main(mc) {
    var req:LoadVars = new LoadVars();

    req.addRequestHeader("User_Agent", "");
    req.send("http://localhost/XSS/server.php", "_self");
  }
}


(Can be easily compiled with mtasc)

So if any of those languages mentioned above insecurely print cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 User-Agent header, or any header with a hyphen in it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n no matter whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r it is blocked or not, it can still be injected.

The three ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r languages which I checked where ASP, ASP.NET and Java, and this is how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 variables are accessed:

ASP/ASP.NET:
Request.ServerVariables("HTTP_USER_AGENT")

Java:
request.getHeader("user-agent");

And while ASP/ASP.NET would seem to be vulnerable, it is a known fact to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MS developers[2] that headers with underscores cannot be accessed through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HTTP_ server variables, and so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have added more methods[2], which are not vulnerable.

Java does things neatly, and so it is not vulnerable.

Note: I made a mistake originally, and it seems that Perl apps are only vulnerable when testing through browsers ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than IE.

Perl seems to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last User_Agent or User-Agent header which you send it, and since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash plugin in IE appends our User_Agent header before IE's User-Agent header, Perl apps cannot be exploited when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is Using IE.

3.0 (Known) Firefox & Safari Request Header Injection (Sometimes)


Stefano Di Paola published a paper[3], where he pointed out that IE7 and Firefox both facilitated request splitting when Digest aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication was used, Comcor also pointed out that Safari was vulnerable to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same issue.

IE7 was only vulnerable through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XMLHttpRequest object, which can only be invoked from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 website which has Digest aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication, so it is useless to us in this case.

Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore request splitting is only useful when a user is behind a proxy (See Note at end of section), so if a user is not behind a proxy, 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ý bet365re is a point to spoofing headers racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than conducting a request splitting attack.

Anyway, what was not mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 paper was that not only can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack be invoked through an img tag, but it can also be invoked from an iframe tag, so here is a racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r contrived PoC (based on Stefano's code):

digest.php:

  header('Set-Cookie: PHPSESSID=6555');

  if((int)intval($_COOKIE['PHPSESSID']) !== 6555){
    header('HTTP/1.0 401 Authorization Required');
    header('WWW-Aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticate: Digest realm="1@example.com", qop="auth,auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"');
  } else {
    header("Set-Cookie: PHPSESSID=0");
  }

  print $_SERVER['HTTP_USER_AGENT'];
?>


attack.php:



  



Note: Its not completely true that we can't do any request splitting without a proxy; we can still split requests and have a server with multiple vhosts interpret cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second split response as a normal request for a vhost ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than that which has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 digest aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication. Thanks to Amit Klein for pointing this out.

4.0 Attacking Cache Proxies.


Warning: This attack is racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r convoluted, and a bit impractical. *shrug*

With cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advent of Anti-DNS Pinning being disclosed by Martin Johns[4] and improved on by Kanatoko Anvil[5][6][7], Kanatoko also found that Flash didn't Pin DNS[8], and who togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r found that Java's DNS record could be spoofed if used via LiveConnect[9].

This gives us an exceptionally powerful tool - an ability to create socket connections from a victim's computer.

So by utilising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 low level socket abilities of Flash or Java we can create a socket connection to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's caching proxy server if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have one. From cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re we can inject requests where we provide an XSS payload in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appropriate HTTP request header, which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proxy will sometimes cache, so when we redirect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to that page cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y will be served cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSSed version.

This works because cache servers are often setup to cache html pages, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are very sometimes setup so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only thing which is matches is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than any headers or cookies.

Here is a step-by-step explanation:

1. First of all we need to know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IP address and port cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 users to access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir proxy - sadly this part is racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r browser specific.

On IE we can use Java[10][11] to detect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proxy settings in IE (I know nothing about Java, ocá 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 fact that its possible, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are known methods), or by using Javascript[11] in Firefox, by reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Firefox settings network.proxy.http and network.proxy.http_port.

2. The next step is to open a socket to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proxy server, Anti-DNS Pinning attacks are already well documented in [4][5][6][7][8][9].

3. Send a request to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 caching proxy with an XSS payload in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appropriate HTTP headers on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 socket you have established.

4. Send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cached page. This can be improved by using Flash to send a "Cache-Control: only-if-cached" header so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proxy is more likely to serve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSS-ed page.

Note: I don't have any code to test this, but from when I setup squid to cache html pages, creating a socket to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page and injecting into headers, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n viewing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same page in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser worked, and so I see no reason why this shouldn't. And I have personally seen live proxy servers setup to cache html pages, and where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se attacks are possible, so while I'm not sure how common such setups are, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y definitely exist.

5.0 References



[1] "Forging HTTP request headers with Flash", Amit Klein, July 2006
http://www.securityfocus.com/archive/1/441014

[2] "HOWTO: Retrieve Request Headers using ISAPI, ASP, and ASP.Net", David Wang, April 2006
http://blogs.msdn.com/david.wang/archive/2006/04/20/HOWTO-Retrieve-Request-Headers-using-ISAPI-ASP-and-ASP-Net.aspx

[3] "IE 7 and Firefox Browsers Digest Aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication Request Splitting", Stafano Di Paolo, April 2007
http://www.wisec.it/vulns.php?id=11

[4] "(somewhat) breaking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same-origin policy by undermining dns-pinning", Martin Johns, August 2006
http://shampoo.antville.org/stories/1451301/

[5] "Stealing Information Using Anti-DNS Pinning : Online Demonstration", Kanatoko Anvil, December 2006
http://www.jumperz.net/index.php?i=2&a=1&b=7

[6] "Re: DNS Spoofing/Pinning", Kanatoko Anvil, December 2006
http://sla.ckers.org/forum/read.php?6,4511,4539#msg-4539

[7] "Anti-DNS Pinning + Socket in FLASH", Kanatoko Anvil, February 2007
http://www.jumperz.net/index.php?i=2&a=3&b=3

[8] "Re: DNS Spoofing/Pinning", Kanatoko Anvil, February 2007
http://sla.ckers.org/forum/read.php?6,4511#msg-6253

[9] "Using Java in anti DNS-pinning attacks (Firefox and Opera)", Martin Johns & Kanatoko Anvil, February 2007
http://shampoo.antville.org/stories/1566124/

[10] "How to detect Proxy Settings for Internet Connection"
http://www.java-tips.org/java.net/how-to-detect-proxy-settings-for-internet-connection.html

[11] "RE: Auto-detecting proxy settings in a standalone Java app"
http://www.mail-archive.com/commons-httpclient-dev@jakarta.apache.org/msg07568.html

[12] "Read Firefox Settings (PoC)", Sergey Vzloman, May 2007
http://ha.ckers.org/blog/20070516/read-firefox-settings-poc/

Saturday, June 30, 2007

Universal Phishing Filter Bypass

Well, I tried to do responsible disclosure, so I could at least claim I care about how secure users are (and get my name in some patch notes, :p), but according to Microsoft "The Internet Explorer phishing filter is not a security feature, so this is not something MSRC would track.", Mozilla haven't replied (email sent early Wednesday), and Opera haven't replied eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r (bug report added early Thursday), though I didn't give opera much time, I really don't think its a big issue because its not even on by default in Opera.

To better understand how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following idea can actually be utilised, and why it matters, you need to understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phishing filter. When a phishing site is first created and sent to users, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phishing filter does not know about it - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phishing filter is updated based on a blacklist of URLs which are manually entered.

The reason,cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter works is because while a phisher could encode cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address to stop it being detected, or move cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server, etc, etc, but all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 emails cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y sent still have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same static blocked link. And this is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole reason cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter works - all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 emails have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same link which is blocked. This doesn't have to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case, but I'll write something about that some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r day.

To avoid this, one can do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:

Send out phishing emails as one normally would, but instead of pointing to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual phishing page, point to some central server, which can send your arbitrary response headers, or is under your complete control.

The page cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is sent to, actually redirects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to an actual phishing page, eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same server or anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

There is a loophole in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phishing filters where if a page is blocked, but instead of being loaded, it redirects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user, 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 phishing warning is not displayed (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phishing warning seems to do checks after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page has been loaded, or at least cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 html code has).

What this means is that, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 moment a phishing URL is added to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phisher can easily just make it redirect elsewhere (or just encode it, and redirect to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 encoded URL to bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter), and viola, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 link in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phishing email is now working again.

And considering all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filters do direct URL comparisons, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 redirects do not have to be static (i.e. you could use mod_rewrite to make random URLs show cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same phishing page), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way current phishing filters are set up you could avoid cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 indefinitely.

If you want to confirm this, here are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steps I sent to MS/Mozilla/Opera on how to verify it:

1. Find a blocked URL.
- I got http://ospr.110mb.com/yahoo/ from phishtank

2. Point cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hosts file entry for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain to an IP.
- I pointed ospr.110mb.com to 127.0.0.1

3. Create a directory/page on your server in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same place as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phishing page.
- I created /yahoo/index.php on my localhost

4. Confirm that your page is being blocked.
- I directed my browser to http://ospr.110mb.com/yahoo/ as usual, and it was blocked in all browsers

5. Clear cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser cache/restart cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser.
- IE and Firefox need a restart, Opera needs you to manually clear cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache

6. Edit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file to redirect to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r file on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 site which is not blocked.
- I created /yahoo/login.php and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n used a Location redirect in index.php to redirect myself cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re:

header ("Location: http://ospr.110mb.com/yahoo/login.php");
?>

7. Visit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original phishing page again.
- I directed my browser to http://ospr.110mb.com/yahoo/ as usual, and in both browsers, no message was shown to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user, and I was successfully redirected, even though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original page was a known phishing URL in both systems.

Note: The need to clear cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache/restart cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser would not impact an attack, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 redirecting page would never be filtered and cached in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first place, it is merely a symptom of checking that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL is properly blocked. So if you can trust me that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL is blocked, you can simply ignore step 4.

Wednesday, June 27, 2007

[My]SQL Injection Encoding Attacks

Early last year Chris Shiflett and Ilia Alshanetsky published some posts about how it is possible to conduct SQL Injection attacks against sites which escape user input, but eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r use an encoding unaware escaping function (e.g. addslashes()), or do not inform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir escaping function about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue.

I'm not going to re-hash cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir posts, so you should go read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m now, if you haven't done so before.

But who actually does eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r of those things? Well, Google Code search reports approximately 54,300 results for applications using addslashes() and approximately 100 applications which have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 words "SET CHARACTER SET" in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir code.

Not particularly many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very first result is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r popular phpMyAdmin project, so its not a completely unused query.

Anyway, since I hadn't seen any research on which character sets were vulnerable (and which characters to use), I wrote a small fuzzer to test all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 character sets which MySQL supports (ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than UCS-2), for several different encoding attacks, though only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ones described by Chris and Ilia yielded any results. Here are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 character sets vulnerable, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first character of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 multi-byte sequence where \ is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second character:
  • big5, [A1-F9]

  • sjis, [81-9F], [E0-FC]

  • gbk, [81-FE]

  • cp932, [81-9F], [E0-FC]


I didn't successfully test ucs2 because ucs2 is a fixed width 2 byte character encoding, which will not execute queries passed in standard ascii, and so it would be impossible to get a webapp working if you set your connections to ucs2 but didn't convert all your queries, etc, so a configuration issue like that would be instantly noticed, and if you were using an encoding unaware function, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it would definitely be vulnerable, since all byte sequences are two bytes.

Anyway, if anyone is interested, I uploaded cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer here: http://mihd.net/pwe0f9. As you will notice, I ripped cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code which Ilia used to illustrate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability for GBK, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two pieces look very similar. Its also not very well written, but it worked and got cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results for me.

Notes: Part 2 of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer is trying to see if its possible to have a double or single quote as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second character in a multi-byte sequence, and Part 3 is trying to see if its possible to use a quote as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first character.

Also, this is obviously MySQL specific, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason for this is because (as far as I could find out) MySQL is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only RDBMS which allows you to set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection encoding through a query, all 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 require configuration changes, and while addslashes() issues are applicable to all RDBMS's, most applications cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se days use mysql_real_escape_string().

Saturday, June 02, 2007

Building Secure Single Sign On Systems and Google

After seeing several posts which spelled doom and gloom if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was ever found an XSS hole in any of Google's because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y used a Single Sign On (SSO) System I started trying to think of a method in which secure sign on could be securely implemented, where all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SSO server side code is trusted, e.g. when you own all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 websites, and here's what I came up with.

Idea 1: Remote Javascript



The first thing that came into my head was using Remote Javascript files, to give any SSO site (site specific of course), which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server side back-end could cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n use to query a database, to check that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specific token was valid for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir site, and if it was, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y would be issued anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r site specific login token, which would be placed in a user's cookie, and session management would resume as usual.

The problem with this is, of course, making sure that no ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r sites can retrieve this login token by including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same remote javascript in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir page.

Of course, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are several things you could do to prevent this:

You could do referer checks. While we have seen methods to spoof or strip referers, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re have been no methods to my knowledge to date which can do this when you're requesting script elements. You could technically spoof cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header normally, and try to poison cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache, but as long as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appropriate cache headers are sent, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n this should not be possible.

But this leaves any users who have referer stripping firewalls in danger, and this is unacceptable.

You could use CSRF style protections. But this faces cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem of what you can actually tie cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token to. You could tie cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IP, but as long as Anti-DNS Pinning works, this can be attacked and broken, so this is not a valid solution. And Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore doing such checks would be racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r expensive in terms of operations needing to be performed, since this is being done between separate servers/sites.

Which essentially means that while we can make this system secure for most people, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some we would not secure, and it is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore not viable.

Idea 2: Remote iframes


I kept thinking about ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ways you could send data to a specific site only and (from my attempts to break SessionSafe) I remembered that we could use iframes.

If an iframe sets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 window.top.location.href property, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page which loaded cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iframe cannot read that value, and even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could it would be considered a browser bug and fixed. So to transfer data to our domain and our domain only we would do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:

Write an iframe to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page which looked like this:


And on http://ssodomain.com/login.php cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following would be done:

If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is not logged in display a login form.

If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is logged in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following javasript tot he page:

window.top.location = 'http://companyownedwebsite.com/verify.php?auth=123456';

Where companyownedwebsite.com was determined by a switch statement on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 site variable, so that only a valid site could be redirected to, and so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SSO service knew which particular value to parse in auth variable.

The ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r mechanisms are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same as in Idea 1. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore this protects you from Programmatic password cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ft, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password is entered on a domain which has nothing ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than a login form.

Google's Approach


After thinking of Idea 2, I realised that this is what google does; on most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir services anyway. The one service (at which I initially looked to find out how Google implemented SSO, *doh*) which doesn't use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact same method as above is Gmail. What it turns out Gmail does (which I somehow missed) is, instead of using an iframes, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y redirect gmail.com to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 equivalent of http://ssodomain.com/login.php?site=Gmail where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole login page is displayed, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form is submitted to that same domain.

So what does this mean?



I came to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same idea independently of Google (which to me says that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re must be some merit to it, sine I didn't just see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea and say; hey, this looks good), and it should in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory and practice be perfectly sound as long as a website cannot tell determine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL to which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iframe/a page loaded in an iframe is being redirected to, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are no XSS holes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SSO domain.

So Google's SSO should be secure in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 face of an XSS hole?



Well, no; Google messed up; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y made cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir SSO domain www.google.com; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same domain as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir main site, which means it used used for more central purposes (central in terms of design, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than importance). This is bad, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re should be nothing on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SSO domain ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than SSO forms, because ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise one may find XSS holes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SSO domain, and that breaks cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole system (bar things like IP locks tying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sessions togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, but with Anti-DNS Pinning, this can again be broken)

So what are you trying to say



What I'm trying to say is that all XSS holes which are not in www.google.com (and yes, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 www is important) will not break SSO, but any XSS hole which is in that domain, has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential to.

Oh, and Google isn't completely hopeless when it comes to security - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y just have many more developers working for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, and many more web facing projects than most organisations.

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 #http://www.evil.com/s.js">




And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you just shove that in a iframe, or popup or whatever ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r technique you are using to make sure users don't notice cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're being attacked, and you're done.

Looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual exploit, you can see that what we end up doing is using a Reflected XSS hole to create a DOM Based XSS hole which is specifically untraceable.

And it seems like a much cleaner method than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last two posts to me.
1 comment: Links to this post
Older Posts Home