Cookies 是网站发给用户的,并存在用户的浏览器中的少量数据,里面的数据大多是关于浏览器设置、当前登陆用户的相关数据、用户配置偏好等。高级的Web应用中,一般都是用 cookies 跟踪管理用户会话的,通过对比存储在服务器端和客户端的认证信息,来识别用户身份和登陆状态。登陆后的后续任何一个发给服务器的请求,浏览器都会把cookies放在请求里一起发过去,然后服务器就可以基于cookie里面存储的会话信息识别会话。
下面,我们讨论几个能够允许攻击者劫持有效用户会话的cookie漏洞。
实践
- 浏览器访问应用: http://192.168.150.143/mutillidae/
- 打开 Cookie Manager+ 插件,删除所有cookie(防止跟之前的cookies混淆)。
-
现在,在Mutillidae中,跳转到如下图所示页面:
-
然后我们看到CookieManager插件中多了两条数据,我们双击第一条,如下图所示:
PHPSESID是基于PHP开发的应用的cookie的默认名称。通过查看cookie中这个参数的值,我们发现它可以分别被加密和非加密的方式(HTTP和HTTPS)。这个cookie信息既可以被服务器端读取,也可以通过脚本在客户端读取,如上图所示,发送条件没限制为加密,HttpOnly也没开启,这就意味着这个会话可以被劫持。
总结
在每个渗透测试中,检查cookie配置十分重要,一旦发现配置不当的cookie会话,就意味着我们发现了一个劫持点。
如果一个cookie没有启用HTTPOnly标志位,那么这个cookie就能够被脚本读到,因此,如果这里有一个跨站脚本攻击漏洞,攻击者就能够获取一个有效的会话身份,并且扮演这个有效的身份,在应用中随意的操作。
发送条件如果设置为在加密信道中发送和接收cookie,攻击者基本就没戏了,如果没有设置加密,那么攻击者可以通过中间人攻击,获取明文的cookie信息,进而劫持会话。
其它平台也有默认的cookie名称,如:
- ASP.NET_SessionId是默认的ASP.NET会话cookie
- JSESSIONID是JSP中使用的默认cookie