
Escáner automatizado de configuraciones incorrectas de CORS que prueba la inyección del encabezado Origin, la reflexión de comodines y la filtración de credenciales en aplicaciones web y APIs.

Corsair_scan es una herramienta de seguridad para probar configuraciones incorrectas de Intercambio de Recursos de Origen Cruzado (CORS). CORS es un mecanismo que permite que recursos restringidos en una página web sean solicitados desde otro dominio fuera del dominio desde el cual se sirvió el primer recurso. Si esto no está configurado correctamente, dominios no autorizados pueden acceder a esos recursos.
CORS es un mecanismo basado en cabeceras HTTP que permite a un servidor indicar cualquier otro origen (dominio, esquema o puerto) que no sea el suyo desde el cual un navegador debe permitir la carga de recursos. Funciona añadiendo nuevas cabeceras HTTP que permiten a los servidores describir qué orígenes están autorizados a leer esa información desde un navegador web.
CORS también depende de un mecanismo mediante el cual los navegadores realizan una solicitud "preflight" al servidor que aloja el recurso de origen cruzado, para comprobar que el servidor permitirá la solicitud real. En ese preflight, el navegador envía cabeceras que indican el método HTTP y las cabeceras que se utilizarán en la solicitud real.
El problema de seguridad más común y problemático al implementar CORS es la falta de validación/lista blanca de los solicitantes. Con demasiada frecuencia vemos que el valor de Access-Control-Allow-Origin se establece como '*'.
Desafortunadamente, este es el valor predeterminado y, como tal, permite que cualquier dominio en la web acceda a los recursos de ese sitio.
Según el Estándar de Verificación de Seguridad de Aplicaciones de OWASP (ASVS), el requisito 14.5.3 establece:
Verifique que la cabecera Access-Control-Allow-Origin de Intercambio de Recursos de Origen Cruzado (CORS) utilice una lista estricta de dominios y subdominios de confianza para comparar y no admita el origen "null".
Corsair_scan funciona reenviando una solicitud (o lista de solicitudes) recibida como parámetro y luego inyectando un valor en la cabecera Origin. Dependiendo del contenido de la cabecera Access-Control-Allow-Origin en la respuesta a esta solicitud, podemos determinar si la configuración CORS es correcta o no. Hay tres escenarios que indican que CORS está mal configurado:
Si se encuentra que CORS está mal configurado, comprobamos si la respuesta contiene la cabecera Access-Control-Allow-Credentials, lo que significa que el servidor permite incluir credenciales en solicitudes de origen cruzado.
A menudo, las configuraciones CORS utilizan comodines, por ejemplo, aceptando cualquier cosa bajo * ejemplo.com *. Esto significa que el origen domain.com.evil.com será aceptado ya que coincide con la expresión regular dada. Para intentar combatir esto, corsair_scan prueba cuatro escenarios:
Este proyecto fue desarrollado con Python 3.9, pero debería funcionar con cualquier versión de Python 3.x. La mejor manera de instalarlo es usando pip.
pip3 install corsair_scan --user
Corsair se puede usar tanto como módulo de Python como CLI.
El método que realiza el escaneo CORS es corsair_scan. Aquí está su definición:
Recibe una lista de solicitudes y un parámetro para habilitar/deshabilitar la verificación del certificado en la solicitud
Entrada:
data [List]: Una lista de solicitudes. Cada solicitud es un diccionario que contiene los datos relevantes para la solicitud:
verify [Boolean] [Default: True]: Envía este valor a corsair_scan_single_url para cada solicitud
Salida:
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))
Respuesta:
{'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 de la instalación del paquete pip, se instala una CLI. La sintaxis para ejecutar es la siguiente:
corsair FILE [-nv/--noverify][-r/--report]
La CLI necesita un archivo json con una lista de solicitudes para realizar el escaneo. Se proporciona un archivo de ejemplo como parte de las pruebas:
[{
"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"
}
}]
También hay dos parámetros opcionales:
Corsair_scan fue desarrollado por el equipo de Ingeniería de Seguridad de Santander UK, que son: