Showing posts with label Firefox. Show all posts
Showing posts with label Firefox. Show all posts

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, February 23, 2008

HTTP Range & Request-Range Request Headers

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

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

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

Flash



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

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

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

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

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

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

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


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

Firefox


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

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

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

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

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

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

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.

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.

Monday, March 26, 2007

Partially stopping sites breaking out of frames in Mozilla

I've been looking for ways to stop sites breaking out of frames for a long time now, and haven't been able to find anything.

And I still haven't been able to get anything working cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way I'd like it to, but since I don't have much time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se days I thought I'd throw this out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re to see if anyone could figure something out. What I'm trying here is to be able to execute XSS attacks within iframes against sites which break out of iframes at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top of each page, but sadly I'm having almost no real success.

Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea that I used to implement this; http://kuza55.blogspot.com/2007/03/trapping-mozilla-for-phishing.html, it is possible to stop site breaking out of frames.

Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following code:







But while it is possible to stop http://hackthissite.org from breaking out of an iframe, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 moment we call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stop(); function, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iframe also stops loading. So any XSS attacks after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frame breaking code will not be executed.

So as you can see I haven't been able to figure anything out which will stop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top window being changed, but not stop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iframe being loaded. Hopefully someone else will have more luck.

Tuesday, March 20, 2007

Trapping Mozilla For Phishing

I was looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 onbeforeunload event handler today in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hopes of finding a way to attack/implement Martin Johns' paper SessionSafe: Implementing XSS Immune Session Handling (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's also some discussion about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 paper here: http://sla.ckers.org/forum/read.php?13,7607), and while I didn't find anything useful cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, I did find a way to entrap, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore conduct phishing attacks against more aware Mozilla users.

Before delving into an explanation, here's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code which I'll explain:




Please go to bankofamerica.com





Anyway; when using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 onbeforeunload event handler it is still possible to access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 window object, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore still possible to set time-outs.

In our time-outs, we can call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stop() function. When cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stop(); function is called cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location bar is not reset, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore will display 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ý bet365 user entered.

The next thing we would like to do would be to add some data to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page which makes it look like a phishing site. Sadly (or Luckily depending on your view point), when you call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document.write() function, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location bar is reset, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore we must use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing page disappear, and add our new page.

Simple Enough.

One thing you should note though, is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a bug in Firefox where, if you enter, say, google, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n press Ctrl+Enter, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n go to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r tab, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n return, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address bar will read "google" racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than "http://www.google.com/", but its not a very likely scenario, so should not be much cause for concern. And furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore it is (to my knowledge) impossible to find out where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is going, so I do not think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are many uses ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than a phishing page like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 example provided.

You also cannot force cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to programmatically go to a page, and stop that and have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL changed. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL is changed programmatically only when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser successfully loads cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page.

Oh, and AFAIK a slightly similar (in terms of effect, not implementation) vuln in IE is still unpatched: http://lcamtuf.coredump.cx/ietrap/

P.S. This was tested on Firefox 2.0.0.2

Monday, February 26, 2007

stopgetpass.user.js - an interim solution

A couple of days ago I posted a method of breaking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RSCR Fix Mozilla implemented in Firefox. Today, I want to post an interim fix for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form of a Greasemonkey script:

for (i=0,c=document.forms.length;i
    if (document.forms[i].method == 'get') {
        var password = false;
        for (l=0,k=document.forms[i].elements.length;l
            if (document.forms[i].elements[l].type == 'password') {
                password = true;
            }
        }
        if (password == true) {
            document.forms[i].method = "post"
        }
    }
}


Essentially it just loops through all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 forms on a page and sets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method on all forms with password fields to post. So while this will stop you from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack I described, it will most likely break sites, so once a patch comes out of Mozilla (which I honestly hope it will, because ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir efforts on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous patch will be in vain), this will need to be removed.

Also, since this script is extracting method and type values from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM, it doesn't have to worry about case, obfuscation, etc, so it should not be vulnerable to any obfuscation of eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method properties.

I'm sure you all know how to install Greasemonkey scripts,so I'm not going to bocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r explaining how to here, because for those who don't cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's always Google.

P.S. 50th Post! Hurray, I've managed to actually stay interested in something for an extended period of time. I'm sure that some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 posts were completely disinteresting to people, but I hope that some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m weren't.

Saturday, February 24, 2007

Breaking Firefox's RCSR Fix

