简单地解释一下图10-7所示的流程。
➊ 攻击者Bob以一个合法的用户身份登录www.buybook.com。
➋ 服务器与Bob建立了一个会话,sessionid为1234567(这里只是一个示例,大家不要在乎sessionid的位数对不对)。
➌ Bob构造了一个URL:http://www.buybook.com/login.jsp?sessionid=1234567,发给了受害者Alice。
➍ Alice不小心打开此链接进行了登录。
➎ Alice输入她的合法用户名和密码,注意,由于此时的sessionid预先已经被Bob设置为1234567了。
➏ 这时Bob如果输入http://www.buybook.com/viewprofile.jsp?sessionid=1234567,就可以看到Alice的个人信息(profile)了,因此sessionid此时就是代表了Alice。
一般来说,会话固定可以通过下面几种方式实现。
(1)在URL中注入Session ID,这是最简单的一种方式,当然也最容易被检测到。
(2)用隐藏的表单字节。攻击者可以构造一个很像登录方式的登录表单并设定Session ID,然后诱惑用户登录。
(3)通过跨站脚本用客户端脚本来设定Cookie,如攻击者可以构造一个链接如下:http://www.buybook.com/viewprofile.jsp?p=30<script>document.cookie="sessionid=1234567";</script>。
(4)通过跨站脚本用<meta>标签进行设定,如攻击者可以构造一个链接如下:http://www. buybook.com/viewprofile.jsp?p=30<meta http-equiv=Set-Cookie content ="sessionid=1234567">。
上面两个攻击都是关于会话的,那么到底什么是会话呢?请看图10-8。
首先介绍以下几个名词。
会话ID(SID):由服务器产生并返回给浏览器的请求,并且在浏览器中存储(通常来说是Cookie),它用来标识浏览器与服务器会话的唯一值。
我们通过SID的名字就可以基本判定应用服务器和编程语言是什么,如PHPSESSID (PHP)、JSESSIONID(J2EE)、CFID& CFTOKEN(ColdFusion)、ASP.NET_SessionId (ASP.NET)等。所以我们推荐把默认的SID的名字换成大众一点的名字,如ID。为了防止暴力破解,SID必须有一定的长度,它的长度至少要128位(16字节)。此外,SID还必须是不可预测的(随机的),来防止预测攻击(我们在下面的章节中会讲到如何用攻击来检测SID是否具有足够的随机性),这就需要一个好的随机数产生器(PRNG)。
Cookie:指浏览器客户端用来存储SID的内存或者文件。
会话内存分配:在服务器端存储来自浏览器请求的一些特殊值,如用户名等信息,它和SID是相关联的。
会话:就是指图10-8的整个过程。
下面我们看看具体的过程。
➊ 用户通过浏览器访问一个应用服务器,起始的时候用户发给服务器的请求并没有任何会话ID。
➋ 当服务器收到用户发过来的请求时发现,该请求没有会话ID,于是它会产生一个新的唯一会话ID,并且在服务器端分配内存,返回给浏览器,同时在应答中通过set-cookie在HTTP header中设置该会话ID。
➌ 浏览器收到了含有被设置Cookie的应答,于是它将定义在HTTP header中的会话ID保存在Cookie中。
➍ 此后,每次浏览器向该服务器发送请求时,都会在请求的HTTP header中附上"cookie:"。
➎ 服务器收到来自浏览器的请求,如果该请求含有合法的会话ID,它就会在会话内存中寻找与此会话ID对应的对象/值。
会话一般都有有效期限,通常是30分钟,会话过期以后,服务器会檫除相应的分配内存。一般来说,会话中保存如图10-9所示的内容。
转载自:http://blog.sina.com.cn/s/blog_477071c50102vj0v.html