Concealing payloads in URL credentials
1. Несоответствие между document.URL и location:
// При URL https://foo:bar@portswigger-labs.net
console.log(location); // выведет: https://portswigger-labs.net/
console.log(document.URL); // выведет: https://foo:bar@portswigger-labs.net/
Это создаёт ситуацию когда разработчики часто считают эти значения идентичными и могут использовать неправильное свойство в коде
2. DOM XSS через credentials:
// Уязвимый код на сайте
function getBase(url) {
return url.split(/[?#]/)[0]; // Удаляет query параметры и hash
}
document.write(`const url='${getBase(document.URL)}';`);
// Эксплуатация (в Firefox):
// https://'-alert(1)-'@example.com
Даже если сайт очищает URL от query-параметров и hash части, можно внедрить JavaScript код через credentials часть.
3. DOM Clobbering через credentials:
// URL: https://user:pass@example.com
test
eval(x.username) // выполнит код 'user'
eval(x.password) // выполнит код 'pass'
Это приводит к возможности контролировать свойства 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 для суб-ресурсов
1. Несоответствие между document.URL и location:
// При URL https://foo:bar@portswigger-labs.net
console.log(location); // выведет: https://portswigger-labs.net/
console.log(document.URL); // выведет: https://foo:bar@portswigger-labs.net/
Это создаёт ситуацию когда разработчики часто считают эти значения идентичными и могут использовать неправильное свойство в коде
2. DOM XSS через credentials:
// Уязвимый код на сайте
function getBase(url) {
return url.split(/[?#]/)[0]; // Удаляет query параметры и hash
}
document.write(`const url='${getBase(document.URL)}';`);
// Эксплуатация (в Firefox):
// https://'-alert(1)-'@example.com
Даже если сайт очищает URL от query-параметров и hash части, можно внедрить JavaScript код через credentials часть.
3. DOM Clobbering через credentials:
// URL: https://user:pass@example.com
test
eval(x.username) // выполнит код 'user'
eval(x.password) // выполнит код 'pass'
Это приводит к возможности контролировать свойства 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 для суб-ресурсов