我有一个用户帐户“会员中心”,它显示了客户在我公司的所有订阅和会员资格。这是在https://secure.example1.com/membercenter/。
我有另一个网站,它是实际的会员网站。这是在http://www.example2.com/。(每个站点在不同的域上,尽管它是同一个专用服务器。
我想提供对会员网站的轻松登录,而不在链接中包含用户的用户名和密码。
所以我想出的是:
当用户单击其成员资格的“登录”链接时,我创建了他们的用户 ID + unix 时间戳的 md5 哈希,并将其与他们的用户 ID 和时间戳一起添加到数据库表中。
然后我重定向到http://www.example2.com/login?hash= (哈希)。
example2 上的登录脚本获取哈希并在同一个表中查找它。如果散列存在,我会使用与散列一起存储的用户 ID 从客户数据库中检索他们的用户名和密码,并将其传递给站点预先存在的登录函数,然后他们就可以登录了。
当这个哈希登录脚本运行时,它首先删除任何超过 5 分钟的行,然后检查传递的哈希值。如果找到散列,则将用户登录,然后从表中删除使用的散列。这意味着表中永远不会有任何哈希值超过 5 分钟。唯一会(应该)在表中留下任何哈希值的情况是,如果用户在单击链接后以某种方式无法将其从 secure.example1.com 变为 www.example2.com(例如,互联网在右侧出现故障)第二,DNS 问题解决 example2.com 等)。5 分钟到期意味着他们可以坐在那里重新加载重定向的 URL,直到他们进入,或者直到 5 分钟过去。
当用户被重定向时,他们确实看到了哈希值。
每次从 secure.example2.com 中单击登录链接时,都会计算并存储一个新的哈希值。
我的问题是......我错过了一些明显的东西吗?你将如何破解或破解它?我是否只是在我的站点中创建了一个巨大的安全漏洞?
非常感谢蜂巢思维!
编辑:这是对进入 www.example2.com 并使用您的用户名/密码使用表单登录的正常模式的补充。
EDIT2:对 tobyhede 的回应:嗅探哈希。攻击者还必须阻止用户访问 www.example2.com 上的登录脚本,因为哈希一旦使用就会被删除。如果他们能够阻止这种情况,他们还必须在五分钟内使用哈希,否则它将被自动删除。
EDIT3:回复:攻击者生成自己的哈希:黑客必须将这些哈希插入数据库并包含有效的用户 ID(没有用户知道他们的用户 ID)。他们会怎么做?由于哈希只使用一次,然后立即删除,我不相信以下任何攻击都会起作用。