
Scanner automatizado de má configuração de CORS que testa injeção de cabeçalho Origin, reflexão de curinga e vazamento de credenciais em aplicações web e APIs.

O Corsair_scan é uma ferramenta de segurança para testar configurações incorretas de Cross-Origin Resource Sharing (CORS). CORS é um mecanismo que permite que recursos restritos em uma página da web sejam solicitados de outro domínio fora do domínio do qual o primeiro recurso foi servido. Se não estiver configurado corretamente, domínios não autorizados podem acessar esses recursos.
CORS é um mecanismo baseado em cabeçalhos HTTP que permite que um servidor indique outras origens (domínio, esquema ou porta) além da sua própria a partir das quais um navegador deve permitir o carregamento de recursos. Funciona adicionando novos cabeçalhos HTTP que permitem que os servidores descrevam quais origens têm permissão para ler essas informações de um navegador web.
CORS também depende de um mecanismo pelo qual os navegadores fazem uma requisição “preflight” ao servidor que hospeda o recurso de origem cruzada, a fim de verificar se o servidor permitirá a requisição real. Nesse preflight, o navegador envia cabeçalhos que indicam o método HTTP e os cabeçalhos que serão usados na requisição real.
O problema de segurança mais comum e problemático ao implementar CORS é a falha em validar/colocar na lista de permissões os solicitantes. Muitas vezes, vemos o valor de Access-Control-Allow-Origin definido como ‘*’.
Infelizmente, este é o padrão e, como tal, permite que qualquer domínio na web acesse os recursos desse site.
De acordo com o OWASP Application Security Verification Standard (ASVS), o requisito 14.5.3 afirma
Verify that the Cross-Origin Resource Sharing (CORS) Access-Control-Allow-Origin header uses a strict allow list of trusted domains and subdomains to match against and does not support the "null" origin.
O Corsair_scan funciona reenviando uma requisição (ou lista de requisições) recebida como parâmetro e depois injetando um valor no cabeçalho Origin. Dependendo do conteúdo do cabeçalho Access-Control-Allow-Origin na resposta a esta requisição, podemos afirmar se a configuração CORS está correta ou não. Existem três cenários que indicam que o CORS está mal configurado:
Se o CORS for considerado mal configurado, verificamos se a resposta contém o cabeçalho Access-Control-Allow-Credentials, o que significa que o servidor permite que credenciais sejam incluídas em requisições de origem cruzada.
Frequentemente, as configurações de CORS fazem uso de curingas, por exemplo, aceitando qualquer coisa sob * example.com *. Isso significa que a origem domain.com.evil.com será aceita por corresponder à regex fornecida. Para tentar combater isso, o corsair_scan testa quatro cenários:
Este projeto foi desenvolvido com Python 3.9, mas deve funcionar com qualquer versão Python 3.x. A melhor forma de instalá-lo é usando pip.
pip3 install corsair_scan --user
O Corsair pode ser usado tanto como um módulo python quanto como CLI.
O método que realiza a varredura CORS é corsair_scan. Aqui está sua definição:
Recebe uma lista de requisições e um parâmetro para ativar/desativar a verificação de certificado na requisição
Entrada:
data [List]: Uma lista de requisições. Cada requisição é um dicionário que contém os dados relevantes para a requisição:
verify [Boolean] [Padrão: True]: Envia este valor para corsair_scan_single_url para cada requisição
Saída:
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))
Resposta:
{'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'}]}}
Como parte da instalação do pacote pip, uma CLI é instalada. A sintaxe para executar é a seguinte:
corsair FILE [-nv/--noverify][-r/--report]
A CLI precisa de um arquivo json com uma lista de requisições para realizar a varredura. Um arquivo de exemplo é fornecido como parte dos testes
:
[{
"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"
}
}]
Existem também dois parâmetros opcionais:
O Corsair_scan foi desenvolvido pela equipe de Engenharia de Segurança do Santander UK, que são: