Session劫持与Session-ID的安全长度


出处:http://ourjs.com/detail/54f3f638232227083e00003b

Session劫持

Session劫持从Web Session控制机制处发动攻击,通常是对Session令牌管理的剥夺。
因为HTTP通信使用许多不同的TCP连接,Web服务器需要一个方法来识别每个用户的连接。最有用的方法是当一个客户端成功认证后,该Web服务器向该客户端浏览器发送令牌。Session令牌通常由可变长度的字符串组成,并且它可以以不同的方式存储,如在URL中,在HTTP请求的cookie报头中(request header),或在HTTP请求中的其它报头中,或者在HTTP请求的主体中。

Session劫持攻击通过窃取或预测有效的Session令牌来获得未经授权Web服务器访问权限。

示例

例1 Session 代理人劫持

在这个例子中,我们可以看到,第一个攻击者使用代理来捕捉一个有效的Session令牌称为“SessionID”,然后他使用该有效Session令牌获得未经授权的Web服务器访问权限。
例2  跨站点脚本攻击

攻击者可以通过在客户端上运行恶意代码来获取Session令牌。这个例子说明了如何攻击者可以利用XSS攻击窃取Session令牌。如果攻击者发送恶意的JavaScript代码到受害人访问网站中或当受害者点击链接时,JavaScript将运行攻击者的注入脚本。如图中所示,它可以显示当前Sessioncookie的值;使用相同的技术则可能将此Session发送给攻击者。
<SCRIPT>alert(document.cookie);</SCRIPT>
注* 防止Cookie被盗请参见: 提高NodeJS网站的安全性:Web服务器防黑客攻击技巧

Session ID的安全长度

Session ID应至少为128位长,以防止蛮力Session猜测攻击。
在WebLogic中部署中描述到应指定至少给Session ID指定128位的长度。较短的Session ID使应用程序容易遭受蛮力Session猜测攻击。如果攻击者猜测到一个身份验证的用户Session ID,他可以接管用户的Session。
猜测有效Session ID所需时间的预测公式:
(2^B + 1) / (2 * A * S)
其中:
  • B是Session ID的位数(字节位数)
  • A是攻击者可以每秒尝试数
  • S是有效的Session ID数量,及在任何给定时间内被猜到的数目
如果攻击者操纵数千个僵尸计算机,他们可以尝试每秒猜测数万个SessionID这是合理的。如果该网站的人气很高,访问量很大,这种高流量的猜测可能在一段时间内被忽视。
上有效的Session ID是提供给被猜出的数量的下限是有活性的网站上,在任何给定时刻的用户的人数。然而,放弃自己的Session,而不会记录任何用户将增加这个数字。 (这是有一个短期活动Session超时许多很好的理由之一。)
有64个字节位的Session ID。对于一个大型网站,假设攻击者可以每秒尝试10000次的猜测,并且当前存在10000个有效的Session ID。基于这些假设,攻击者成功地猜测到有效Session ID的时间将小于4分钟。
现在假设一个128个字节位的Session ID。同样是一个访问量非常大的网站,攻击者可能会尝试每秒10000次的猜测与可供猜到10000个有效的Session ID。根据这些假设,攻击者在预期的时间内成功地猜出一个合法的Session ID将大于292年。