12.04.2019

Сценарии атак с использованием технологии CORS

image

Эта технология используется современными браузерами для проверки прав удаленного доступа к веб-ресурсам.

Автор: Milad Khoshdel

Что такое CORS?

Аббревиатура CORS расшифровывается как Cross-Origin Resource Sharing (Совместное использование ресурсов между разными источниками). Эта технология используется современными браузерами для проверки прав удаленного доступа к веб-ресурсам и службам и позволяет обойти ограничения, связанные, например, с невозможностью использования шрифтов, находящихся вне сайта, или отсылки Ajax-запрос с внешнего домена.

Чтобы стало яснее, рассмотрим конкретный пример.

Сайту A нужен AJAX-сервис, находящийся на сайте B. Обычно отсылка AJAX-запросов в этом случае невозможна из-за ограничений браузера. Однако современные браузеры поддерживают CORS для отправки AJAX-запросов на сайт B с дополнительным заголовком Origin.

Пример:

Origin: http://foo.bar

После проверка заголовка Origin на сайте B, отсылается ответ с заголовком Access-Control-Allow-Origin, и AJAX-запрос успешно выполняется.

Пример:

Access-Control-Allow-Origin: http://foo.bar

Заголовок Origin всегда отсылается браузером и указывает на первоисточник CORS-запроса, а заголовок Access-Control-Allow-Origin отсылается веб-сервером и указывает, каким доменам разрешен доступ к CORS-ответу.

Как выполнить проверку на безопасность?

Теперь разберемся, как выполнить проверку на предмет небезопасных конфигураций. Например, если вы в заголовке Origin отсылаете значение foo.bar, а в заголовке Access-Control-Allow-Origin ответа стоит «*», значит, всем доменам разрешен доступ к ответу, и у нас нарисовалась уязвимость.

Запрос:

GET http://target.domain/file.php HTTP/1.1

Host: target.domain

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8;)

Gecko/20100101 Firefox/24.0

Accept: text/html

Accept-Language: en-US

Referer: http://foo.bar/

Origin: http://foo.bar/

Connection: keep-alive

Ответ:

HTTP/1.1 200 OK

Date: Fri, 23 NOV 2018 18:57:53 GMT

Server: Apache/2.2.22 (Debian)

X-Powered-By: PHP/5.4.4-14+deb7u3

Access-Control-Allow-Origin: *

Content-Length: 44

Keep-Alive: timeout=18, max=89

Connection: Keep-Alive

Content-Type: application/xml

[Тело ответа]

Как видно по ответу выше, в заголовке Access-Control-Allow-Origin ответа стоит звездочка, а значит всем доменам разрешен доступ к ответу сервера, что является небезопасной конфигурацией для CORS.

Также существует другой тип атак. Если вы отсылаете случайный домен в заголовке Origin запроса и в ответ получаете тот же домен в заголовке Access-Control-Allow-Origin, значит, вы успешно сделали случайный домен достоверным для доступа к CORS-ответам.

Подобного рода уязвимость считается высокого уровня опасности.

Рассмотрим пример.

Запрос:

GET http://target.domain/file.php HTTP/1.1

Host: target.domain

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8;)

Gecko/20100101 Firefox/24.0

Accept: text/html

Accept-Language: en-US

Referer: http://foo.bar/

Origin: http://foo.bar/

Connection: keep-alive

Ответ:

HTTP/1.1 200 OK

Date: Fri, 23 NOV 2018 18:57:53 GMT

Server: Apache/2.2.22 (Debian)

X-Powered-By: PHP/5.4.4-14+deb7u3

Access-Control-Allow-Origin: http://foo.bar/

Content-Length: 44

Keep-Alive: timeout=19, max=59

Connection: Keep-Alive

Content-Type: application/xml

[Тело ответа]

Я написал скрипт на Java, который отсылает URL в качестве значения заголовка Origin в запросе и проверяет значение заголовка Access-Control-Allow-Origin в ответе.

Скрипт, проверяющий заголовки

Вначале нужно установить Java на вашем компьютере.

Моя версия:

java version "1.8.0_191"

Java(TM) SE Runtime Environment (build 1.8.0_191-b12)

Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

Версию Java в Linux/Windows можно посмотреть при помощи следующей команды:

Java –version

Если на вашем компьютере Java не установлена, последнюю версию можно найти по адресу https://www.oracle.com.

Скрипт доступен для загрузки по следующему адресу https://github.com/Miladkhoshdel/corschecker.

Запускаем проверку при помощи следующей команды:

java -cp CORSChecker.jar CORSChecker

Далее вводим целевой URL:

Рисунок 1: Ввод целевого URL для отправки заголовка

Затем скрипт отошлет запрос с заголовком Origin и проверит значение заголовка Access-Control-Allow-Origin.

Рисунок 2: Содержимое ответа

В вышеуказанном примере в заголовке Access-Control-Allow-Origin находится звездочка, что говорит о наличии уязвимости.

Ссылки

1. https://www.owasp.org/index.php/Test_Cross_Origin_Resource_Sharing_(OTG-CLIENT-007)

2. https://www.owasp.org/index.php/CORS_OriginHeaderScrutiny