我的应用程序中有以下 JavaScipt 函数,它会在一分钟后将用户重定向到登录页面:
(function redirect_expired() {
$j.get('/app/ExpiredSession', function (resp) {
if (resp && resp.redirectTo) {
window.location.href = resp.redirectTo;
}
});
setInterval(redirect_expired, 60 * 1000);
})();
以及相关的 Java servlet 函数:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
PrintWriter pw = resp.getWriter();
resp.setContentType("application/json");
if (req.getSession != null && req.getSession().getAttribute("authorizationBean") == null) {
pw.print("{\"redirectTo\": \"" + req.getContentPath() + "\"}");
} else {
pw.print("{\"redirectTo\": \"\"}");
}
pw.close();
}
当我使用 Fortify 扫描我的应用程序时,我在 JavaScript 函数中发现了以下漏洞:
lambda()
方法通过window.location.href = resp.redirectTo;
向 Web 浏览器发送未经验证的数据,这可能会导致浏览器执行恶意操作代码。- JS 函数将未经验证的数据传递到
window.location.href = resp.redirectTo;
行上的 HTTP 重定向函数。允许未经验证的输入来控制 rredirect 中使用的 URL 可能有助于网络钓鱼攻击。
有人可以向我解释一下这个重定向调用实际上有什么问题window.location.href = resp.redirectTo;
以及如何修复它吗?
也许我可以在 Java 端添加一些额外的输入检查?
最佳答案
JS function passes unvalidated data to an HTTP redirect function on line window.location.href = resp.redirectTo;Allowing unvalidated input to control the URL used in redirect can aid phishing attacks.
您的重定向正在使用从 get
返回的值。您无法确定您收到的 url 是您期望的 url。如果您/app/ExpiredSession
页面被泄露,您可能会收到恶意 URL。
在出现警告的情况下,他们建议 phishing attacks它可能冒充另一个站点,试图获取用户凭据(例如)。在您的情况下,当您重定向到不同的页面时,您可能会受到 "Reverse Tabnabbing" 的约束。恶意页面可能冒充您的网站并欺骗用户,让他们相信他们从未离开过您的页面。
您可能需要使用不同的方法来验证 URL 是否可信。一个简单的方法是存储受信任的 URL 或域的列表,并在重定向到该 URL 之前检查您是否识别该 URL。
更具体的方法是使用 SSL pinning 。这将确保您仅与您信任的服务器通过 SSL(使用 https)进行通信。这是通过保存 SSL 证书的指纹并将其与请求的目标进行比较来实现的。如果它们不同,那么我们认为该网站已受到威胁,不应继续请求。
两者的结合意味着您在发出请求时仅与受信任的站点通信,并且仅重定向到您“知道”的站点。
JS function passes unvalidated data to an HTTP redirect function on line window.location.href = resp.redirectTo;. Allowing unvalidated input to control the URL used in redirect can aid phishing attacks.
可以将恶意代码注入(inject)到网址中,您可以通过运行来测试
window.location.href = "javascript:alert(1)"
有一些不错的OWASP suggestions on how to validate urls
- 以/开头的重定向到本地页面的输入不安全。
//example.org
是有效的网址。 - 以所需域名开头的输入不安全。
https://example.org.attacker.com
有效。 - 仅允许 HTTP(S) 协议(protocol)。所有其他协议(protocol),包括 JavaScript URI,例如
javascript:alert(1)
应该被阻止 - 数据 URI,例如
data:text/html,<script>alert(document.domain)</script>
应该被阻止 - 包含 CRLF 字符的 URI 可能会导致 header 注入(inject)或响应 split 攻击,应予以阻止
这里是 OWASP 建议的使用 Javascript 正则表达式的示例
var validateUrl = new RegExp(/^((((https?|ftps?|gopher|telnet|nntp):\/\/)|(mailto:|news:))(%[0-9A-Fa-f]{2}|[-()_.!~*';/?:@&=+$,A-Za-z0-9])+)([).!';/?:,][[:blank:|:blank:]])?$/)
var url = 'http://google.com'
if (url.match(validateUrl)) {
console.log('Redirecting to', url)
} else {
// Do not do anything with the url variable here, executing it could be dangerous
console.log('Not a valid url')
}
此正则表达式将防止上述情况,但 https://example.org.attacker.com
的情况除外。 。然而,这种情况可以通过使用上述拥有受信任域列表的建议来解决。 You can see for yourself here
关于javascript - 存在漏洞的 JavaScript 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60027468/