假设您有一个网站,并且您正在使用某个returnUrl URL参数将用户重定向回他登录或编辑用户区域中某些记录的页面。有没有一些标准的方法来检查returnUrl是否与web应用程序位于同一台服务器上?
到目前为止,我已经了解到,atacker可以通过两种方式将用户重定向到其他地方,并且可以执行以下操作来防止这些攻击:
http(s)://或ftp:////evil.com或//numeric_ip_address之类的内容,并且它也会将用户重定向到服务器之外--在这里,您仍然可以检查URL是否以//开头。还有其他方法来编码URL地址吗?如果只检查前两种情况,是否可以确保参数不会被滥用?
发布于 2010-11-12 16:02:47
您可以这样做的一种方法是在参数传递给用户时对其进行加密,该参数具有存储在服务器上的密钥(同时为了更好的保护,请考虑添加一个HMAC)。然后,当用户提交表单时,解密参数(如果使用HMAC )并使用它重定向用户。
我见过一些情况,即URL只是被混淆了(base64编码等)。这可能会阻止偶然的攻击者,但我不会依赖它,因为一个坚定的攻击者很可能会想出所使用的方案。
发布于 2010-11-12 15:03:00
您可以将您的网站的前缀添加到url中,这样它们就可以转到:
example.com/login.php?returnurl=profiles/home.php
在页面中,您将让它返回到http://example.com/并添加返回的URL。(http://example.com/RETURNURLHERE)
发布于 2012-02-19 17:11:10
攻击用户/浏览器或混淆URL/重定向的方法有很多。疯狂的方式会使你的大脑受伤,让你问为什么会起作用?!(请参阅:http://code.google.com/p/browsersec/)一般来说,在验证输入时,不要试图修复数据,如果数据不是您所期望的,或者不是您所需要的格式,则将其丢弃。记住默认拒绝,这只是另一个例子。
与任何事情一样,您如何实现这一点,取决于您的需求。在处理重定向时,您还应该注意实现缺陷,这些漏洞还可能进一步打开漏洞,如HTTP响应拆分、头注入等。
我通常建议将目标白名单和请求签名相结合(使用HMAC,类似于Rory的建议)。在预先形成请求签名时,我喜欢使目标在URI中可见。例如:
http://yoursite.com/login.php?returnurl=welcome.php&hash=yourlonghashhere
这使得用户可以在请求应该去的地方有一点可行性,并且允许更精明的用户可能注意到自己的钓鱼或其他攻击。
当重定向即将发生时:
如果验证过程的任何步骤失败,要么重定向到默认/主页,要么拒绝请求。
以下是更多的资源:
https://security.stackexchange.com/questions/238
复制相似问题