¿Cómo arreglar la vulnerabilidad de redireccionamiento abierto?

4

En redir.php:

header("Location: {$_GET['addr']}");

Para corregir la vulnerabilidad de redireccionamiento abierto, se me ocurren varias maneras:

1- (Efecto secundario de) Uso de un token de seguridad (token anti-csrf):

if(!isset($_SESSION['anticsrf_token'], $_GET['anticsrf_token']) or $_SESSION['anticsrf_token']!==$_GET['anticsrf_token']) exit('...');

Esto debería funcionar porque un atacante no puede saber y no puede crear un token anti-csrf válido.

2- Comparando el dominio de 'redirect to address' con el del script (redir.php) en sí ($ _SERVER ['HTTP_HOST']).

3- El 'redireccionamiento a la dirección' puede almacenarse primero en el script de referencia (el script que contiene el enlace a redir.php) en $ _SESSION y luego redir.php actúa solo en esa sesión var:

header("Location: {$_SESSION['redir2addr']}");

También se puede utilizar una cookie en lugar de una sesión.

También puedo pensar en otras formas, pero parece que una de estas es suficiente para mi propia aplicación. Apreciaré cualquier idea y tengo que saber o pensar.

    
pregunta user273084 28.03.2015 - 20:49
fuente

1 respuesta

1

Iría con el segundo enfoque ( HTTP_HOST es controlado por el usuario, pero no importa en este caso). Es el más fácil de usar, y es prácticamente imposible estropearlo.

El primer y tercer enfoque son más difíciles de usar desde el código de llamada (no es un problema de seguridad, pero sigue siendo malo), y también pueden ser utilizados incorrectamente por el código de llamada (el tercero es mucho más fácil que el primero) :

if (something the attacker can trigger with GET params) {
    $_SESSION['redir2addr'] = $_GET['addr'];
    include("redir.php");
}

y (nunca se sabe a quién extenderá su código ...):

if (something the attacker can trigger with GET params) {
    $_SESSION['anticsrf_token'] = 'something';
    $_GET['anticsrf_token'] = 'something';
    include("redir.php");
}
    
respondido por el tim 28.03.2015 - 21:22
fuente

Lea otras preguntas en las etiquetas