PUBLIC Session Fixation Vulnerability in Web-based Applications Session Fixation Vulnerability in Web-based Applications Version 1.0 – revision 1 Mitja Kolšek mitja.kolsek@acrossecurity.com ACROS Security http://www.acrossecurity.com December 2002 (Revised February 2007 – the Acknowledgments section) Current copy available at http://www.acrossecurity.com/papers/session_fixation.pdf 1. Abstract Many web-based applications employ some kind of session management to create a user-friendly environment. Sessions are stored on server and associated with respective users by session identifiers (IDs). Naturally, session IDs present an attractive target for attackers, who, by obtaining them, effectively hijack users’ identities. Knowing that, web servers are employing techniques for protecting session IDs from three classes of attacks: interception, prediction and brute-force attacks. This paper reveals a fourth class of attacks against session IDs: session fixation attacks. In a session fixation attack, the attacker fixes the user’s session ID before the user even logs into the target server, thereby eliminating the need to obtain the user’s session ID afterwards. There are many ways for the attacker to perform a session fixation attack, depending on the session ID transport mechanism (URL arguments, hidden form fields, cookies) and the vulnerabilities available in the target system or its immediate environment. The paper provides detailed information about exploiting vulnerable systems as well as recommendations for protecting them against session fixation attacks. 2. Introduction Web-based applications frequently use sessions to provide a friendly environment to their users. HTTP [1] is a stateless protocol, which means that it provides no integrated way for a web server to maintain states throughout user’s subsequent requests. In order to overcome this problem, web servers – or sometimes web applications – implement various kinds of session management. The basic idea behind web session management is that the server generates a session identifier (ID) at some early point in user interaction, sends this ID to the user’s browser and makes sure that this same ID will be sent back by the browser along with each subsequent request. Session IDs thereby become identification tokens for users, and servers can © 2002 ACROS d.o.o. [ http://www.acrossecurity.com ] page 1 of 16 PUBLIC Session Fixation Vulnerability in Web-based Applications use them to maintain session data (e.g., variables) and create a session-like experience to the users. There are three widely used methods for maintaining sessions in web environment: URL arguments, hidden form fields and cookies [2]. While each of them has its benefits and shortcomings, cookies have proven to be the most convenient and also the least insecure of the three. From security perspective, most – if not all - known attacks against cookie-based session maintenance schemes can also be used against URL- or hidden form fields-based schemes, while the converse is not true. This makes cookies the best choice security-wise. Very often, session IDs are not only identification tokens, but also authenticators. This means that upon login, users are authenticated based on their credentials (e.g., usernames/passwords or digital certificates) and issued session IDs that will effectively serve as temporary static passwords for accessing their sessions. This makes session IDs a very appealing target for attackers. In many cases, an attacker who manages to obtain a valid ID of user’s session can use it to directly enter that session – often without arising user’s suspicion. Interestingly, most cross-site scripting [3] proof-of-concept exploits focus on obtaining the session ID stored in browser’s cookie storage. This class of attacks, where the attacker gains access to the user’s session by obtaining his session ID, is called session hijacking [4]. Web session security is focused on preventing three types of attacks against session IDs: interception, prediction and brute-force attacks. Encrypted communication effectively protects against interception1. Using cryptographically strong pseudorandom number generators and carefully chosen seeds that don’t leak from the server prevents prediction of session IDs. Finally, session IDs are immune to brute-force methods if their effective bit-length is large enough with respect to the number of simultaneous sessions2. Proposals have been made for mitigating the threat of stolen session IDs [6], and some products already implement such ideas (e.g., RSA Security’s ACE/Agents for web servers). 3. Session fixation As mentioned above, web session security is mainly focused on preventing the attacker from obtaining – either intercepting, predicting or brute-forcing - a session ID issued by the web server (also called “target server” in this paper) to the user’s browser. This approach, however, ignores one possibility: namely the possibility of the attacker “issuing” a session ID to the user’s browser, thereby forcing the browser into using a chosen session. We’ll call this class of attacks “session fixation” attacks, because the user’s session ID has been fixed in advance instead of having been generated randomly at login time. 1 Although forgetting to mark session ID cookies as »secure« keeps the attacker's foot in the door [7]. 2 David Endler of iDefense wrote a very interesting article [5] on this topic. © 2002 ACROS d.o.o. [ http://www.acrossecurity.com ] page 2 of 16 PUBLIC Session Fixation Vulnerability in Web-based Applications In a session fixation attack, the attacker fixes the user’s session ID before the user even logs into the target server, thereby eliminating the need to obtain the user’s session ID afterwards. Let’s take a look at a simple example of a session fixation attack. Figure 1 shows a web server online.worldbank.dom that hosts a session-aware web banking application. Session IDs are transported from browser to server within a URL argument sessionid. First, the attacker – who in this case is also a legitimate user of the system – logs in to the server (1) and is issued a session ID 1234 (2). She then sends a hyperlink http://online.worldbank.dom/login.jsp?sessionid=1234 to the user, trying to lure him into clicking on it (3). The user (how convenient for our example) clicks on the link, which opens the server’s login page in his browser (4). Note that upon receipt of the request for login.jsp?sessionid=1234, the web application has established that a session already exists for this user and a new one need not be created. Finally, the user provides his credentials to the login script (5) and the server grants him access to his bank account. However, at this point, knowing the session ID, the attacker can also access the user’s account via account.jsp?sessionid=1234 (6). Since the session has already been fixed before the user logged in, we say that the user logged into the attacker’s session. 1 6 attacker 3 http://online.worldbank.dom /login.jsp?sessionid=1234 Log in s e ssi GE oni T /a d=1 cco 234 unt .jsp ?s e ssi oni d=1 234 2 4 5 GET /login.jsp?sessionid=1234 username & password user online.worldbank.dom Figure 1: Simple session fixation in an URL-based web banking system The above example is the simplest – and the least dangerous - form of a session fixation attack and has many shortcomings (for the attacker), such as: she has to be a © 2002 ACROS d.o.o. [ http://www.acrossecurity.com ] page 3 of 16 PUBLIC Session Fixation Vulnerability in Web-based Applications legitimate user on the target server and she has to trick the user into logging in through the hyperlink she provided. The following chapters will describe various methods for making session fixation more reliable, less detectable and available to “outside” attackers (those that are not legitimate users on the target server). But first, let’s examine the attack process step by step. 4. Attack process Generally, session fixation attack is a three-step process, as shown in Figure 2: 1. Session setup: First, the attacker either sets up a so-called “trap session” on the target server and obtains that session’s ID, or selects a – usually arbitrary – session ID to be used in the attack. In some cases, the established trap session needs to be maintained (kept alive) by repeatedly sending requests referencing it to avoid idle session timeout. 2. Session fixation: Next, the attacker needs to introduce her session ID to the user’s browser, thereby fixing his session. 3. Session entrance: Finally, the attacker has to wait until the user logs in to the target server using the previously fixed session ID and then enter the user’s session. 1 Session setup 1a Session maintenance 2 Session fixation 3 Session entrance Figure 2: Three steps in a session fixation attack Now let’s take a look at the three steps in more detail. STEP 1: Session setup We can classify session management mechanisms on web servers in two classes: a) “Permissive”: those that accept arbitrary session IDs, and create a new session with proposed session ID if one doesn’t exist yet (e.g., Macromedia JRun server, PHP). b) “Strict”: those that only accept known session IDs, which have been locally generated at some point in the past (e.g., Microsoft Internet Information Server). © 2002 ACROS d.o.o. [ http://www.acrossecurity.com ] page 4 of 16 PUBLIC Session Fixation Vulnerability in Web-based Applications For a permissive system, the attacker only needs to make up a random trap session ID, remember it and use it for the attack. In a strict system, the attacker will have to actually establish a trap session with the target server, extract the trap session ID, remember it and use it for the attack. Depending on the session management logic, this session will need to be kept alive at least until the user logs into it. Generally, sessions don’t exist indefinitely; rather, servers automatically destroy them upon idle or absolute timeout. Idle timeout can easily be avoided by automatically sending periodic requests for the trap session. Absolute timeout, while less frequently employed, presents a tougher obstacle and in most cases defines the maximum timeframe for the entire attack process. Furthermore, restarting the web server can destroy all active sessions, requiring the attacker to return to the session setup step. A permissive system requires no trap session maintenance. STEP 2: Session fixation In this step the attacker tries to transport the trap session ID to the user’s browser. Methods for accomplishing that differ depending on the session ID transport mechanism. Let’s examine each one of them. Session ID in an URL argument The attacker needs to trick the user into logging in to the target web server through the hyperlink she provides, for example, http://online.worldbank.dom/login.jsp?session=1234. This method, while feasible, is relatively impractical and comes with quite a risk of detection. Session ID in a hidden form field The attacker needs to trick the user into logging in to the target web server through a look-alike login form that in reality probably comes from another web server. This method is at least as impractical and detection-prone as the former one and is included here only for the sake of completeness. In the best case, the attacker could exploit a cross-site scripting vulnerability on the target web server in order to construct a login form (coming from the target server) containing a chosen session ID. However, the attacker managing to trick the user into logging in through a malicious login form could just as well direct the user’s credentials to her own web server, which is generally a greater threat than that of fixing his session. Session ID in a cookie Cookies are a predominant session ID transport mechanism, partly also due to their security in comparison to URL arguments and hidden form fields. Ironically, on the other hand, cookies provide the most convenient, covert, effective and durable means of exploiting session fixation vulnerabilities. What the attacker needs to do is install the trap session ID cookie on the user’s browser. According to RFC2965 [2], the browser will only accept a cookie assigned either to the issuing server or the issuing server’s domain. Consequently, even though © 2002 ACROS d.o.o. [ http://www.acrossecurity.com ] page 5 of 16 PUBLIC Session Fixation Vulnerability in Web-based Applications it would provide a great attack avenue, the attacker’s web server www.attacker.com can’t set a cookie for the target web server online.worldbank.dom. The attacker can choose among the three available methods for issuing a cookie to the browser: A. using a client-side script that sets a cookie on the browser; B. using the HTML tag with Set-Cookie attribute; C. using the Set-Cookie HTTP response header. We’ll analyze each of them in terms of their usability in a session fixation attack. Method A: Issuing a cookie using a client-side script Most browsers support client-side scripting, usually in JavaScript and/or VBScript languages. Both languages provide a way for the web server to issue a cookie to the browser by setting the property document.cookie to a desired value, for example in JavaScript: document.cookie=”sessionid=1234”; What the attacker wants to achieve is for the target web server to provide a clientside script like the one above that will issue the desired trap session ID cookie to the user’s browser. This can be done using a well-known and very widespread vulnerability called the “cross-site scripting” [10]. Cross-site scripting The attacker can exploit a cross-site scripting vulnerability on the online.worldbank.dom server in order to have that server issue the desired session ID cookie itself. An example URL for exploiting the cross-site scripting vulnerability in Microsoft’s Internet Information Server [8] is: http://online.worldbank.dom/.idc The attacker could introduce this malicious URL to the user’s browser by sending the user an HTML-formatted e-mail message including a small (invisible) frame originating from this URL. Alternatively, the attacker could send the user only a hyperlink to this URL (which can be disguised as something benign3) and try to lure the user into clicking on it. Persistent cookies The above cross-site scripting exploit can be enhanced by setting a persistent cookie instead of a temporary one (which is a default), thereby fixing the user’s session for a longer period of time. Example: 3 Microsoft Outlook, for example, doesn't make it easy for user to see where a hyperlink in a message is actually pointing to. © 2002 ACROS d.o.o. [ http://www.acrossecurity.com ] page 6 of 16 PUBLIC Session Fixation Vulnerability in Web-based Applications http://online.worldbank.dom/.idc In a session fixation attack, the added value of domain cookies becomes clear in the following scenario (see Figure 3): Attacker exploits a cross-site scripting vulnerability on server www.worldbank.dom (which is in the same domain as the target sever online.worldbank.dom) for generating a cookie-issuing script that sets a domain trap session ID cookie for the .worldbank.dom domain. She provides such cookie-issuing URL to the user’s browser (1). Upon visiting the provided URL (2), the user’s browser will accept a cookie from www.worldbank.dom (3) and will – since it’s a domain cookie – send it to online.worldbank.dom when the user later decides to log in to his bank account (4). © 2002 ACROS d.o.o. [ http://www.acrossecurity.com ] page 7 of 16 PUBLIC Session Fixation Vulnerability in Web-based Applications GET /account.jsp Cookie: sessionid=1234 5 attacker 1 online.worldbank.dom http://www.worldbank.dom/ .idc p n.js 234 ogi nid=1 l / T GE sessio : e i ok Co 4 2 GET /.idc document.cookie="sessionid=1234; domain=.worldbank.dom" user 3 www.worldbank.dom Figure 3: Session fixation using a cross-site scripting vulnerability on another server in domain After the user’s successful login, the attacker will be able to access his bank account using the fixed session ID (5). A very effective attack scenario could employ a persistent domain trap session ID cookie. Method B: Issuing a cookie using the tag with Set-Cookie attribute The server can also issue a cookie to the browser by including an appropriate tag in the returned HTML document, for example: Now, the attacker wants the target server - or any other web server in the target server’s domain - to return a specific, trap session ID cookie-issuing tag to the user’s browser. This can be achieved by using a “meta tag injection” method. Meta tag injection Most cross-site scripting vulnerabilities can also be used for injecting tags to the resulting HTML document. Furthermore, systems that only scan the browser’s arguments for