XSS a través de REQUEST_URI

2

¿Hay alguna situación en la que se pueda realizar un ataque XSS a través de la variable PHP $_SERVER['REQUEST_URI'] ? Para aquellos que no están familiarizados con él: contiene la URL completa utilizada para acceder a ese sitio web, sin el nombre de dominio y con algunos caracteres especiales codificados .

Por ejemplo, toma este pedazo de código. Ya tenemos un < , y ni siquiera estamos usando " :

echo '<form action=' . $_SERVER['REQUEST_URI'] . ' method="post"></form>';

Si visito localhost/myscript.php?foo onhover=alert(1) , el resultado es:

<form action=/myscript.php?foo%20onhover=alert(1) method="post">
  • ¿Hay alguna forma de inyectar un espacio? Intenté + y caracteres similares, pero no funcionó.
  • Si hay una forma, ¿también sería posible si se usaran comillas para la acción?
  • Si no es posible, ¿puedes pensar en algún escenario en el que $_SERVER['REQUEST_URI'] pueda usarse para realizar un ataque XSS? ¿O cualquier otro ataque para el caso?

// editar: para resumir las respuestas (en caso de que alguien no lea todos los comentarios): con los navegadores actuales, no parece que sea posible un ataque a través de REQUEST_URI . Pero no se debe confiar en el navegador para sanear las entradas de los usuarios, por lo que REQUEST_URI aún debe estar en el lado del servidor.

    
pregunta tim 21.03.2015 - 12:26
fuente

2 respuestas

3

PHP no codifica los caracteres al configurar $_SERVER['REQUEST_URI'] . Cualquier codificación de URL que pueda ver se realiza en el lado del cliente (por ejemplo, en su navegador).

Entonces, todo lo que tiene que hacer es usar un cliente HTTP diferente que envíe la URL en bruto sin codificación previa. Por ejemplo, cURL hará esto. Si bien los espacios literales no están permitidos dentro de una URL, es perfectamente posible inyectar corchetes angulares, terminar la etiqueta <form> actual y crear un nuevo elemento script .

    
respondido por el Fleche 21.03.2015 - 17:54
fuente
0

Puedes usar un poco de PHP para reinyectar el espacio del codificador de URL. Algo como ...

$action = implode(' ', explode('%20', $_SERVER['REQUEST_URI'])); echo '<form action=' . $action . ' method="post"></form>';

    
respondido por el Nektro 22.03.2015 - 01:52
fuente

Lea otras preguntas en las etiquetas