Focus on Android & Web Security

04月 27

会话固定攻击

会话固定也是会话劫持的一种类型。会话劫持是攻击者偷走受害者与服务器建立链接的会话,而会话固定是攻击者事先建立一个会话,然后诱使受害者使用此会话进行登录,如图10-7所示。

请输入图片描述

简单地解释一下图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所示的内容。
请输入图片描述

02月 02

Panda 项目更新

Panda上周更新了一次,今天把更新的部分写一下

上周的commit 刚好1024~看他们也很辛苦~

不过我的一个issue还没回复,另外的一个issue fix #37bug~

阅读全文 >>