javascript - 可以指向以 javascript ://execute any code? 开头的 URL 的链接吗

标签 javascript html xss

我在我维护的软件中发现了一个漏洞,用户可以在其中放置 javascript:data:链接到其他人将看到的内容。

但是,有一种机制可以在 http:// 之前添加任何不以 [a-z0-9]+:// 开头的链接 href ,这基本上可以只添加以 javascript:// 开头的恶意链接 href。或 data:// .我想知道这是一个多大的安全问题,所以我的问题是,是否有任何方法可以利用此类链接在单击它们时执行 JavaScript 代码?

我的理解是javascript:// link 只能包含 JavaScript 一行注释,因此不能执行任何代码。我想单行评论只能以换行符( \n )结束,但我不确定是否有办法将这样的换行符带入链接 href。我尝试了不同的方法,比如 href="javascript:// alert('test')" , href="javascript://
alert('test')" , href="javascript://%0aalert('test')"和一个 \0字符,但它们似乎都没有执行任何代码。

对于 data: URI,我想不可能组成任何以 data:// 开头的有效 URI , 但也许仍然有一些浏览器可以以某种方式利用它?

最佳答案

我在这里提出了一些可能的问题,因为这是一个有趣的挑战。即使这些都不起作用,我认为您可以很容易地使它更安全,并且值得高枕无忧。无论如何,这是我想出的一些有效负载。

换行

你说这对你不起作用,但它在 Chrome 中对我有用 ( Windows 10/69.0.3497.100 )。这是最明显的变通方法,也是我能想到的唯一可行的变通方法。也许你在尝试时打错了字?虽然 HTML 实体编码不会这样做,但简单的 URL 编码应该...如果您的源最终看起来像这样,那么它应该可以工作:

<a href="javascript://%0aalert(document.location)">xss test</a> (jsfiddle PoC)

不完整的正则表达式

您说它必须“以 [a-z0-9]+:// 开头,但该正则表达式不包含“开始”部分,因此这样的内容可以匹配:

javascript:alert(1);//abc://foo.bar

你可能有类似 ^[a-z0-9]:\/\/ 的东西或者正在使用包装“startsWith()”或类似语言的语言。值得一提。

嵌套协议(protocol)

我认为这里的内容不多,但值得一看。这是您可能没有考虑过的攻击媒介。

view-source://data:text/html,<script>alert(1);</script>

首先,这不应该执行任何操作,因为它是 view-source .对于两个,它应该给出一个 CORS 错误(我认为)。最后,即使它确实执行了,它也会在与您的页面不同的上下文中执行(如果这是他们的目标,他们可能会链接到恶意网站)。所以周围有点虚弱。话虽这么说,也许还有其他嵌套协议(protocol)可能会出现问题。

请求伪造

不完全是 XSS,但仍然是一个潜在的问题。攻击者可能能够链接到您网站上的现有页面,例如 https://example.com/account/delete .如果他们可以控制链接的显示名称,这可能会很有说服力。即使他们不控制显示名称,您也可以创建一些非常困惑的 uri 来掩盖它的实际去向(各种编码技术)。您的网站上可能没有任何类似的 URL(干得好!),但它确实经常发生。

网络钓鱼/恶意链接

这可能是显而易见的,但请务必注意,用户可以链接到复制您网站(或其他网站)外观的网站。这只是允许任意超链接带来的普遍问题。如果您的用户群特别容易受到此影响,许多网站会将外部链接重定向到警告页面(这可以像一点 js 一样简单地完成,例如:onclick="return confirm('you sure you want to do that?')"。虽然,我不知道这些东西到底有多有效 -这只是你看到的东西。

结论

可能有一百万种我们可以喋喋不休地说出来的事情可能会或可能不会导致安全问题。最后,强制执行您想要允许的协议(protocol)的白名单可能是值得的。您是否希望人们能够包含像 mailto: 这样的链接? , ssh: , slack: , file: , ETC?我会做一个以 http(s) 开头的客户端正则表达式,然后在后端使用 URI 解析器来确认该方案确实是 http(s),如果不是,则显示警告。这更像是一个用户体验方面的问题,但如果您担心大多数用户会输入类似“www.example.com”的内容,您可以给他们一个客户端警告,告诉他们它应该以 http(s) 开头(或者只是默认情况下有它)。对于奖励积分,或许可以考虑使用信誉检查 API 并在 url 旁边显示结果,拒绝任何信誉不佳的域。

关于javascript - 可以指向以 javascript ://execute any code? 开头的 URL 的链接吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52851723/

相关文章:

security - 如果使用HTTPOnly cookie,是否需要CSRF中间件?它应该是基于 session 的吗?

javascript - 跨站点 AJAX 请求

javascript - 对象格式化 - .map 正在删除我的第一行

javascript - CSS 否定 : Displaying specific elements in a hidden Element?

php - PHP 和 Javascript 之间的通信

python - 如何解码html十六进制元素?

javascript - ZeroClipboard 在 FireFox 中损坏

javascript - 如何在ajax调用中传递特殊字符

javascript - 如何自动化这个 slider ?

asp.net - 我应该如何将评论存储在数据库中,以便我可以有效地将它们作为 html 文本显示在页面上?