Как защититься от csrf атак. Уязвимость CSRF. Введение. Отключение Shopify от Twitter

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

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

Этот цикл статей будет посвящен CSRF уязвимостям . Не слышали такой термин? Значит этот цикл для вас;)

Введение

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

  • SQL injection
  • PHP include

Раньше, на заре развития интернета, практически каждое приложение содержало кучу таких уязвимостей. Но с каждым днем становилось все сложней встретить уязвимости такого типа. И взломщики становились все более изощреннее, что приводило к разработкам новых типов и векторов атаки — один из этих типов атаки был выделен в отдельный класс и получил название CSRF.

Что такое CSRF. Теория

Зайдем на википедию:

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

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

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

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

Немножко практики

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

Разработчик данной формы ничего не знал об уязвимости CSRF, и защиты от нее он, естественно, не делал. Ну и плюс ко всему (чтобы пример был проще) он передавал данные методом GET. По нажатию кнопки «создать» браузер сформирует запрос к следующей странице:
http://site/admin/?do=add_admin&new_login=NewAdmin&new_pass=NewPass&new_mail=NewAdmin@Mail.Com
И после того как запрос будет выполнен, на данном сайте появится новый администратор. Казалось бы что с того — это вполне обычная функциональность на многих сайтах. Но здесь то и кроется главная ошибка. Жертву можно заставить выполнить данный запрос при заходе на абсолютно другой сайт. Создаем следующую страницу по адресу http://evil/page.html


Обычная страница


С обычным текстом. Но с необычным содержимым



И теперь, если жертва зайдет на http://evil/page.html , то браузер попытается загрузить картинку, но вместо этого выполнит запрос к админ панели, тем самым создав нового администратора. Единственным обязательным условием успешной эксплуатации данной уязвимости является необходимость того, что жертва должна быть авторизована на уязвимом сервере в момент проведения атаки.

Заключение

С тем, что такое CSRF мы разобрались. Давайте попробуем выделить основные требования для успешного проведения атаки:

  • Возможность вынудить жертву перейти на страницу с дополнительным кодом. Или возможность модификации злоумышленником часто посещаемых жертвой страниц (как говорится если гора не идет к Магомету, то…).
  • Отсутствие защиты от CSRF на целевом сайте (о ней в ).
  • Пользователь в момент атаки должен быть авторизован для действия, которое мы хотим выполнить от его имени.

И на основе этих требований попытаемся построить защиту в следующей статье…

CSRF (Сross Site Request Forgery - подделка межсайтовых запросов) Так же известен как XSRF. Данный вид атак на посетителей интернет-сайтов использует недостатки HTTP протокола. Если жертва зайдет на сайт, который специально был создан злоумышленником, то от ее лица тайно отправится запрос на сторонний сервер (например сервер электронных платежей), осуществляющий некую вредоносную операцию (перевод денег на счет взломщика). Для успеха данной атаки, жертва должна быть авторизована на сервере, на который отправится запрос. Сам запрос не должен требовать подтверждения со стороны пользователя.

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

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

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

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


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

Наш рейтинг лучших казино

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

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

Помимо поверхностного анализа игровых платформ, выполняется проверка сведений о заведениях в интернете. Репутация в сети, отзывы действующих и бывших игроков, наличие конфликтных ситуаций, скандалов с казино и способы решения проблем от создателей учитываются при анализе. Особенное внимание уделяется молодым клубам с опытом работы до 1-2 лет.

Как составляется рейтинг казино и кто туда попадает?

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

  • наличие лицензии от регулятора по азартным играм и выбранная юрисдикция для регистрации;
  • безопасность платформы, что гарантирует конфиденциальность данных и платежной информации;
  • выбор лицензионного софта от надежных провайдеров, в работу которых невозможно вмешаться;
  • наличие русскоязычной версии для большего удобства пользователей из России и стран СНГ;
  • служба поддержки, включая график ее работы, скорость ответов, качество решения проблем;
  • вывод денег без дополнительных задержек или верификаций, а также варианты для получения денег и скорость обработки операций;
  • бонусные программы для новых и регулярных пользователей, наличие турниров, лотерей, периодических акций;
  • платежные системы, влияющие на удобство клиентов пополнять счет и выводить выигрыши.

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

