Session fixation--wiki
http://en.wikipedia.org/wiki/Session_fixation
In computer network security, session fixation attacks attempt to exploit the vulnerability of a system which allows one person to fixate (set) another person's session identifier (SID). Most session fixation attacks are web based, and most rely on session identifiers being accepted from URLs (query string) or POST data.
Contents
[hide]
- 1 Attack scenarios
- 2 Countermeasures
- 3 Defense in Depth
- 4 See also
- 5 External links
Attack scenarios
Alice has an account at the bank http://unsafe.example.com/
. Unfortunately, Alice is not very security savvy.
Mallory is out to get Alice's money from the bank.
Alice has a reasonable level of trust in Mallory, and will visit links Mallory sends her.
A simple attack scenario
Straightforward scenario:
- Mallory has determined that
http://unsafe.example.com/
accepts any session identifier, accepts session identifiers from query strings and has no security validation.http://unsafe.example.com/
is thus not secure. - Mallory sends Alice an e-mail: "Hey, check this out, there is a cool new account summary feature on our bank,
http://unsafe.example.com/?SID=I_WILL_KNOW_THE_SID
". Mallory is trying to fixate the SID toI_WILL_KNOW_THE_SID
. - Alice is interested and visits
http://unsafe.example.com/?SID=I_WILL_KNOW_THE_SID
. The usual log-on screen pops up, and Alice logs on. - Mallory visits
http://unsafe.example.com/?SID=I_WILL_KNOW_THE_SID
and now has unlimited access to Alice's account.
Attack using server generated SID
A misconception is that servers which only accept server generated session identifiers are safe from fixation. This is false.
Scenario:
- Mallory visits
http://vulnerable.example.com/
and checks which SID is returned. For example, the server may respond:Set-Cookie: SID=0D6441FEA4496C2
. - Mallory is now able to send Alice an e-mail: "Check out this new cool feature on our bank,
http://vulnerable.example.com/?SID=0D6441FEA4496C2
." - Alice logs on, with fixated session identifier
SID=0D6441FEA4496C2
. - Mallory visits
http://vulnerable.example.com/?SID=0D6441FEA4496C2
and now has unlimited access to Alice's account.
Attacks using cross-site cooking
Another session fixation attack, cross-site cooking, exploits browser vulnerabilities. This allows the site http://evil.example.org/
to store cookies in Alice's browser in the cookie domain of another server http://good.example.com/
, which is trusted. This attack can succeed even when there is no vulnerability withinhttp://good.example.com/
, because http://good.example.com/
may assume that browser cookie management is secure.
Scenario:
- Mallory sends Alice an e-mail: "Hey, check out this cool site,
http://evil.example.org/
". - Alice visits
http://evil.example.org/
, which sets the cookieSID
with the valueI_WILL_KNOW_THE_SID
into the domain ofhttp://good.example.com/
. - Alice doesn't know that the SID was fixed to Mallory's content, and logs into
http://good.example.com/
later in the day. Mallory can now use her account using the fixated session identifier.
For security reasons, modern browsers do not allow setting cross-domain cookies.
Attacks using cross-subdomain cooking
This is like cross-site cooking, except that it does not rely on browser vulnerabilities. Rather, it relies on the fact that wildcard cookies can be set by one subdomain that affect other subdomains.
Scenario:
- A web site
www.example.com
hands out subdomains to untrusted third parties - One such party, Mallory, who now controls
evil.example.com
, lures Alice to her site - A visit to
evil.example.com
sets a session cookie with the domain.example.com
on Alice's browser - When Alice visits
www.example.com
, this cookie will be sent with the request, as the specs for cookies states, and Alice will have the session specified by Mallory's cookie. - If Alice now logs on, Mallory can use her account.
Each of these attack scenarios has resulted in Cross-calation, where Mallory has successfully gained access to the functions and data normally reserved for Alice.
An alternate attack scenario does not require Alice to log into a site. Rather, simply by fixing the session, Mallory may be able to spy on Alice and abuse the data she enters. For example, Mallory may use the above attacks to give Alice her own authenticated session—so Alice will start using the site with all the authentication of Mallory. If Alice decides to purchase something on this site and enters her credit card details, Mallory might be able to retrieve that data (or other confidential data) by looking through the historical data stored for the account.
Countermeasures
Do not accept session identifiers from GET / POST variables[edit]
Session identifiers in URL (query string, GET variables) or POST variables are not recommended as they simplify this attack – it is easy to make links or forms which set GET / POST variables.
Additionally, session identifiers (SIDs) in query strings enable other risk and attack scenarios;
- The SID is leaked to others servers through the Referrer
- The SID is leaked to other people as users cut & paste "interesting links" from the address bar into chat, forums, communities, etc.
- The SID is stored in many places (browser history log, web server log, proxy logs, ...)
Note: Cookies are shared between tabs and popped up browser windows. If your system requires to be hit with the same domain (www.example.com?code=site1 and www.example.com?code=site2 ), cookies may conflict with one another between tabs.
It may be required to send the session identifier on the URL in order to overcome this limitation. If possible use site1.example.com or site2.example.com so there is no domain conflicts in the cookies. This may incur costs with extra SSL certificates.
This behavior can be seen on many sites by opening another tab and trying to do side by side search results. One of the sessions will become unusable.
Best solution: Identity Confirmation
This attack can be largely avoided by changing the session ID when users log in. If every request specific to a user requires the user to be authenticated with ("logged into") the site, an attacker would need to know the id of the victim's log-in session. When the victim visits the link with the fixed session id, however, they will need to log into their account in order to do anything "important" as themselves. At this point, their session id will change, and the attacker will not be able to do anything "important" with the anonymous session ID.
A similar technique can be used to solve the phishing problem. If the user protects their account with two passwords, then it can be solved to a great extent.
This technique is also useful against cross-site request forgery attacks.
Solution: Store session identifiers in HTTP cookies
The session identifier on most modern systems is stored by default in an HTTP cookie, which has a moderate level of security as long as the session system disregards GET/POST values.[citation needed] However, this solution is vulnerable to cross-site request forgery, and it does not meet the statelessness requirement of REST.
Solution: Utilize SSL / TLS Session identifier
When enabling HTTPS security, some systems allow applications to obtain the SSL / TLS session identifier. Use of the SSL/TLS session identifier is very secure, but many web development languages do not provide robust built-in functionality for this.
SSL/TLS session identifiers may be suitable only for critical applications, such as those on large financial sites, due to the size of the systems. This issue, however, is rarely debated even in security forums.[citation needed]
Regenerate SID on each request
A countermeasure against session fixation is to generate a new session identifier (SID) on each request. If this is done, then even though an attacker may trick a user into accepting a known SID, the SID will be invalid when the attacker attempts to re-use the SID. Implementation of such a system is simple, as demonstrated by the following:
- Get previous Session Identifier
OLD_SID
from HTTP request. - If
OLD_SID
is null, empty, or no session with SID=OLD_SID
exists, create a new session. - Generate new session identifier
NEW_SID
with a secure random number generator. - Let session be identified by SID=
NEW_SID
(and no longer by SID=OLD_SID
) - Transmit new SID to client.
Example:
If Mallory successfully tricks Alice into visiting http://victim.example.com/?SID=I_KNOW_THE_SID
, this HTTP request is sent to victim.example.com
:
GET /?SID=I_KNOW_THE_SID HTTP/1.1
Host: victim.example.com
victim.example.com
accepts SID=I_KNOW_THE_SID
, which is bad. However, victim.example.com
is secure because it performs session regeneration. victim.example.com
gets the following response:
HTTP/1.1 200 OK
Set-Cookie: SID=3134998145AB331F
Alice will now use SID=3134998145AB331F
which is unknown to Mallory, and SID=I_KNOW_THE_SID
is invalid. Mallory is thus unsuccessful in the session fixation attempt.
Unfortunately session regeneration is not always possible. Problems are known to occur when third-party software such as ActiveX or Java Applets are used, and when browser plugins communicate with the server. Third-party software could cause logouts, or the session could be split into two separate sessions.
If the implementation of sessions includes transmitting the SID through GET or POST variables, then this might also render the "back" button in most browsers unusable, as the user would the be using and older, invalid, session identifier from a previous request.
Accept only server-generated SIDs
One way to improve security is not to accept session identifiers that were not generated by the server. However, as noted above, this does not prevent all session fixation attacks.
if (!isset($_SESSION['SERVER_GENERATED_SID'])) {
session_destroy(); // destroy all data in session
}
session_regenerate_id(); // generate a new session identifier
$_SESSION['SERVER_GENERATED_SID'] = true;
Logout function
A logout function is useful as it allows users to indicate that a session should not allow further requests. Thus attacks can only be effective while a session is active. Note that the following code performs no Cross-site request forgery checks, potentially allowing an attacker to force users to log out of the web application.
if ( logout )
session_destroy(); // destroy all data in session
Time-out old SIDs
This defense is simple to implement and has the advantage of providing a measure of protection against unauthorized users accessing an authorized user's account by using a machine that may have been left unattended.
Store a session variable containing a time stamp of the last access made by that SID. When that SID is used again, compare the current timestamp with the one stored in the session. If the difference is greater than a predefined number, say 5 minutes, destroy the session. Otherwise, update the session variable with the current timestamp.
Destroy session if Referrer is suspicious
When visiting a page, most browsers will set the Referrer – the page that contained the link that you followed to get to this page.
When the user is logged into a site that is not likely to be linked to from outside that site (e.g., banking websites, or webmail), and the site is not the kind of site where users would remain logged in for any great length of time, the Referrer should be from that site. Any other Referrer should be considered suspicious. However, if the originating request is from a HTTPS page, then the referrer will be stripped, so you cannot depend on this security system.
For example, http://vulnerable.example.com/
could employ the following security check:
if (strpos($_SERVER['HTTP_REFERER'], 'http://vulnerable.example.com/') !== 0) {
session_destroy(); // destroy all data in session
}
session_regenerate_id(); // generate a new session identifier
Verify that additional information is consistent throughout session
One way to further improve security is to ensure that the user appears to be the same end user (client). This makes it a bit harder to perform session fixation and other attacks.
As more and more networks begin to conform to RFC 3704 and other anti-spoofing practices, the IP address becomes more reliable as a "same source" identifier. Therefore, the security of a web site can be improved by verifying that the source IP is consistent throughout a session.
This could be performed in this manner:
if($_SERVER['REMOTE_ADDR'] != $_SESSION['PREV_REMOTEADDR']) {
session_destroy(); // destroy all data in session
}
session_regenerate_id(); // generate a new session identifier
$_SESSION['PREV_REMOTEADDR'] = $_SERVER['REMOTE_ADDR'];
However, there are some points to consider before employing this approach.
- Several users may share one IP. It is not uncommon for an entire building to share one IP using NAT.
- One user may have an inconsistent IP. This is true for users behind proxies (such as AOL customers). It is also true for some mobile/roaming users, as well as users that are behind load balanced Internet connections. Users with IPv6 Privacy Extensions enabled may also change their IPv6 privacy addresses at any time.
For some sites, the added security outweighs the lack of convenience, and for others it does not.
User Agent
Browsers identify themselves by "User-Agent" HTTP headers. This header does not normally change during use; it would be extremely suspicious if that were to happen. A web application might make use of User-Agent detection in attempt to prevent malicious users from stealing sessions. This however is trivial to bypass, as an attacker can easily capture the victim's user-agent with their own site and then spoof it during the attack. This proposed security system is relying on Security through obscurity.
if ($_SERVER['HTTP_USER_AGENT'] != $_SESSION['PREV_USERAGENT']) {
session_destroy(); // destroy all data in session
}
session_regenerate_id(); // generate a new session identifier
$_SESSION['PREV_USERAGENT'] = $_SERVER['HTTP_USER_AGENT'];
However, there are some points to consider before employing this approach.
- Several users may have same browser User Agent in Internet café.
- Several users may have same default browser (ex: Internet Explorer 6 in Windows XP SP3 or mini browser in mobile phone).
But User Agent may change legally in few cases. Following examples are the same users.
- A smartphone whose screen rotated since the last request
- Mozilla/5.0 (Linux; U; Android 2.2; en-us; DROID2 Build/VZW) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 854X480 motorola DROID2
- Mozilla/5.0 (Linux; U; Android 2.2; en-us; DROID2 Build/VZW) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 480X854 motorola DROID2
- Internet Explorer compatibility mode:
- Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
- Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
- A user accessing a web site through a proxy distributed across multiple servers, not all of which are upgraded to the latest version of the proxy software
- Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (FlipboardProxy/0.0.5; +http://flipboard.com/browserproxy)
- Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)
Defense in Depth[edit]
Defense in depth is to combine several countermeasures. The idea is simple: if one obstacle is trivial to overcome, several obstacles could be very hard to overcome.
A Defence in Depth strategy could involve:
- Enable HTTPS (to protect against other problems)
- Correct configuration (do not accept external SIDs, set time-out, etc.)
- Perform session_regeneration, support log-out, etc.
It should be noted that HTTP referers are not passed with SSL.
The following PHP script demonstrates several such countermeasures combined in a Defence in Depth manner:
if (isset($_GET['LOGOUT']) ||
$_SERVER['REMOTE_ADDR'] !== $_SESSION['PREV_REMOTEADDR'] ||
$_SERVER['HTTP_USER_AGENT'] !== $_SESSION['PREV_USERAGENT'])
session_destroy(); session_regenerate_id(); // generate a new session identifier $_SESSION['PREV_USERAGENT'] = $_SERVER['HTTP_USER_AGENT'];
$_SESSION['PREV_REMOTEADDR'] = $_SERVER['REMOTE_ADDR'];
Note that this code checks the current REMOTE_ADDR (the user's IP address) and User-agent against the REMOTE_ADDR and User-agent of the previous request. This might be inconvenient for some sites as discussed above。
Session fixation--wiki的更多相关文章
- Tomcat的SessionID引起的Session Fixation和Session Hijacking问题
上一篇说到<Spring MVC防御CSRF.XSS和SQL注入攻击>,今天说说SessionID带来的漏洞攻击问题.首先,什么是Session Fixation攻击和Session Hi ...
- session fixation
转自:session fixation攻击 什么是session fixation攻击 Session fixation有人翻译成"Session完成攻击",实际上fixation ...
- ASP.NET Session and Forms Authentication and Session Fixation
https://peterwong.net/blog/asp-net-session-and-forms-authentication/ The title can be misleading, be ...
- 漏洞:会话固定攻击(session fixation attack)
什么是会话固定攻击? 会话固定攻击(session fixation attack)是利用应用系统在服务器的会话ID固定不变机制,借助他人用相同的会话ID获取认证和授权,然后利用该会话ID劫持他人的会 ...
- spring security防御会话伪造session攻击
1. 攻击场景 session fixation会话伪造攻击是一个蛮婉转的过程. 比如,当我要是使用session fixation攻击你的时候,首先访问这个网站,网站会创建一个会话,这时我可以把附有 ...
- HTTP层 —— Session
1.简介 由于HTTP驱动的应用是无状态的,所以我们使用Session来存储用户请求信息.Laravel通过干净.统一的API处理后端各种Session驱动,目前支持的流行后端驱动包括Memcache ...
- Session攻击(会话劫持+固定)与防御
1.简介 Session对于Web应用无疑是最重要的,也是最复杂的.对于web应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,进而 ...
- tomcat中session在两个webapp中实现共享
现在遇到一个需求就是要求完成简单的单点登录,通过在一个tomcat实例中放置两个webapps应用ROOT应用和CEO应用来完成在ROOT应用登录后,在CEO可以直接使用,而未在ROOT应用登录时,不 ...
- 会话固定攻击 - yxcms session固定漏洞
目录 会话固定攻击 e.g. yxcms session固定攻击 分析 了解更多 会话固定攻击 Session fixation attack(会话固定攻击)是利用服务器的session不变机制,借他 ...
随机推荐
- Red Hat Enterprise Linux 6.4常用命令
常用命令: profile文件立即生效:source /etc/profile source /home/kituser/.bash_profile 修改文件夹子文件权限:chmod -R 777 / ...
- Excel动态生成JSON
在最近的一个项目中,有大量的数据源来至Excel,转成JSON供前台使用.Excel数据是人工录入的,难免会有错误,所以中间会有逻辑检查.在C#中读取Excel的方式有很多,网上一搜一大堆,这里我也贴 ...
- 新建虚拟目录使用UNC共享文件夹(即:虚拟目录使用UNC共享文件夹)的方法 -摘自网络
新建虚拟目录使用UNC共享文件夹(即:虚拟目录使用UNC共享文件夹)的方法1.UNC路径:\\192.168.1.2\test\,假设连接该UNC路径的用户名为:web,密码为:123 2.在原web ...
- 最大连续子数组问题-homework-01
1)先写我的 github 的介绍: github 的域名:http://www.github.com/zhuifeng1022 登入 github 大概是下面的视图: 按照助教的方法:我已经建好了代 ...
- struts2+Hibernate4+spring3+EasyUI环境搭建之五:引入jquery easyui
1.下载jquery easyui组件 http://www.jeasyui.com/download/index.php 2.解压 放到工程中 如图 3.jsp引入组件:必须按照如下顺序 ...
- delphi debug release区别是什么?
1. 基础知识介绍: Debug编译:是为了便于程序调试,所以目标代码里附加有许多额外的东西.Release编译:是产品可作为正式拷贝发布了,已经不需要那些仅为调试而编译进去东西. (在 Releas ...
- Maven仓库Nexus的安装配置
1.下载nexus,最新版本是nexus-2.8.0-05 参考文章 下载nexus-latest-bundle.zip文件后,并解压到 D:\nexus下 配置nexus的环境变量:先配置NE ...
- MSGPACK(一)
MSGPACK跨平台的数据序列规范,为多种语言所支持.用它序列还是还原数据都异常方便. 而且它支持序列的数据格式非常之多,因为它支持的数据格式多,所以MSGPACK的第二功用:缓存. DELPHI的M ...
- HDU 3911 Black And White (线段树区间合并 + lazy标记)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3911 给你n个数0和1,m个操作: 0操作 输出l到r之间最长的连续1的个数 1操作 将l到r之间 ...
- android 脸部抠图
原帖:http://www.eoeandroid.com/thread-205445-1-1.html package com.face; import android.app.Activity; i ...