Уязвимый JavaScript вызов функции - PullRequest
2 голосов
/ 02 февраля 2020

В моем приложении есть следующая функция 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 функция сервлета:

@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;, что может привести к в браузере выполняет вредоносный код.
  • JS функция передает непроверенные данные в функцию перенаправления HTTP в строке window.location.href = resp.redirectTo;. Использование неподтвержденного ввода для управления URL-адресом, используемым в rredirect, может помочь фишинговым атакам.

Может кто-нибудь объяснить, что на самом деле не так с этим перенаправлением вызова window.location.href = resp.redirectTo; и как я могу это исправить?

Может быть, я могу добавить дополнительную проверку ввода на стороне Java?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

JS функция передает непроверенные данные в функцию перенаправления HTTP в строке window.location.href = resp.redirectTo; Разрешение не проверенного ввода для управления URL-адресом, используемым в перенаправлении, может помочь в фишинговых атаках.

Ваш редирект использует значение обратно из вашего get. Вы не можете быть уверены, что URL-адрес, который вы получаете, является URL-адресом, который вы ожидаете. Если ваша /app/ExpiredSession страница будет взломана, вы можете получить вредоносный URL.

В случае предупреждения они предлагают фишинг-атаки , которые могут выдаваться за другой сайт, в попытаться получить учетные данные пользователя (например). В вашем случае, когда вы перенаправляете на другую страницу, вы можете подвергнуться «Обратное табулирование» , где вредоносная страница может выдать себя за ваш сайт и заставить пользователя поверить, что они никогда не покидали вашу страницу.

Существуют различные способы проверки достоверности URL-адреса. Простой способ - сохранить список доверенных URL-адресов или доменов и убедиться, что вы распознаете URL-адрес перед перенаправлением на него.

Более конкретный способ - использовать SSL-пиннинг . Это гарантирует, что вы общаетесь только с теми серверами, которым доверяете, и через SSL (используя https). Это работает путем сохранения отпечатка пальца сертификата SSL и сравнения его с целью запроса. Если они отличаются, то мы предполагаем, что сайт взломан и не должен продолжать выполнение запроса.

Сочетание этих двух значений означает, что вы общаетесь только с доверенными сайтами при выполнении запроса и что вы только перенаправляете на сайты, о которых вы «знаете».


JS функция передает непроверенные данные в функцию перенаправления HTTP по строке window.location.href = resp.redirectTo ;. Разрешение неподтвержденного ввода для управления URL-адресом, используемым в перенаправлении, может помочь фишинговым атакам.

Возможно ввести вредоносный код в URL-адреса, которые можно проверить, запустив

window.location.href = "javascript:alert(1)"

Есть несколько хороших OW ASP предложений о том, как проверить URL-адреса

  • Ввод, начинающийся с / для перенаправления на локальные страницы, небезопасен. //example.org является действительным URL.
  • Ввод, начинающийся с нужного доменного имени, небезопасен. https://example.org.attacker.com допустимо.
  • Разрешены только протоколы HTTP (S). Все другие протоколы, включая JavaScript URI, такие как javascript:alert(1), должны быть заблокированы
  • URI данных, такие как data:text/html,<script>alert(document.domain)</script>, должны быть заблокированы
  • URI, содержащие символы CRLF, могут привести к внедрению заголовка или ответу разделяет атаки и должен быть заблокирован

Вот пример использования регулярного выражения для Javascript, предложенного OW ASP

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. Тем не менее, этот случай разрешается с помощью приведенного выше предложения о наличии списка доверенных доменов. Вы можете увидеть сами здесь

1 голос
/ 04 февраля 2020

Что ж, выполнение на стороне Java может не сработать в этом случае. Рассмотрите эту часть предупреждения: «может помочь фишинговым атакам» - если злоумышленник смог предоставить вредоносную ссылку, вы могли бы перенаправить пользователя на фишинговый сайт (похожий на ваш, но не похожий), который позволяет пользователю вводить свои учетные данные, а затем отправляет запрос на ваш сервер (возможно, даже перенаправление снова). Даже если ваш сервер распознает, что фишинговый сайт уже имел доступ к учетным данным пользователя.

Другая часть предупреждения «может привести к тому, что browser выполнит вредоносный код» (выделение мной) - это уже намекает на код, выполняемый до того, как будет отправлен на ваш сервер, так что вы даже не сможете распознать этот тип атаки там.

Как это исправить? Ну, я не эксперт по JavaScript, но считаю, что "JS функция передает непроверенные данные в функцию перенаправления HTTP" - это означает, что вы должны либо проверять ввод, либо использовать только "предварительно проверенные" URL .

Для получения дополнительной информации смотрите здесь: https://owasp.org/www-project-cheat-sheets/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html

...