通过数据包嗅探保护经过身份验证的PHP会话免受会话劫持

时间:2012-06-06 02:09:02

标签: php sessionid session-hijacking

我对保护PHP会话的主题感兴趣,而不使用SSL。

令我惊讶的是,如果一个中间人嗅探用户和服务器之间交换的数据包,即使经过身份验证,也很容易窃取会话。我知道有一些限制损害的策略,例如,在登录/注销时更改sessionid,记录/检查用户系统参数(例如OS,浏览器)。

但是,如果在已经过身份验证且未注销的会话期间(也没有时间暂停),攻击者可以获取会话ID,那么他可以轻松地劫持会话(就我而言)了解问题)。

我想到了一个可能的解决方案,在加密的登录验证过程中,服务器可以向客户端发送随机会话密码。会话密码仅在该登录会话期间有效。因此,在该会话期间交换的每条消息都必须使用会话密码进行签名(例如MD5(会话密码+消息内容))。

问题是否已解决?假设攻击者无法对初始登录交换进行加密分析,这种方法有哪些缺点?

2 个答案:

答案 0 :(得分:3)

您提出的“签名”解决方案需要客户端行为 - 因此您需要一个可以进行签名的客户端应用程序。

如果您正在编写Flash / Java applet / Unity或任何这些插件,那么您可以按照您的计划进行操作,因为您可以更密切地控制客户端并添加例程来进行签名。

但是我假设您在不使用插件的情况下将HTML页面发送到浏览器?如果是这样,你有两个选择,真的。因为它内置在浏览器中,所以它是SSL(你要排除它)。第二个是Javascript。为了最大限度地提高安全性,您需要以某种方式模仿SSL,包括加密(公共)密钥/ algorythm的客户端存储(以便它们永远不会与消息一起传播)。您希望尽可能接近公钥/私钥+握手SSL - 这绝非易事。正如sarnold所建议的那样,你需要一个强大的加密密钥。查看http://www.jcryption.org/以获取示例 - 其他人使用Google进行搜索。

如果这有点过分,你最可行的解决方案可能是使用JS协商一个更简单的加密算法:你发送一个“密钥”,在浏览器的cookie中存储“密钥”,所有通信都通过AJAX和您可以基于该密钥创建更简单的签名机制(可能还有客户端在初始握手期间与您共享的另一个变量)。任何不解码或匹配密钥的东西,然后杀死整个会话并重新开始。


在他的回答中,sarnold有一个很好的观点,即要避免使用md5和SHA-1;有些人甚至认为SHA256会为今天的计算机提供支持,但考虑到你需要在JS中实现一个解决方案,为了提高速度,你可能会像md5那样“狡猾地”(我的类比)。因此,您最好的防御措施是准确记录和强力/错误检测。任何到达乱码的消息(您可以在任一端检查)都应该被记录和监控。太多的失败和IP地址被禁止 - 并继续记录。

答案 1 :(得分:2)

你想使用类似HMAC而不是更简单的MD5的东西 - 并且你想要使用SHA256或更大版本,因为已知MD5存在弱点并且SHA-1开始感到虚弱太

但即使有了这些更改,您的方案仍然容易受到replay attacks的影响,攻击者可以一遍又一遍地重新发送请求,并且您的服务器每次都会很乐意重新执行它。如果它只是发布最新海滩旅行的照片,但是如果它发送1000美元小马的购买请求,那么这将是一个没什么大不了的,有人将会收到比他们预期的更多的小马。

因此,您需要在协议中添加nonce

可能存在其他问题 - 毕竟,在SSL的三次迭代之后,TLS现在处于1.2版本。坚持使用TLS并感到高兴。