PDA

Просмотр полной версии : Обход защиты от CSRF посредством XSS


eclipse
05.05.2011, 22:18
В этой статье я хочу рассказать о том, как можно обойти защиту от CSRF.

Конкретизируя скажу, метод защиты который будем обходить - использование токенов (http://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D0%BA%D0%B5%D0%BD).

Этот метод защиты прост как фиг знает что:

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

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

Итак, имеется некий сайт, на сайте следующие файлы:


index.php - главная страница с уязвимым для xss полем

newadmin.php - страница с формой для создания нового админа

compare.php - php код выполняющий указанное действие


Содержимое этих файлов:

index.php








Поиск





















newadmin.php








Добавление но вого администратора













" />





[/COLOR]

compare.php






Теперь подумаем, причем тут XSS? - А при том, что с помошью JavaScript мы можем получть доступ к исходному коду загруженной страницы, а также выполнять такие действия как например отправка формы и тп.

Также следует учесть что наша XSS находится на том же сайте, и все что будет твориться в XSS будет таким же, как например то, что творится для авторизованного юзера у которого запущена эта XSS, т.е XSS работает от лица запустившего код пользователя (жертвы), а значит токен "в глазах" кода внедренного с помошью XSS будет таким же, каким он будет и для неосторожного но авторизованного юзера. Надеюсь вы поняли о чем я =)

Следовательно, если мы имеем XSS, мы можем загрузить защищенную от CSRF токеном страницу в память, прочесть ее, отпарсить и вытащить токен.

Чтобы сделать это можно использовать два варианта


1.Отправить http заголовки (рефферер, куки и тд) на подготовленный скрипт, который пошлет GET запрос, прочитает ответ, и отпарсит заветный токен.

2.Загрузить страницу в iframe и обратиться к объекту содержащему токен.


Так, как первый вариант - муть и лишняя трата времени, пойдем по пути наименьшего сопротивления, т.е по рассмотрим пункт 2.

Итак у нас есть XSS в запросе,


index.php?stext=">alert(/xss/)

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

Чтобы не мозолить глаза - создадим файл с именем js.js и положим туда код который будет открывать страницу newadmin.php, читать токен и передавать его на скрипт compare.php:


document.write('');

functiondoit()

{

varname='NICK';

vartoken=document.getElementById("iframe").contentDocument.forms[0].token.value;

document.write('');

document.write('
');

document.write('');

document.write('
');

document.write('');

document.forms[0].submit.click();

}



В принципе это все, теперь вы можете обратиться по адресу


index.php?stext=">alert(/Уря!/)

и получить админа или еще чего

Вывод:

Статья показывает что любая защита от CSRF станет бесполезной при "правильном" подходе к XSS

P.S. В процессе написания статьи я наткнулся на аналогичное исследования (http://packetstormsecurity.org/papers/attack/Using_XSS_to_bypass_CSRF_protection.pdf) некоего хакера из rstcenter.com, просмотрев его статью увидел там практически то же что делал и я, но учитывая то, что я не основывался на его статье, и моя идея пришла ко мне извне, оставляю копирайты за собой

О rstcenter.com говорю для того, чтобы потом меня не упрекали в плагиате! Это не плагиат! Это как попов и еще какой то придумали радио одновременно!

Кстати я думал перевести может его статью, но она на 80% состояла из того что такое xss и что такое csrf, а в правилах нашего форума ясно сказано - нельзя изменять статьи чужих авторов

Короче не вините, за то, что опоздал

С Уважением,

eclipse