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