保护网站免受网络钓鱼攻击

信息安全 应用安全 Web应用程序 渗透测试 网址重定向
2021-09-07 04:06:11

假设您有一个网站,并且您正在使用一些returnUrlURL 参数将用户重定向回他在登录或编辑用户区域中的某些记录后所在的页面。是否有一些标准方法可以检查是否returnUrl与 Web 应用程序位于同一服务器上?

到目前为止,我发现,atacker 可以通过两种方式将用户重定向到其他地方,并且可以执行以下操作来防止这些攻击:

  1. 攻击者在参数 (http://evil.com/) 中提供整个 URL - 在这里可以检查参数是否包含http(s)://ftp://
  2. 如果缺少协议,浏览器会自动添加协议,因此攻击者可以提供类似//evil.comor//numeric_ip_address的内容,它也会将用户重定向到服务器之外 - 在这里您仍然可以检查 URL 是否以//

还有其他方法可以对 URL 地址进行编码吗?如果我只检查前两种情况,我能确定参数不会被滥用吗?

4个回答

您可以解决此问题的一种方法是加密参数,因为它使用存储在服务器上的密钥传递给用户(为了更好的保护考虑添加HMAC)。然后当用户提交表单时,解密参数(如果使用,检查 HMAC)并使用它来重定向用户。

我见过 URL 只是被混淆的情况(base64 编码等)。这可能会阻止临时攻击者,但我不会依赖它,因为坚定的攻击者可能会制定出所使用的方案。

您可以将您网站的前缀添加到 url 中,以便他们转到:

example.com/login.php?returnurl=profiles/home.php

在页面中,您可以让它返回到http://example.com/并添加返回 URL。(http://example.com/RETURNURLHERE)

很多方法可以攻击用户/浏览器或混淆 URL/重定向。疯狂的方式会让你的大脑受伤,让你问为什么这样会起作用?!(见:http ://code.google.com/p/browsersec/ )一般来说,在验证输入时,不要试图修复数据,如果它不是你所期望的或者不是你需要的格式,把它扔掉离开。记住默认拒绝,这只是另一个例子。

像任何事情一样,您如何实现这一点取决于您的要求。在处理重定向时,您还应该注意实现缺陷,这些缺陷也可能引发更多漏洞,例如 HTTP 响应拆分、标头注入等。

我通常建议结合使用目标白名单请求签名(使用 HMAC,类似于 Rory 的建议)。在执行请求签名时,我喜欢让目标在 URI 中可见。例如:

http://yoursite.com/login.php?returnurl=welcome.php&hash=yourlonghashhere

这允许用户对请求应该去哪里有一点可行性,并且还允许更精明的用户自己注意到网络钓鱼或其他攻击。

当重定向即将发生时:

  1. 根据哈希验证“returnurl”
  2. 验证“returnurl”是否已列入白名单
  3. 然后执行重定向。

如果验证过程的任何步骤失败,请重定向到默认/主页或拒绝请求。

这里还有一些资源:

  1. 从 URL 中删除所有不必要的信息(例如http://,站点名称等)。如果您有多个选项(例如五个站点),请使用它们的索引。
  2. 使用服务器端秘密盐计算剩余内容的哈希值并将其添加到前面(或其中的一部分 - 它越短,成功碰撞攻击的危险就越大) returnUrl
  3. 收到 后returnUrl,检查哈希是否有效。如果没有,拒绝。
  4. 添加回所有缺失的信息并重定向。

此外,一些重定向可能遵循一个常见模式,您只需插入一些参数。在这种情况下,您甚至可能不需要哈希。

例如:代替

returnUrl=http://www.myfifthsite.com/common/webpage/profile?user=lserni

你可以煮

returnUrl=5-5-lserni

表示第五个站点,第 5 个允许的重定向模式,该模式只有一个参数,其值为用户名:

网站: ... 5 => ' http://www.myfifthsite.com ' ...

站点 #5 的模式(当然身份验证不会被覆盖!): 5 => '/common/webpage/profile?user=$1' 6 => '/common/webpage/messages?user=$1'

攻击者可以枚举所有允许的站点和模式编号,但只会获得您允许的站点的有效 URL。

所以从某种意义上说,这种方式你根本不需要检查任何东西。URL 将始终自动有效(即使某些可能仍需要身份验证 cookie)。