Что такое лицензионное казино?

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

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

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

Как определяется честность казино?

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

  • регионы, откуда принимаются игроки, поскольку запретные юрисдикции говорят о многом;
  • лимиты на вывод, ограничивающие разовые транзакции, а также суточную, еженедельные и месячную сумму операций;
  • наличие сведений об KYC и AML, что свидетельствует о соответствии требованиям законодательства о честности и легальности происхождения денег;
  • репутация, подтверждающая честность и надежность работы клуба и отсутствие громких скандалов или проблем;
  • длительность работы, позволяющая в полной мере оценить историю онлайн ресурса, включая все преимущества и недостатки;
  • наличие регулятора и соответствие его правилам, что увеличивает шансы на справедливость деятельности.

Лицензия и регулятор - достаточно важный критерий, но это не дает 100% гарантию честности. Только клубы, которые позволили игрокам получить крупные выигрыши и джекпоты, отдали подарки за лотереи и турниры, могут рассчитывать на подобное звание.

Разновидности игровых автоматов

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

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

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

Бонусная политика

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

Стандартный набор поощрений состоит из следующих категорий:

  1. Бездепозитный бонус для приветствия новых клиентов - начисляется за подтверждения адреса электронной почты и номера телефона. В качестве награды используют бесплатные деньги или фриспины на автоматы с обязательным условием отыгрыша.
  2. Регистрационный подарок - фриспины или умножители суммы пополнения счета на 1-5 депозитов с момента создания личного профиля. Точный размер бонуса и максимальные лимиты устанавливаются индивидуально каждым клубом.
  3. Программа лояльности - различные системы статусов пользователей, которые влияют на размер еженедельного кэшбэка, наличие персональных условий обслуживания, индивидуальных подарков, выгодного курса обмена внутренней валюты на деньги и многое другое.
  4. Промокоды - периодические акции от игровых клубов, которые раздают подарочные сертификаты на фриспины, бездепы или умножители счета для всех желающих.

Русскоязычные казино

Составляя рейтинг лучших казино 2020 года , учитывается наличие русского языка на платформе. Русскоязычный интерфейс позволяет пользователям из России, Беларуси, Украины и стран СНГ без проблем разобраться с регистрацией, входом, пополнением счета и другими особенностями платформы. Также это подтверждает, что заведение ориентировано на русскоговорящих пользователей, предлагая им уникальные бонусы и поддержку.

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

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

Казино с быстрым выводом денег

Особое внимание уделяется скорости выплаты в онлайн казино. Одни клубы предлагают вывод средств на банковские карты и электронные кошельки в течение нескольких часов, а для VIP клиентов обрабатывают запросы мгновенно. Другие используют ручную обработку заявок в рабочие дни по специальному графику, поэтому выплаты могут задерживаться до 1-3 рабочих дней с момента оформления заявки. Чтобы избавить пользователей от длительного ожидания, создан рейтинг казино с быстрым выводом .

Он состоит исключительно из тех заведений, которые оперативно рассматривают все заявки и не создают препятствий для получения денег. Учитывается не только скорость переводов, но и отсутствие проблем при запросе крупных выплат или переводов денег после выигрыша джекпота, большого куша. Только честные заведения могут гарантировать справедливость выплат и отсутствие проблем с платежами.

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

Основные платежные системы в онлайн казино:

  • банковские карты МИР, MasterCard, Visa;
  • электронные кошельки QIWI, Yandex, Webmoney, Neteller, Skrill и другие;
  • мобильные платежи Билайн, МегаФон, МТС, TELE2;
  • российский интернет банкинг;
  • популярные криптовалюты, включая Bitcoin, Ethereum, Litecoin.

Служба технической поддержки пользователей

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

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

  • скорость предоставления ответов;
  • решает ли консультант проблему и как много времени на это ушло;
  • грамотность ответов и наличие русскоязычных сотрудников в поддержке.

Если в казино не представлены русскоязычные операторы, рекомендуем использовать онлайн переводчик от Google для перевода вопросов и ответов консультантов.

Выводы

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

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

