
Автоматизированный сканер неправильных настроек CORS, который проверяет внедрение заголовка Origin, отражение подстановочных символов и утечку учётных данных в веб-приложениях и API.

Corsair_scan — это инструмент безопасности для тестирования неправильных конфигураций Cross-Origin Resource Sharing (CORS). CORS — это механизм, который позволяет запрашивать ограниченные ресурсы на веб-странице из другого домена, отличного от домена, с которого был предоставлен первый ресурс. Если он настроен неправильно, неавторизованные домены могут получить доступ к этим ресурсам.
CORS — это механизм, основанный на HTTP-заголовках, который позволяет серверу указывать любые другие источники (домен, схему или порт), кроме своего собственного, из которых браузер должен разрешать загрузку ресурсов. Он работает путём добавления новых HTTP-заголовков, которые позволяют серверам описывать, какие источники могут читать эту информацию из веб-браузера.
CORS также опирается на механизм, при котором браузеры отправляют «предварительный» (preflight) запрос на сервер, размещающий ресурс из другого источника, чтобы проверить, разрешит ли сервер фактический запрос. В этом предварительном запросе браузер отправляет заголовки, указывающие HTTP-метод и заголовки, которые будут использоваться в фактическом запросе.
Самой распространённой и проблемной проблемой безопасности при реализации CORS является отсутствие проверки/добавления в белый список запрашивающих сторон. Слишком часто мы видим значение Access-Control-Allow-Origin равным '*'.
К сожалению, это значение по умолчанию, и, таким образом, оно позволяет любому домену в вебе получать доступ к ресурсам этого сайта.
Согласно Стандарту проверки безопасности приложений OWASP (ASVS), требование 14.5.3 гласит:
Убедитесь, что заголовок Access-Control-Allow-Origin механизма Cross-Origin Resource Sharing (CORS) использует строгий белый список доверенных доменов и поддоменов для сопоставления и не поддерживает источник «null».
Corsair_scan работает путём повторной отправки запроса (или списка запросов), полученного в качестве параметра, и последующей инъекции значения в заголовок Origin. В зависимости от содержимого заголовка Access-Control-Allow-Origin в ответе на этот запрос мы можем определить, правильная ли конфигурация CORS или нет. Существует три сценария, указывающих на неправильную конфигурацию CORS:
Если обнаружено, что CORS настроен неправильно, мы проверяем, содержит ли ответ заголовок Access-Control-Allow-Credentials, что означает, что сервер разрешает включение учётных данных в межсайтовые запросы.
Часто конфигурации CORS используют подстановочные знаки, например, принимают что угодно под * example.com *. Это означает, что исходный домен domain.com.evil.com будет принят, так как он соответствует заданному регулярному выражению. Чтобы попытаться противостоять этому, corsair_scan проверяет четыре сценария:
Этот проект разработан на Python 3.9, но должен работать с любой версией Python 3.x. Лучший способ установки — через pip.
pip3 install corsair_scan --user
Corsair можно использовать как в качестве модуля Python, так и в качестве CLI.
Метод, выполняющий сканирование CORS, называется corsair_scan. Вот его определение:
Принимает список запросов и параметр для включения/отключения проверки сертификата в запросе.
Входные данные:
data [List]: Список запросов. Каждый запрос — это словарь, содержащий соответствующие данные для запроса:
verify [Boolean] [По умолчанию: True] : Отправляет это значение в corsair_scan_single_url для каждого запроса
Выходные данные:
import corsair_scan.corsair_scan as corsair
url_data = {}
data = []
verb = 'GET'
url = 'https://example.com/'
params = 'user=user1&password=1234'
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-GB,en;q=0.5', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1',
'Origin': 'https://example.com',
'Host': 'example.com'}
url_data['verb'] = verb
url_data['url'] = url
url_data['params'] = params
url_data['headers'] = headers
data.append(url_data)
print (corsair.corsair_scan(data, verify=True))
Ответ:
{'report': [{'fake_origin': {'Access-Control-Allow-Origin': 'https://scarymonster.com',
'Origin': 'https://scarymonster.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'post-domain': {'Access-Control-Allow-Origin': 'https://example.com.scarymonster.com',
'Origin': 'https://example.com.scarymonster.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'pre-domain': {'Access-Control-Allow-Origin': 'https://scarymonsterexample.com',
'Origin': ' https://scarymonsterexample.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'sub-domain': {'Access-Control-Allow-Origin': 'https://scarymonster.example.com',
'Origin': 'https://scarymonster.example.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'url': 'https://example.com/',
'verb': 'GET'}],
'summary': {'error': [], 'misconfigured': [{'credentials': True,
'misconfigured_test': ['fake_origin',
'sub-domain',
'pre-domain',
'post-domain'],
'status_code': 200,
'url': 'https://domain.com',
'verb': 'GET'}]}}
В составе установки пакета pip устанавливается CLI. Синтаксис выполнения выглядит следующим образом:
corsair FILE [-nv/--noverify][-r/--report]
CLI требует файл JSON со списком запросов для выполнения сканирования. Пример файла предоставлен в составе тестов:
[{
"verb": "GET",
"url": "https://example.com/",
"params": "user=user1&password=1234",
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-GB,en;q=0.5",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Origin": "https://example.com",
"Host": "example.com"
}
}]
Также есть два дополнительных параметра:
Corsair_scan был разработан командой инженеров по безопасности Santander UK, в состав которой входят: