跳到主要内容

会话管理不善

在某些Web应用程序中,会发行会话ID(用于识别用户的信息),并进行会话管理。如果会话ID的发行和管理存在缺陷,恶意人员可能会非法获取登录中用户的会话ID,伪装成该用户进行访问。这种利用问题的攻击方法被称为“会话劫持”。

此外,除了猜测和窃取之外,还有一种针对会话管理缺陷的攻击方法,称为“会话ID固定化(Session Fixation)”。恶意人员会事先准备会话ID,通过某种方法将其发送给用户。用户在不知情的情况下输入密码等登录,可能会导致这个问题。如果恶意人员成功进行这种攻击,他们可以使用事先准备好的会话ID,冒充用户访问网站。

可能发生的威胁

如果针对会话管理缺陷的攻击成功,攻击者可能会冒充用户,非法执行用户本人被授权的操作。具体来说,可能会发生以下威胁:

  • 仅登录用户可使用的服务的滥用

    • 非法转账、用户无意的商品购买、用户无意的退会处理等
  • 仅登录用户可编辑的信息的篡改、新增注册

    • 各种设置的非法更改(管理员界面、密码等)、在论坛上发布不当内容等
  • 仅登录用户可查看的信息的查看

    • 非法查看非公开个人信息、非法查看Web邮件、非法查看社区会员专用论坛等

需要注意的网站特征

无论运营主体或网站的性质如何,都需要关注具有登录功能的网站。对于在登录后进行支付处理等重要操作的网站,由于攻击造成的损失较大,需要特别注意。

  • 涉及金钱处理的网站

    • 网上银行、网上证券、购物、拍卖等
  • 处理非公开信息的网站

    • 求职网站、社区网站、Web邮件等
  • 其他具有登录功能的网站

    • 管理员界面、会员专用网站、日记网站等

根本解决方法

使会话ID难以预测

如果会话ID是基于时间信息等简单算法生成的,那么它的值很容易被第三方预测。如果恶意人员可以预测到用户登录时发行的会话ID的值,他们就可以使用该会话ID冒充用户访问本来只有用户才能访问的网站等。请使用加密伪随机数生成器等算法生成难以预测的会话ID。

使用提供会话管理功能的Web应用程序服务器产品时,只要使用该产品提供的会话管理功能,就不需要自己生成会话ID。建议使用这些Web应用程序产品,而不是自己构建会话管理功能。

不要将会话ID存储在URL参数中

如果将会话ID存储在URL参数中,用户的浏览器会通过Referer发送功能将包含会话ID的URL发送到链接目标站点。如果恶意人员获取到这个URL,会话劫持就会发生。请将会话ID存储在Cookie中,或者使用POST方法的hidden参数进行传递。

另外,有些Web应用程序服务器产品在用户拒绝接受Cookie时会自动将会话ID存储在URL参数中。请考虑通过更改产品设置等方法来禁用此类功能。

为使用HTTPS通信的Cookie添加secure属性

网站发行的Cookie有一个名为secure属性的设置项,设置了这个属性的Cookie只在HTTPS通信中使用。如果Cookie没有secure属性,那么即使是在HTTPS通信中发行的Cookie也会在未加密的HTTP通信中使用,这样在HTTP通信的窃听过程中,Cookie信息可能会被非法获取。请确保为使用HTTPS通信的Cookie添加secure属性,并且在使用HTTP通信的Cookie时发行与HTTPS发行的Cookie不同的内容。

在登录成功后开始新的会话

有些Web应用程序在用户登录前(例如开始浏览网站时)就发行会话ID并开始会话,然后在登录后继续使用该会话。然而,这种实现可能容易受到会话ID固定化攻击。为避免这种实现,请在登录成功后开始新的会话(使用新的会话ID进行会话管理)。此外,在开始新会话时,请使现有的会话ID失效。这样,恶意人员将无法使用他们事先获得的会话ID访问用户新登录的会话。

在登录成功后发行与现有会话ID不同的秘密信息,并在每次页面跳转时检查其值。

除了会话ID之外,在登录成功时创建秘密信息并将其设置到Cookie中,在所有页面中检查这个秘密信息与Cookie的值是否匹配。请注意,在创建此秘密信息时,采用与前述解决方案中“使会话ID难以预测”的生成算法相同,或使用加密处理。 然而,在以下情况下,本措施不是必需的:

  • 采用上述根本解决方案“在登录成功后开始新的会话”
  • 在登录成功后才发行会话ID,而不是在登录前发行会话ID的Web应用程序的情况

保险措施

不要将会话ID设为固定值

如果为每个用户发行的会话ID是固定值,那么一旦这些信息被攻击者获取,攻击者将能够在任何时间无视时间的推移而实施会话劫持。请确保为每个用户的登录都发行新的会话ID,而不是使用固定值。

注意设置将会话ID存储在Cookie中时的有效期限

Cookie会在浏览器中保留直到其有效期限过期。因此,如果攻击者利用浏览器的漏洞或使用其他方法窃取Cookie,他们可能窃取在那个时刻存储在浏览器中的Cookie。当发行Cookie时,请注意设置有效期限。例如,将Cookie的有效期限设置为较短的时间,以防止Cookie在浏览器中保存超过必要的时间。

另外,如果不需要在浏览器中保留Cookie,您可以省略有效期限设置(expires=),使得在浏览器关闭后发行的Cookie被销毁。然而,此方法可能无法达到预期效果,因为如果用户没有关闭浏览器而继续使用,Cookie将不会被销毁。