重定向到这样的网址是否安全:“ https://example.com/” + userData?

时间:2019-02-28 16:12:10

标签: http-redirect exploit

重定向到我自己域上的url时可以安全使用用户数据吗?

假设我拥有example.com。如果正常使用我的应用程序有时需要我将用户重定向到这样的网址,可以吗?

https://example.com/ + userData

无论如何,是否可以使用它进行漏洞利用并运行javascript?或重定向到完全不同的域?

出于讨论的目的,我想:

  • 忽略目录遍历攻击
  • 仅考虑影响浏览器(而不是example.com服务器)的攻击

您可以假设我完全不对从用户那里收到的参数进行编码。

编辑:澄清-userData始终不会添加到页面中-它仅驻留在网址本身中。

3 个答案:

答案 0 :(得分:5)

comments中所述,此场景似乎无法用于javascript:(或data:,也可以用来执行JavaScript)伪协议。但是,如果example.com在自定义404页面上输出userData,则有可能执行反射的XSS攻击。假设此页面显示错误消息:

<h1>Page 'userData' not found.</h1>

在这种情况下,如果攻击者提交了JavaScript有效负载(例如:<script>alert('xss');</script>),它将在页面上呈现

<h1>Page '<script>alert('xss');</script>' not found.</h1>  

并且该代码可以由访问者执行。可以通过过滤用户数据来防止这种攻击-无论如何都应该清除用户输入。

开放重定向漏洞利用似乎不太可能,因为用户输入已附加到域中,并且漏洞利用尝试应导致404响应。当然,如果还有其他允许任何重定向的本地页面,则攻击者可以在其有效负载中使用它们,例如:

vulnerable/page?url=http://attacker.com

请注意,仅仅是因为我无法确认漏洞利用程序,并不意味着代码不容易受到攻击,具体取决于服务器配置。我们可以通过基于有效和受信任位置的列表过滤用户数据来防止开放重定向攻击。这可能还有助于针对服务器的其他几种攻击,例如目录遍历,文件包含和服务器端请求伪造攻击。

答案 1 :(得分:2)

  1. 这可能是网络钓鱼攻击的重点

攻击者可能会假装从您的网站发送电子邮件,并假装链接(我假设“ jumper.php”是一个页面,其中包含目标网址的单个url参数,其中可能包含用户数据):

要验证您的帐户,请点击此链接: http://example.com/jumper.php?url=http%3A%2F%2Fexample-my.com

在这种情况下,用户将在以http://example.com开头的邮件链接中看到,并可能认为这是指向您网站的有效链接,但实际上,他将被重定向到http://example-my.com,该链接可能受攻击者(看起来很像您的网站)。

  1. 在某些情况下,人们使用javascript进行重定向

如果页面包含这样的代码(php示例):

<script>location.replace(<?= json_encode($userData) ?>);</script>

然后,即使正确地清除了变量,攻击者也可以在http://example.com的上下文中执行任意JavaScript代码,并将其重定向到javascript:...。例如:

要验证您的帐户,请点击此链接: http://example.com/jumper.php?url=javascript%3Aalert%28document.cookie%29

在这种情况下,重定向将转换为

<script>location.replace("javascript:alert(document.cookie)");</script>

和代码javascript:alert(document.cookie)(例如)将在http://example.com的上下文中执行。当然,攻击者可以通过注入任意的javascript代码来做更多的事。

答案 2 :(得分:2)

让我们假设重定向代码是通过添加如下代码(php示例)完成的:header("Location: http://example.com/".$userData);

由于$userData没有以任何方式进行编码,因此实际上攻击者可以访问服务器生成的http响应。例如$userData可能包含类似内容:

"somepage.php\r\nattacker-header:some value\r\n\r\nattacker page body with JavaScript"

尽管大多数http库(包括从5.1.4 AFAIK开始的php)都可以防止这种header injection攻击,并且会产生错误,但是某些旧工具可能会受到攻击。