什么是会话固定攻击?
会话固定攻击(session fixation attack)是利用应用系统在服务器的会话ID固定不变机制,借助他人用相同的会话ID获取认证和授权,然后利用该会话ID劫持他人的会话以成功冒充他人,造成会话固定攻击。
会话固定也是会话劫持的一种类型。会话劫持是攻击者偷走受害者与服务器建立链接的会话,而会话固定是攻击者事先建立一个会话,然后诱使受害者使用此会话进行登录,如图10-7所示。
看下面Session Fixation攻击的一个简单例子:
整个攻击流程是:
1、攻击者Attacker以一个合法的用户身份登录www.website.com。
2、服务器与攻击者Attacker建立了一个会话,sessionid为1234567(这里只是一个示例,大家不要在乎sessionid的位数对不对)。应用网站服务器返回一个会话ID给他;
3、攻击者Attacker用该会话ID构造了一个URL:http://www.website.com/login.jsp?sessionid=1234567,发给了受害者Alice ;
4- 受害者Victim点击该链接,进行了登录;
5、受害者Victim输入她的合法用户名和密码,正常登录了该网站,会话成功建立(注意,由于此时的sessionid预先已经被Bob设置为1234567了);
6、攻击者Attacker用该会话ID成功冒充并劫持了受害者Victim的会话,这时攻击者Attacker如果输入http://www.website.com/viewprofile.jsp?sessionid=1234567,就可以看到受害者Victim的个人信息(profile)了,因此sessionid此时就是代表了Victim;
更多攻击例子参考:https://owasp.org/www-community/attacks/Session_fixation
一般来说,会话固定可以通过下面几种方式实现。
(1)在URL中注入Session ID,这是最简单的一种方式,当然也最容易被检测到。
(2)用隐藏的表单字节。攻击者可以构造一个很像登录方式的登录表单并设定Session ID,然后诱惑用户登录。
(3)通过跨站脚本用客户端脚本来设定Cookie,如攻击者可以构造一个链接如下:http://www.buybook.com/viewprofile.jsp?p=30。
(4)通过跨站脚本用标签进行设定,如攻击者可以构造一个链接如下:http://www. buybook.com/viewprofile.jsp?p=30。
会话ID(SID):由服务器产生并返回给浏览器的请求,并且在浏览器中存储(通常来说是Cookie),它用来标识浏览器与服务器会话的唯一值。
攻击分析
攻击的整个过程,会话ID是没变过的,所以导致此漏洞。
攻击修复
1、登录重建会话
每次登录后都重置会话ID,并生成一个新的会话ID,这样攻击者就无法用自己的会话ID来劫持会话,核心代码如下。
2、禁用客户端访问Cookie
此方法也避免了配合XSS攻击来获取Cookie中的会话信息以达成会话固定攻击。在Http响应头中启用HttpOnly属性,或者在tomcat容器中配置。