es el encabezado ('Ubicación: ../page.php?param='.$param); ¿Es vulnerable a redirecciones no validadas?

2

He revisado una aplicación web construida en PHP. Redirige a diferentes páginas de esta manera:

$param = $_POST['param'];
header('Location: ../page.php?param='.$param);

¿Es vulnerable a redirecciones no validadas? En otras palabras, ¿puedo redireccionar a otro sitio web, manipulando el parámetro param ?

    
pregunta hmrojas.p 25.05.2016 - 19:54
fuente

2 respuestas

3

No creo que exista un riesgo para una vulnerabilidad de redireccionamiento abierta, ya que cualquier cosa después de ? se interpretará como parámetros de consulta y no como parte de la ruta. Pero debe cambiar su código de todos modos, ya que no se asegura de que el param esté realmente codificado en URL. Haga esto con urlencode() :

header('Location: ../page.php?param='.urlencode($param));

Sin embargo, si usa una versión de PHP anterior a 5.1.2, es vulnerable a la inyección de cabecera (consulte documentación ). Al enviar un param que incluye una nueva línea, un atacante podría establecer múltiples encabezados (o simplemente establecer el encabezado de ubicación nuevamente, sobrescribiendo el valor anterior). El uso de urlencode() corrige que dado que \n se codificaría como %0A .

Sin embargo, todo el constructo podría ser innecesario. Tal vez solo puedas verificar $_POST y $_GET para param en page.php ?

    
respondido por el Anders 25.05.2016 - 20:17
fuente
-1

Respuesta corta: sí.

Respuesta larga: sí, pero depende. No tenemos un código page.php , por lo que solo podemos adivinar qué hace esa página en segundo plano. Aún así, cualquier parámetro enviado a través de POST o GET (o cualquier otra solicitud para ese asunto) puede ser editado por el usuario final. Así que la manipulación es, por supuesto, posible. Lea más sobre POST (HTTP) y HTTP si desea saber más.

Por qué: desde el fragmento que se ha publicado, podemos ver que no se establece ningún escape para el parámetro POST. De esa manera, el atacante puede establecer el parámetro POST en cualquier valor.

Para explotarlo, puedes usar curl o cartero y establecer cualquier valor en el parámetro $_POST['param'] .

    
respondido por el sensation 25.05.2016 - 20:17
fuente

Lea otras preguntas en las etiquetas