重定向到我自己的域中的URL时,我可以安全地使用用户数据吗?
假设我拥有example.com
。如果我的应用程序的正常使用需要我有时将用户重定向到这样的网址,这可以吗?
https://example.com/ + userData
有没有这可以用来做一个漏洞利用,并运行javascript例如?或重定向到一些完全不同的域?
出于本次讨论的目的,我想:
您可以假设我根本没有对用户收到的参数进行编码。
编辑:澄清 - 无论如何userData
没有添加到页面 - 它只驻留在网址本身。
正如在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
请注意,仅仅因为我无法确认漏洞并不意味着代码不易受攻击,具体取决于服务器配置。我们可以通过基于有效和受信任位置列表过滤用户数据来阻止开放重定向攻击。这也可能有助于针对服务器的其他几种攻击,例如目录遍历,文件包含和服务器端请求伪造攻击。
攻击者可能会发送假装是您网站邮件的电子邮件并注入相同的链接(我假设“jumper.php”是一个页面,其中包含目标网址的单个url参数,可能包含用户数据):
要验证您的帐户,请点击此链接:http://example.com/jumper.php?url=http%3A%2F%2Fexample-my.com
在这种情况下,用户将看到以http://example.com
开头的邮件链接,并可能认为这是您网站的有效链接,但实际上他将被重定向到可能受攻击者控制的http://example-my.com
(看起来很像您的网站)。
如果页面包含这样的代码(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代码来做更多的事情。
假设重定向代码是通过添加这样的(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
攻击并且会产生错误,但是一些旧的工具可能容易受到攻击。