В данной статье я попытаюсь рассказать о защите от атак данного типа со сторон:

  • Со стороны клиента — основные способы защитить себя самому
  • Со стороны сервера — правильное проектирование приложения

Если вам интересно как защититься от CSRF то добро пожаловать под кат.

Общая информация

В общем то хочу напомнить, CSRF — это НЕ уязвимость, это вид атаки. И данная атака проводится на конечного пользователя веб приложения с помощью уязвимости в данном приложении, которую можно назвать как «Отсутствие надлежащей проверки источника запроса» (название я придумал сам, не судите строго, но это так). Но здесь и далее я буду называть CSRF уязвимостью и атакой в одном лице так, как это проще, да и именно так принято =)

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

Рассмотрим защиту с обоих сторон.

Защита со стороны пользователя

Вообщем тут все очень банально:

  • Не переходить на ссылки предложенные вам третьими лицами. Это самый банальный совет, я думаю это все и так знают, но решил лишний раз сказать об этом.
  • Деавторизовываться по окончанию работы с конкретным сайтом. Даже при наличии уязвимости, злоумшленник не сможет выполнить действия на целевом сайте от вашего имени.
  • Использовать отдельный браузер или «приватные или анонимные режимы» для работы с важными сайтами (в идеале использовать по одному браузеру на каждый сайт ^_^ а еще лучше отдельный компьютер:D).

На этом все. Теперь перейдем к главному.

Защита со стороны разработчиков

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

Проверка Referer

Сразу скажу, для тех кто читает статьи по диагонали. Основывать свою защиту только на проверке этого заголовка — плохо(!). Почему — см. далее.

Для начала разберемся, в чем заключается этот способ.

С сайтами мы работаем по HTTP протоколу. Каждый пакет этого протокола представляет собой набор заголовков + содержимое пакета. Одним из этих заголовков является Referer. Он содержит адрес источника перехода. Банальный пример: у вас открыт сайт A , на данном сайте вы кликаете на ссылку на сайт B , в этот момент при запросе в заголовке Referer будет содержатся адрес сайта A . То есть казалось бы это идеальный механизм для отслеживания откуда пришел пользователь.

А вот хрен. И дело здесь не в том что можно подделать реферер (какой здравомыслящий взломщик будет просить жертву о том, чтобы она подменила реферер и перешла по указанной ссылке). А в том что по моей статистике у около 5% пользователей передача Referer отключенна. То есть либо эти пять процентов не смогут работать с сайтом вообще, либо они будут уязвимы к этой атаке (зависит от политики вашего приложения).

Да, да, да, я знаю о чем вы подумали… Ну и фиг с этими 5%? Пусть будут уязвимы, зато остальные 95% защищены и при этом вы обошлись малой кровью. То есть если реферер содержит адрес нашего приложения либо пуст, то считаем источник подтвержденным? А вот снова хрен! Существуют варианты заставить браузер жертвы выполнить запрос без указания реферера (об этом я написал )! И вуаля! Оказывается все пользователи по-прежнему уязвимы.

Воощем как самостоятельный способ данный метод бессмыслен.

Подтверждение действия

Можно к каждой форме отправке прикрутить капчу, и показывать ее даже для зарегестрированных пользователей, чтобы спасти их от CSRF… Хотя пожалуй, я бы предпочел отдать свой аккаунт хакеру, чем работать в такой системе…

Токены

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

Смысл данного способа заключается в добавлении параметра содержащего некоторый «токенов» к каждой ссылке, форме отправки и проч. А при получении запроса сервер должен проверять наличие данного токена в принятых параметрах. Естественно каждый токен для каждого пользователя должен быть уникальным, а еще лучше если каждый токен будет уникальным.

Один из самых простых и надежных примеров реализации — токен генерируется при каждом запросе новый и устанавливается в cookies пользователя а также добавляется в параметры форм и ссылок на странице:

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

Вообще реализация может быть другая, но проблема в том что переход на токены это довольно сложно так как приходится учитывать каждую ссылку, каждую форму, каждую страницу… Можно защищать только важные страницы/формы/ссылки, но тогда есть шанс какие то из них упустить.

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

Вывод

Надеюсь из данной статьи вы поняли каким образом следует защищаться от CSRF атак.