Questa chiamata jQuery ajax è vulnerabile a XSS?

6

Se qualcuno può modificare $("#field").val() , può modificare qui la proprietà url per indicare un'altra posizione?

$.ajax({
  url: "http://mywebsite/script?param=" + $("#field").val(),
  dataType: "jsonp",
  success: function(response) {
      document.write(/*fields from response object*/);
  },
 });

Se possono, la mia pagina è vulnerabile all'XSS in quanto la posizione dannosa potrebbe restituire tag di script nell'oggetto risposta. Voglio sapere se è possibile utilizzare qualsiasi valore di field per modificare l'URL di AJAX.

Aggiorna

Le mie scuse, ho aggiornato la domanda. Il valore è in realtà contenuto in una variabile javascript e non è scritto direttamente da php (altrimenti esistono ovviamente problemi XSS). Siamo spiacenti.

    
posta Kevin 19.01.2012 - 13:58
fonte

1 risposta

14

Sì, è vulnerabile, ma non nel modo in cui sospetti. L'utente malintenzionato non proverebbe a modificare l'URL caricato, ma a eseguire direttamente il codice. Ad esempio:

$_GET['fname'] = '"+(function(){/*any_code_i_like*/})()+"';

diventerà:

$.ajax({
   url: "http://mywebsite/script?param="+(function(){/*any_code_i_like*/})()+""

e il codice verrà eseguito anche prima di richiedere l'URL con ajax. È solo un esempio, ci sono altri vettori che potrebbero funzionare anche qui . Il modo più semplice per evitare il parametro per evitare che XSS in questo contesto utilizzi urlencode() in PHP come questo:

$.ajax({
  url: "http://mywebsite/script?param=<?php echo urlencode($_GET["fname"]); ?>"
  dataType: "jsonp",
  success: function(response) {
      document.write(/*fields from response object*/);
  },
 });

Inoltre, dai un'occhiata a Foglio trucchi OWASP XSS Prevenzione .

Aggiornamento: Dopo aver aggiornato la domanda - non esiste una vulnerabilità XSS qui (non è possibile ad esempio indirizzare la richiesta a un altro dominio), ma l'esempio è vulnerabile a una bestia diversa - Polivalenza dei parametri HTTP . Potrebbe non avere importanza in questo caso esatto, ma immagina che il parametro indicato sia:

a_valid_value&param=another_param_injected

L'utente malintenzionato è in grado di iniettare parametri HTTP GET aggiuntivi che potrebbero essere importanti per l'applicazione e potrebbe modificare il flusso di esecuzione (ad esempio, il parametro admin=1 ). Dovresti abituarti a scappare / codificare tutto ciò che proviene dall'input dell'utente. In questo caso modificato, dovresti usare la funzione Javascript encodeURIComponent che impedisce a attacker di iniettare '&', '=' e '?':

"http://mywebsite/script?param=" + encodeURIComponent($("#field").val()),
    
risposta data 19.01.2012 - 15:27
fonte

Leggi altre domande sui tag