Автор: 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
Источник: