1. Несоответствие между
document.URL
и location
:// При URL https://foo:[email protected]
console.log(location); // выведет: https://portswigger-labs.net/
console.log(document.URL); // выведет: https://foo:[email protected]/
Это создаёт ситуацию когда разработчики часто считают эти значения идентичными и могут использовать неправильное свойство в коде
2. DOM XSS через credentials:
// Уязвимый код на сайте
function getBase(url) {
return url.split(/[?#]/)[0]; // Удаляет query параметры и hash
}
document.write(`<script>const url='${getBase(document.URL)}';</script>`);
// Эксплуатация (в Firefox):
// https://'-alert(1)-'@example.com
Даже если сайт очищает URL от query-параметров и hash части, можно внедрить JavaScript код через credentials часть.
3. DOM Clobbering через credentials:
// URL: https://user:[email protected]
<a href id=x>test</a>
<script>
eval(x.username) // выполнит код 'user'
eval(x.password) // выполнит код 'pass'
</script>
Это приводит к возможности контролировать свойства username/password у HTML элементов, что может привести к DOM Clobbering атакам.
Где применимо:
1. Обход фильтрации:
- Многие WAF и защитные механизмы не проверяют credentials часть URL
- Payload можно "спрятать" так, что он не будет виден в адресной строке
- В Firefox одинарные кавычки не кодируются в credentials части
2. Persistent XSS:
- Если сайт сохраняет document.URL в базу данных
- Если значение позже отображается другим пользователям
- Если значение используется в JavaScript коде
3. DOM Clobbering:
- Возможность влиять на свойства HTML элементов
- Потенциальное влияние на работу JavaScript библиотек
- Возможность обхода некоторых CSP правил
Но:
- Работает только в Chrome и Firefox
- Safari полностью отбрасывает credentials
- Chrome блокирует использование credentials для суб-ресурсов