我的静态分析器标记了以下 XSS 错误。我想了解是否可以将恶意代码注入此参数,导致注入的值被解释为 JavaScript(可能通过过早终止 JavaScript 字符串文字),或者导致注入的值重定向到其他地方具有被服务器拒绝的值的预期目的地。
<c:url var="myUrl" value="/somepage.jsp">
<c:param name="myParam" value="${param.userSuppliedParameter}"/>
</c:url>
<script type="text/javascript">
<!--
document.location = "${myUrl}";
//-->
</script>
值得注意的是,如果 url 参数被简单地更改并且其他 URL 参数将被忽略,服务器将正确处理重定向 URL。我主要感兴趣的是确定攻击者是否可以使用 URL 查询参数将可执行 JavaScript 注入此页面userSuppliedParameter
,以及攻击者是否有可能将 document.location 评估为除 /somepage.jsp 之外的任何任意任意值网址参数。例如:http://foo.com/bar.jsp?userSuppliedParam=SOME_POTENTIALLY_MALICIOUS_PAYLOAD
。我不关心注入到目标页面的值,或者目标页面解释 URL 的方式。
<c:url>
URL 应该对 URL 参数进行编码,这将阻止某人添加“@”符号,否则会导致前面的字符被解释为基本身份验证参数。否则,这将暴露一个开放重定向漏洞。
<c:url>
还应该对双引号进行编码,这将防止有人终止 JavaScript 字符串文字。
我基于RFC和 JavaDoc for URLEncoder对 url 编码的假设。
还有其他可能的滥用吗?