In Firefox 2.0.0.2, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developers have done a lot of good in regards to helping prevent XSS and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r attacks against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client; you can read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole advisory here: http://www.mozilla.org/security/announce/2007/mfsa2007-02.html

And while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir fix for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RCSR issue is good, its not perfect.

As everyone (including people commenting on mozilla's bug tracker) noticed, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no real way to prevent this if an attacker can execute Javascript on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain, because he can simply inject an iframe which has an src attribute set to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user normally logs in on, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n simply change its contents to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password.

Anyway; this fix attempts to solve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue of an attacker being able to abuse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password manager if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can inject html, but not Javascript. And so, that is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 constraints within which we need to break cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fix.

Lets assume we have a html injection issue in a page called http://site.com/vuln.php in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GET parameter search; i.e. http://site.com/vuln.php?search= would inject an image into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page.

What we can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n do is inject a form into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page which looks like this:


    
    
    
    


Then if we get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to submit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form, 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 referers sent to http://evil.com/log.php will have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 username and password in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.

Of course, our form would have to have an input field which is an image which is transparent but covers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole browser window, which would submit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form for us, or similar so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form is submitted but that issue has already been solved, and I wanted to keep cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 example clean.

Saturday, February 10, 2007

Attacking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SafeCache Firefox Extension

Well, SudoLabs got taken down since almost no-one was using it, so now troopa is using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain for his blog, so I'm moving all my content here:

The SafeCache extension is yet anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r good idea in browser security to come out of Stanford University. Essentially it extends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser same origin policy to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser cache to defend against cache timing attacks. You can find more info about it here: http://www.safecache.com/

Now while I have not looked at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source code to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension, I have devised a method for not only being able to perform timing attacks, but to be able to directly determine whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r or not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 objects you are trying to find info about are in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache or not.

It seems that if you create an iframe element where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 src attribute points to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resource whose cache state you want to query, 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 onload event will fire only if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 item is not in any cache.

To test this eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r login to Gmail, or go to http://mail.google.com/mail/help/images/logo.gif and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n create a page like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:









And you will notice that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 onload element does not fire. Then if you press Ctrl+Shift+Del and delete cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n visit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 html page you just created again, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 onload event will fire.

If you refresh 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 onload event will not fire a second time because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image is already in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache.

So while it stops standard cache timing attacks, it does not stop attacks against itself.

Bookmarklets are NOT secure

Jungsonn wrote a post entitled "Defeating Phishers" where he wrote about how one could distribute risk across two servers, and essentially have one site where XSS vulnerabilities are unimportant, and one which would need to be audited heavily. He also recommended using Bookmarklets because "Bookmarklets are actually pretty secure things, no software or website can access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.".

Personally I disagree with both those statements. Firstly, if you find an XSS hole in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main domain, you can easily make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page say that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y've changed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir practices, sure it would be a little odd, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 amount of user education required for this attack to be impractical would be enough to solve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole phishing issue, not just this one.

But more importantly I want to debunk cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 myth that Bookmarklets are secure. Leaving aside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that trojans and similar can easily alter cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file system, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are still insecure; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are as insecure as 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ý bet365y are clicked on is untrustworthy.

For example, lets take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Bookmarklet Jungsonn posted:
javascript:QX=document.getSelection();if(!QX){void(QX=prompt('Type your firstname',''))};if(QX)document.location='https://myonlinebank.com'

It would seem fairly secure, except for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very allowing Javascript engines, we can stop this from working, here's how:


If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bookmarklet is clicked on a page with that on it - say a phishing page at http://myonlinebank.com.us or a legitimate page on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 http://onlinebank.com domain if it has an XSS hole in it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we can easily send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to a phishing page, even though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value is hard coded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bookmarklet.

Of course, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bookmarklet can try to detect and remove such things, but its a technological battle that will be fought on a bookmarklet by bookmarklet basis; which is essentially where security generally fails - custom code. Of course 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 scenario is that we find a secure method of redirecting users, but even if we do, we're not going to be able to get everyone to use it; so I'd racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r not recommend bookmarklets as security; just tell users to create a simple bookmark to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 site.

Or we could try to educate users to only click on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bookmarklet from a blank page, but thats anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r area where security generally fails - user education.

Friday, February 02, 2007

Attacking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PwdHash Firefox Extension

Well, SudoLabs got taken down since almost no-one was using it, so now troopa is using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain for his blog, so I'm moving all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 content here:




A while ago I saw an interesting paper/implementation of a way to hash and salt user passwords by domain, so that (I assume) phishing attacks would not be able to steal users' passwords because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are salted with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phishing domain racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 targeted domain. You can find more info here: https://www.pwdhash.com/

If you read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir paper, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 comments in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension you'll see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y've got pretty much anything you can think of covered. One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 things cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y haven't been able to stop has been Flash based sniffers, because Javascript extensions don't have any control over 3rd party plugins.

But I have come up with a way to circumvent certain protections and possibly anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r attack.

To protect against context switching attacks when a user presses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 @@ combination or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 F2 key into a password field cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context cannot be changed without alerting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are less than 5 additional characters.

This is decent protection since you cannot steal cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first 5 letters of a user's password, and since user passwords aren't particularly long those first 5 characters are vitally important.

But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension developers made a few fatal mistakes - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y allow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page to receive events of a user pressing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 @ key (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do not allow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 F2 key), and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y also check how many characters cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 text box by checking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM, and since we are not restricted from changing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM we can easily change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password box.

So what we can do is; detect two presses of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 @ key, quickly change 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 password box to testing or some similar string which is more than 5 chars long, set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 focus to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r element, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n change 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 password box to two @ signs, and put cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user back in place. you get a little flicker, but most users will discount that, anyway; here's an example:












Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r thing Firefox allows you to do is create events, which can be sent to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM, and for some reason cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do not go through extensions, this is a sort of double edged sword because while we cannot simulate a user typing to an extension, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension is not aware of us sending events to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM.

And since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension developers are sort of using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password box to store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password box contains @@ABCDEFGH...etc which get mapped to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 text you entered by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're computing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hash) we can insert text into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password box and have it included in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hash, and since we can inject cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 letters ABCD, etc, we can conduct an attack where we know that say each letter is repeated 3 times (by detecting keyboard events and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n sending two of those events to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 textbox again), this isn't a real attack atm since I haven't looked at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hashing algorithm, but it should make any cryptanalysis easier if we can repeat any number of letters any number of times.

Also, if we think we can get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to keep on entering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir password over and over again, we can just replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 textbox content with say @@AAAAA or @@BBBBB or @@CCCCC or similar so we can get a hash of a single character repeated, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n have a simple 256 value lookup table.




Ok, I figured out a way to defeat cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that we can't detect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 F2 key being pressed.

It does have some false positives, but this is just to show that an attack is still possible.

Anyway, what we do is detect when we get sent an A, we cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n check that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 text in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password box is > 0 and if it is, we send 4 As to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password box, and swap cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context. And record some data, and all we need is a 256 value lookup table. Anyway, here's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC:















Wednesday, January 24, 2007

defy.js

Well, I was kinda bored this morning and had cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 (very questionably) great idea of writing a snippet of code to delete all Javascript overloading, and reinstate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XMLHttpRequest Object:

function extractXHR () {
    var iframe = document.createElement('iframe');
    iframe.name='test';
    iframe.src='http://www.google.com/';
    iframe.style.display = 'none';
    document.body.appendChild(iframe);
    window.XMLHttpRequest= window.frames.test.XMLHttpRequest;
    document.body.removeChild(iframe);
}

function recursive_delete (object) {
    var failed;
    for (obj in object) {
        failed = 0;

        try {
            delete window[obj];
        } catch (e) {
            failed = 1;
        }

        if (failed = 0) {
            try {
                recursive_delete (window[obj]);
            } catch (e){

            }

        }
    }
};

recursive_delete (window);
recursive_delete (document);
extractXHR();


The ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r thing I could have done would be a recursive_extract function, which tried to extract everything from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 window object of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iframe, but not everything is enumerable (e.g. XMLHttpRequest is not enumerable), so customized code could still possibly be needed.

Also, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way reason cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extraction works is because it executes before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page can fully load, and this causes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 originating domain policy to not have kicked in yet, and so we can still get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 window object. its probably not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same object as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page uses in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end though, but I think I might check it out.

Essentially what that means for an attacker is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a tiny chance that it won't work if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page is set up between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two Javascript instructions which append cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iframe and extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XMLHttpRequest object.

Tuesday, January 23, 2007

More Javascript Overloading

Well, as I mentioned in my last post, Jeremiah's idea of masking functions works quite well, but I left out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that it only works for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 window object, so things like document.write() are still safe because document cannot be masked. try it:

javascript:function document() {};

And you get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 error Error: redeclaration of const document.

As you can see, while I do call it masking when you override XMLHttpRequest by creating a function of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same name, it is really just redeclaring it inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 window context.

So its effectively impossible to stop people writing to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore creating an iframe and using it's XMLHttpRequest object.

Now, thanks to Mook from irc.mozilla.org #js I've also found out that for everything ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than XMLHttpRequest that you can over-write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re also seems to be a property in window.__proto__ that does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same thing. Conveniently enough you can also create a function called __proto__ which blocks it.

Also, just some assorted things about Javascript which I mentioned in previous articles I want to mention:

When cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 submit() method gets replaced by a form element of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same name, you can still access it via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form.__proto__.submit() function, again; Thanks Mook.

Redeclaring Javascript Properties

Ok, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 title of this was originally "Don't we have memories for a reason?", and had a bit of a rant here, but I decided cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rant part was a bit unwarranted and stupid (exceptionally stupid, really), so I've removed it so I don't subject anyone else to that crap. Anyway, on with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 post:

Jeremiah Grossman (who does some great work, actually), had cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea to stop XSS Worms by denying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m access to some crucial functions like XMLHttpRequest() and createElement. You can read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole post here: http://jeremiahgrossman.blogspot.com/2007/01/preventing-csrf-when-vulnerable-to-xss.html.

Now while I don't think people have attempted to do exactly that before, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were efforts to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same thing to deny attackers access to cookies a while back, which used cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same techniques which it turned out could be easily subverted. Now this isn't my rant, things happen and people might not know about what has happened before, fair enough.

But when people who know about what happened before and that it can be overwritten start saying that Jeremiah's idea works you've really got to wonder why we have memories if we don't use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.

Oh, and here's some code to prove my point: (check your error console to see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are no errors, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appropriate functions are being called)

javascript:window.__defineGetter__("open", function() { }); delete window.open; window.open("http://kuza55.blogspot.com/",null,"");

javascript:document.createElement = function () {}; delete document.createElement; var bold = document.createElement('b'); bold.innerHtml = 'createElement Works'; document.body.appendChild(bold);

javascript:document.__defineGetter__("write", function() { }); delete document.write; document.write('document.write works');

I also found it humorous that someone was recommending using delete to remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 window element so that people could not call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function, instead of overwriting it.

Ok, now onto some more interesting things. The idea that Jeremiah Proposed for getting rid of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XMLHttpRequest() object was quite a good one, because whenever we try to delete a function it doesn't work, we CANNOT delete functions; it seems you can only delete objects and properties.

The documentation for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 delete operator can be found here, it doesn't mention why we can't (or how to) delete functions though: http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Operators:Special_Operators#delete

So essentially that definitely works, so good job on coming up with that. Well, untill someone else figures out a way past that as well.

But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some fun things you can do like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:













So if we can somehow create an iframe, with a name, we can circumvent it. We could also use an iframe created by advertising code, but that is limited by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that we would need to use window.frames, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only things which you can't replace with functions are window, document, and possibly some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r constants I can't remember right now.

Disclaimer: I'm not saying that anyone who I've mentioned does bad work (and even when I was ranting, I wasn't saying that), but seriously, you were told about something once, do you need to be told again?

Sunday, December 24, 2006

MySpace Non-Alpha-Non-Digit XSS 0day

It seems that MySpace has finally understood cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue here, which is good news, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir filter is written is working against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, or at least thats what I'm guessing from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results I'm getting.

Anyway, here's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit:



As you can see if you run that moz-binding is changed to .., and we are left with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:



So from this I think we can quite safely assume that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have a few separate modules which have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir go at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code in order, and if something gets changed to something dangerous, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 module that would filter that particular dangerous code out has already run (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 non-alpha-non-digit filtering module), 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 code is allowed through.

Isn't black box auditing fun? You end up making guesses that are quite often so very wrong but fit your results, :p.

Sunday, November 05, 2006

More MySpace XSS

I don't know whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to feel sorry for MySpace, or whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to laugh. The amount of XSS holes in MySpace is nothing short of outstanding.

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sad thing is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y've clearly tried to fix as many things as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y've been able to find, but some things have fallen just short.

Anyway, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 flaw I found this time around is that MySpace doesn't know that you can have an underscore (_) between an attribute name and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 equals sign, and have it being valid, like so: (Note: This only works on Firefox)



But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interesting thing is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have got a regex which dissallows everything which looks like on*= (obviously it doesn't look anything like that, but I'm not going to bocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r trying to write regexs), and yet cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y've done it in such a way that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y need to know about what characters are allowed, essentially creating ablacklist of chars which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y won't let you use between an attribute name and an equals sign. Why anyone would create a blacklist for that amazes me.