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