javascript - 存在漏洞的 JavaScript 函数调用

标签 javascript java jquery security fortify

我的应用程序中有以下 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/

相关文章:

c# - Jquery点击事件在获取json数据后没有触发

jquery - 如何在 Drupal 中包含 Jquery 插件?

javascript - 如何使用 jQuery 从 css 控制动画时间

javascript - 单击时切换按钮背景颜色

javascript - 如何将其应用到 jquerymobile 中的所有页面

java - Java 中的 C 指针等价

java - 在测试自动化中设置保存点并回滚到它时应遵循的最佳实践

java - ListView 中数组适配器的空指针异常。安卓

javascript - Dojo Mobile ComboBox 下拉列表在 iOS8/Safari 中错位

php - 动态加载包含javascript的内容