+38/050/370-3627
+38/093/220-0872
+38/044/257-2444
Новини

Як виконати перевірку на безпеку від атак із використанням технології CORS

Як виконати перевірку на безпеку від атак з використанням технології 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.phpHTTP/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.phpHTTP/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

[Тіло відповіді]

Milad Khoshdel написав скрипт на Java, який надсилає URL як значення заголовка Origin у запиті і перевіряє значення заголовка Access-Control-Allow-Origin у відповіді.

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

Спочатку потрібно встановити Java на вашому комп'ютері.

Версія Milad Khoshdel:

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:

Скрипт надішле запит із заголовком Origin і перевірить значення заголовка Access-Control-Allow-Origin.

У наведеному вище прикладі в заголовку 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

Інші новини