È possibile sfruttare input utente senza escape in un modulo JavaScript che riceve solo i dati tramite la richiesta AJAX?

2

Un utente che ha effettuato l'accesso può accedere a una pagina https://example.com/some/page che ha un campo di input e alcuni pulsanti. Quando l'utente inserisce qualcosa in questo campo e fa clic su qualsiasi cosa, la pagina effettua richieste a https://example.com/data per verificare se l'oggetto richiesto è disponibile e restituisce falso se non lo è.

In questo caso la pagina visualizza avvertimenti come Can't find $User Input$ . Quindi, se gli utenti inseriscono qualcosa come <script>alert(1)</script> , tenteranno effettivamente di renderlo e visualizzeranno un avviso. Quello che viene chiamato "riflesso XSS", credo.

Quindi ecco la domanda. Nell'esempio descritto sono stati

  1. Abbiamo chiaramente campi di input non filtrati che espongono la vulnerabilità XSS di riflessione.
  2. Tuttavia, è richiesto un input esplicito dell'utente (poiché nessun url può popolare questo campo, ad esempio), come dovremmo valutare la gravità di questo problema?

La mia comprensione generale è che anche se personalmente non so come (se possibile) si possa usare questo exploit, dovrei comunque considerarlo una vulnerabilità critica. Ma mi mancano argomenti per dimostrarlo per il triage.

    
posta Alex F 06.07.2015 - 18:56
fonte

4 risposte

1

Non ci sono abbastanza informazioni fornite per diagnosticare correttamente se si tratta di una vulnerabilità o meno.

Se era possibile ingannare un utente nel rendere la richiesta direttamente a /data e includere il payload dannoso ( <script>alert(1)</script> ), allora sì sarebbe una vulnerabilità se fosse visualizzata la finestra di avviso.

Ad esempio, inducendo l'utente a visitare il sito dell'attaccante che contiene un reindirizzamento a https://example.com/data?<script>alert(1)</script> o contiene un modulo che POST a https://example.com/data con il corpo della richiesta impostato su data=<script>alert(1)</script> .

Ciò dipende dal fatto che /data risponda anche a nessuna richiesta AJAX. Inoltre, il tipo di contenuto restituito dovrebbe essere text/html per ogni script da rendere ed eseguire dal browser.

Inoltre, il tuo payload potrebbe essere visualizzato solo con un tipo di codifica del modulo di application/json . Se il gestore /data risponde solo alle richieste con questo tipo di codifica, allora è impossibile effettuare queste richieste con un tag <form> .

Se esegue ancora il rendering della risposta con un tipo di contenuto diverso specificato, potresti essere in grado di renderlo "ingannandolo" con un modulo text/plain :

<form enctype="text/plain" method="post">

  <input type="hidden" name="{&quot;data&quot;: &quot;<script>alert(123)</script>&quot; }//" value="" />

  <input type="submit" />

</form>

L'altra strada da esplorare è se puoi ottenere /some/page per precompilare la casella di testo con il tuo carico utile. Prova parametri comuni come:

  • https://example.com/some/page?data=<script>alert(123)</script>
  • https://example.com/some/page?value=<script>alert(123)</script>
  • https://example.com/some/page?<script>alert(123)</script>
  • https://example.com/some/page?debug=<script>alert(123)</script>
  • https://example.com/some/page?test=<script>alert(123)</script>
  • https://example.com/some/page?id=<script>alert(123)</script>
  • https://example.com/some/page?etc=<script>alert(123)</script>

Dai un'occhiata a ciò che hai osservato sul resto del sito (ad esempio, controlla la mappa del sito di Burp) e crea un elenco di nomi di parametri comunemente utilizzati.

Vedi qui per la mia risposta a una domanda simile .

Se non riesci a controllare queste cose da te, allora avrai bisogno di qualcuno con competenze di sicurezza web per verificare se si tratta di una vulnerabilità o meno. Se non è possibile assumere qualcuno, allora sarebbe meglio coprire le tue scommesse e correggerlo comunque.

    
risposta data 07.07.2015 - 13:14
fonte
0

Qualcosa su cui riflettere è se una persona malintenzionata potrebbe in sostanza indurre l'utente a visitare un sito che imiterebbe / causerà la presentazione del modulo con l'input dell'utente malintenzionato (ad esempio, sfruttando una vulnerabilità di falsificazione delle richieste cross-site a lo stesso tempo). Non si tratta solo di generare un URL. In tal caso, l'utente potrebbe essere indotto a eseguire un codice pericoloso nel proprio browser. Non sono sicuro dell'aspetto o della funzione della tua app, ma per il tuo giudizio e la tua valutazione raccomandazione, considerare se ci sono altre vulnerabilità presenti che potrebbero esacerbare il problema.

    
risposta data 06.07.2015 - 19:23
fonte
0

Questo permette all'utente di eseguire js come chiunque vedrà il messaggio non filtrato, quindi in teoria se è l'unico che sarà in grado di vedere questo messaggio questo non è un problema ma per qualsiasi modulo che memorizza i dati visibili da un altro utente è un problema.

Ma come detto prima, consente a qualsiasi sito che il tuo cliente visiterà di eseguire codice js all'interno della sessione client per il tuo sito web. come fare questo:

  1. link con param per ottenere
  2. 303 con location = get con param
  3. html form post (puoi pubblicare su qualsiasi dominio utilizzando il modulo html)
  4. Chiamata ajax se il client imposta lo stesso criterio di origine su
risposta data 08.07.2015 - 11:45
fonte

Leggi altre domande sui tag