Many recognise that the internet is an insecure place to be, but sometimes the browser itself can heighten this likelihood. In his latest blog post, Jonathan Kuskos WhiteHat's A-Team Application Security Engineer, warns to the danger of an unconventional attack in Firefox (versions 21 and below) - Cross Site Request Forgery.
In his commentary, Jonathan:
Explains ‘Cross Site Request Forgery’
Explains ‘verb tampering’
Uses examples to show how this attack works
Warns that, while Firefox 22 has been patched, previous versions remain vulnerable - highlighting the issue that users should update browsers to remain secure
It appears that an unconventional method of Cross Site Request Forgery may be made exploitable by using Firefox versions 21 and below. The exploit requires that the target application be first vulnerable to HEAD request verb tampering, which is where a HEAD verb(also commonly known as 'method') is supplied in place of a GET or POST, and is successfully processed by the application. Once this is found, an XMLHttpRequest(commonly abbreviated to 'XHR') request can be sent from an off-domain location with the .open() method invoked and HEAD supplied as the verb.
The XMLHttpRequest Living Standard specifications can be found here and defines how XHR objects should be used. Although there are many rules, steps 3 and 4 of the .send() method serve particular interest to this implementation error:
.send(data);
3) If the request method is GET or HEAD, set data to null.
4) If data is null, do not include a request entity body and go to the next step.
Consider the following very basic and elementary Proof of Concept:
If you monitor your traffic or catch this in an intercepting proxy, you will see a request being made to https://www.whitehatsec.com with post data "foo=bar", even though the request verb is HEAD. According to step 3 above, 'data' should have been set to 'NULL'. This behavior seems to only occur in Firefox; The latest versions(as of this writing) of Internet Explorer, Chrome, Safari, and Opera are all successfully practicing proper .send() implementation.
I notified Mozilla of this behavior and a patch has been implemented into the v22 build. Until then Firefox 21 and those that refuse to ever update their browser will remain susceptible targets. It requires a bit of a "perfect storm" scenario, but nonetheless the second most widely used browser in the world should never ineptly contribute to CSRF.