指向以javascript://开头的URL的链接是否可以执行任何代码?

指向以javascript://开头的URL的链接是否可以执行任何代码?,javascript,html,xss,Javascript,Html,Xss,我发现我正在维护的软件中存在一个漏洞,用户可以将javascript:和数据:链接放入其他人可以看到的内容中 但是,有一种机制可以预先将http://添加到任何不以[a-z0-9]+://开头的链接href,这基本上可以只添加以javascript://或数据://开头的恶意链接href。我想知道这是一个多大的安全问题,所以我的问题是,有没有办法在单击这些链接时利用这些链接来执行JavaScript代码 我的理解是,javascript://链接只能包含一行javascript注释,因此不能执行

我发现我正在维护的软件中存在一个漏洞,用户可以将
javascript:
数据:
链接放入其他人可以看到的内容中

但是,有一种机制可以预先将
http://
添加到任何不以
[a-z0-9]+://
开头的链接href,这基本上可以只添加以
javascript://
数据://
开头的恶意链接href。我想知道这是一个多大的安全问题,所以我的问题是,有没有办法在单击这些链接时利用这些链接来执行JavaScript代码

我的理解是,
javascript://
链接只能包含一行javascript注释,因此不能执行任何代码。我认为单行注释只能以换行符(
\n
)结尾,但我不确定是否有办法将这样的换行符引入链接href。我尝试了不同的方法,比如
href=“javascript://
警报('test')”
href=“javascript://&&10;警报('test')”
href=“javascript://%0aalert('test')”
和带有
\0
字符的警报('test'),但它们似乎都没有执行任何代码


对于
数据:
URI,我想不可能生成任何以
数据://
开头的有效URI,但可能还有一些浏览器可以利用它?

我在这里提出了一些可能的问题,因为这是一个有趣的挑战。即使这些都不起作用,我想你也可以很容易地让它变得更安全,这是值得的。无论如何,这里有一些有效载荷是我想出的

新线 你说这对你不管用,但在Chrome(
Windows10/69.0.3497.100
)中对我管用。这是最明显的解决办法,也是我能想出的唯一可行办法。也许你试的时候打错了?虽然HTML实体编码不能做到这一点,但简单的URL编码应该。。。如果您的源最终看起来像这样,那么它应该可以工作:

(JSFIDLE PoC)

不完全正则表达式 您说过它必须“以
[a-z0-9]+://
开头,但正则表达式没有涵盖“开始”部分,因此类似这样的内容可以匹配:

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

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

嵌套协议 我不认为这里有很多东西,但它值得一看。而且这是一个你可能没有考虑过的攻击向量。< / P >
视图-source://data:text/html,警报(1);

首先,这不应该执行任何操作,因为它是
查看源代码
。其次,它应该给出一个CORS错误(我认为)。最后,即使它确实执行了,它也会在与您的页面不同的上下文中执行(如果这是他们的目标,他们可能只是链接到恶意网站).所以说来都有点弱。尽管如此,也许还有其他嵌套协议可能会有问题

请求伪造 不完全是XSS,但仍然是一个潜在问题。攻击者可以链接到您网站上的现有页面,例如
https://example.com/account/delete
。如果他们可以控制链接的显示名称,这可能会使它非常令人信服。即使他们不控制显示名称,您也可以创建一些非常混乱的URI在它实际运行的地方(各种编码技术)。你的站点上可能没有这样的URL(做得好!),但这种情况确实经常发生

网络钓鱼/恶意链接 这可能是显而易见的,但重要的是要知道,用户可以创建一个指向复制您站点(或其他站点)外观的站点的链接。这只是允许任意超链接带来的一个普遍问题。如果您的用户群特别容易受此攻击,则许多站点会将外部链接重定向到警告页面(这只需一点js,例如:
onclick=“return confirm('你确定要这么做吗?')”)“
。不过,我不知道这些东西到底有多有效——这只是你看到的东西

结论
我们可能会喋喋不休地谈论一百万件可能会或可能不会导致安全问题的事情。最后,强制执行您希望允许的协议的白名单可能是值得的。您希望人们能够包括像
mailto:
ssh:
slack:
文件:
等链接吗?我会做一个简单的介绍客户端正则表达式,用于从http(s)开始,然后在后端使用URI解析器确认方案确实是http(s),如果不是,则提供警告。这更多是用户体验方面的问题,但如果您担心大多数用户会键入类似“www.example.com”的内容“你可以给他们一个客户端警告,它应该从http(s)开始(或者只是默认情况下)。对于奖金点,也许考虑使用信誉检查API并在URL旁边呈现结果,拒绝任何坏名声的域名。< /P> <代码> HReF= =“JavaScript:(函数)){此处的任何内容都将在当前页面的范围内执行})(“
FWIW,看起来Chrome会清除URL中的换行符,因为访问链接的
.href
属性会产生
”javascript://alert('test')”
。换行符出现在
a.getAttribute('href')中
。还要确保不能在此处添加任何内容“
到href@mplungjan:谢谢,HTML字符已经转义了,您编写的javascript:链接不是以j开头的avascript://Not 确定您是否可以在软件中使用它,但添加一个将使获得
javascript:
链接更难工作(你不应该只依靠它,适当的逃跑更好,但它是一个很好的附加手段