Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tricky question for good understanding of CSRF

Tags:

security

xss

My friend and I have a pari for beer.

From wikipedia:

Requiring a secret, user-specific token in all form submissions and side-effect URLs prevents CSRF; the attacker's site cannot put the right token in its submissions

The atacker can use browser cookies indirectly, but he can't use them directly! That's why he can't put the cookies into the link using document.write()

Let us look how the logout link is generated. Is it secure way? Can this GET request be faked?

function logout(){
     echo '<a href="?action=logout&sid='.htmlspecialchars($_COOKIE['sid']).'>Logout</a>';
}

sid is a session ID, generated for every session

on the server side, the following checking is performed:

$_GET['sid']==$_COOKIE['sid']
like image 464
Dan Avatar asked Feb 18 '11 19:02

Dan


People also ask

Why is CSRF difficult to detect?

"CSRF attacks are also very difficult to detect, because they look very much like a legitimate request from a trusted user." OWASP currently ranks CSRF attacks as the number eight most common and critical Web application vulnerability, down from the five spot since the last list was compiled.

What is vulnerable to CSRF?

A CSRF attack exploits a vulnerability in a Web application if it cannot differentiate between a request generated by an individual user and a request generated by a user without their consent.

What are the ways a user can be tricked to perform CSRF attack?

There are numerous methods in which an attacker can trick a victim into submitting a forged POST request, such as a simple form hosted in an attacker's Website with hidden values. This form can be triggered automatically by JavaScript or can be triggered by the victim who thinks the form will do something else.


1 Answers

Absolutely not! Never use session identifiers for CSRF protection.

As far as why? Well, the answer is simple. Doing so opens the door for session hijacking attacks. Imagine someone copies and pastes the link for some reason into an email or onto the web. Now, the person on the other end of the email has the session identifier of that session. Sure, if they click the link it won't activate the session, but someone who knows what they are doing will still be able to use it.

And don't use a secret cookie either. Cookies are transmitted on every request. So the mere existence of a cookie does not verify that the user intended to make the request.

How to do it instead? Follow the OWASP recommendations. Use a unique, random token that's issued on each request and is associated with the session. Then verify that the token is valid on submission and then invalidate the token! It should be a one-time-use token only. Have it submitted by the form, and not attached to a link directly...

like image 68
ircmaxell Avatar answered Oct 12 '22 23:10

ircmaxell