我需要在登录后保留会话 ID。我的会话 id cookie 被标记为 HttpOnly。这样的设置绝对安全吗?如果我的会话 cookie 是 HttpOnly,攻击者是否有可能执行会话固定攻击?
2 回答
TLDR:是的,在 PHP 和 Firefox 中,可以添加第二个会话 cookie,由于标题中的顺序,它比原来的更受欢迎。也可以,如果有其他功能允许在服务器上设置会话 ID。这取决于应用程序特定的功能。
完整解释
取决于您在网站上拥有哪些其他功能来操纵会话。在极少数情况下,应用程序允许用户通过 HTTP 请求设置会话。例如,通过 GET 参数。
我相信您想知道如果原始会话 ID 设置在带有 HttpOnly 标志的 cookie 中,是否可以固定会话 ID。因此,我对一个正在进行渗透测试的 PHP 应用程序做了一个小测试。令人惊讶的是,您可以通过作为 XSS 注入的 JavaScript 设置新的 PHPSESSID。如果已经存在带有 HttpOnly 标志的 PHPSESSID cookie,它只是将这个放在另一个旁边。就我而言,在 Firefox 中,在我尝试通过 document.cookie = "PHPSESSID=FIXATEDSESSIONID" 设置 PHPSESSID 后,它向服务器发送了以下 Cookie:
Cookie: PHPSESSID=FIXATEDSESSIONID; __utma=139474299.465096418.1547461023.1548839033.1548851774.5; __utmz=139474299.1547461023.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); acceptCookies=true;
所以现在请求中有两个会话 ID。在我的设置中,使用 PHP 5.6.25,服务器使用第一个cookie 来绑定会话。因此,对于 Firefox 和 PHP 5.6.25,我能够通过 JavaScript 固定我的会话 ID (FIXATEDSESSIONID)。原始会话 ID 仍在请求中,但被服务器忽略。请注意,FIXATEDSESSIONID 实际上是我注入的会话 ID。因此没有必要从 PHP 服务器获取合法的会话 ID。
最好将会话 cookie 设置为HttpOnly
,因为它显然使会话更安全。
避免会话固定漏洞的正确方法是在身份验证时为用户创建新会话。
查看关于会话固定的OWASP 文章。它包含有关执行此类攻击的技术的信息。