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
Конкретизируя скажу, метод защиты который будем обходить - использование токенов (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