¿Esta llamada jQuery ajax es vulnerable a XSS?

6

Si alguien puede editar $("#field").val() , ¿pueden cambiar la propiedad url aquí para que apunte a otra ubicación?

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

Si pueden, entonces mi página es vulnerable a XSS ya que la ubicación maliciosa podría devolver etiquetas de script en el objeto de respuesta. Quiero saber si algún valor de field podría usarse para cambiar la URL de AJAX.

Actualizar

Mis disculpas, he actualizado la pregunta. El valor en realidad está contenido en una variable javascript y no está escrito directamente por php (de lo contrario, obviamente hay problemas de XSS). Lo siento.

    
pregunta Kevin 19.01.2012 - 13:58
fuente

1 respuesta

14

Sí, es vulnerable, pero no de la forma que sospechas. El atacante no intentaría modificar la URL cargada, sino ejecutar el código directamente. Por ejemplo:

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

se convertirá en:

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

y el código se ejecutará incluso antes de solicitar la URL con ajax. Es solo un ejemplo, hay otros vectores que también funcionarían aquí . La forma más sencilla de escapar del parámetro para evitar XSS en este contexto sería usar urlencode() en PHP como este:

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

También, eche un vistazo a Hoja de trucos de prevención OWASP XSS .

Actualización: Después de actualizar la pregunta, aquí no hay una vulnerabilidad de XSS (no puede, por ejemplo, dirigir la solicitud a otro dominio), pero el ejemplo es vulnerable a una bestia diferente, polución del parámetro HTTP . Puede que no importe en este caso exacto, pero imagine que el parámetro dado es:

a_valid_value&param=another_param_injected

El atacante puede inyectar parámetros HTTP GET adicionales que podrían ser importantes para su aplicación y podrían cambiar el flujo de ejecución (por ejemplo, el parámetro admin=1 ). Debería adquirir el hábito de escapar / codificar todo lo que proviene de la entrada del usuario. En este caso modificado, debe usar la función Javascript encodeURIComponent que evita que el atacante inyecte '&', '=' and '?':

"http://mywebsite/script?param=" + encodeURIComponent($("#field").val()),
    
respondido por el Krzysztof Kotowicz 19.01.2012 - 15:27
fuente

Lea otras preguntas en las etiquetas