Evitar redireccionamientos no validados y reenvíos

4

Supongamos que tiene una página de redireccionamiento donde el cliente es redirigido a una URL desde la cadena de consulta:

http://victim/redirect.aspx?url=http://evil/

Realmente necesitas poder redireccionar a otra página o URL, ¿cómo puedes evitar que esta funcionalidad sea explotada?

OWASP dice:

  

Se recomienda que cualquier entrada de destino se asigne a un valor, en lugar de a la URL real o parte de la URL, y que el código del lado del servidor traduzca este valor a la URL de destino.

¿Alguien podría explicar esto con un ejemplo, por favor?

    
pregunta Awa 26.12.2015 - 14:24
fuente

2 respuestas

4

No proporcione la URL real como un argumento para el script. En su lugar, proporcione algún ID que pueda traducir en una URL en el script del redirector.

Por ejemplo, use redirect.aspx?url=1 en su lugar, y en el script, traduzca la ID 1 a alguna URL usando un mapa, búsqueda en la base de datos, o lo que le resulte útil.

De esta manera, solo se puede redirigir a un conjunto fijo de URL confiables.

    
respondido por el Teun Vink 26.12.2015 - 14:30
fuente
3

Una redirección abierta significa que el valor de la redirección se puede determinar sobre la marcha.

Lo que se recomienda es tener solo una lista permitida predefinida. Tiene un mecanismo para permitir que un usuario autorizado ingrese la URL o tal vez esta es una función automática de un CMS o aplicación web que busca enlaces salientes y luego crea la entrada. Usted determina qué criterios se requieren para que una persona o un proceso automatizado "agreguen" un enlace, también puede filtrar o poner una lista negra en el momento en que esto sucede.

En el lado del servidor, tendría una base de datos. Usted agregaría a la base de datos al menos una identificación y la URL real. Puede decidir hacer algo más que solo números de identificación en orden, tal vez usar alguna función para crear números semi-aleatorios para evitar la enumeración simplemente incrementando el valor de identificación. Algo como

| id | real_url    | shortcode |
--------------------------------
| 1  | example.com | X3DFE     |
| 2  | example.net | G4TG      |

Luego puede tener una URL como: example.com/out?shortcode=X3DFE , procesa esto en el lado del servidor y luego emite un redireccionamiento a real_url si el código corto no está en la tabla de búsqueda, proporciona un mensaje de error que dice que no es válido.

Entonces, en el lado del servidor, algo como:

$shortcode = filter_function($_GET['shortcode']);
$url = sql_select_function("SELECT 'real_url' FROM url_table WHERE shortcode ='" . $shortcode . "');

header("HTTP/1.1 301 Moved Permanently"); 
header("Location: " . $url . ""); 

Los detalles dependerán, obviamente, de su idioma y otras tareas que desee realizar.

Su base de datos también puede incluir otra información, puede requerir moderación para los enlaces enviados por el usuario o puede incluir al usuario que creó los enlaces. También puedes grabar el número de visitas, etc.

El concepto clave es que utiliza algún mecanismo para predeterminar la lista y asegurarse de que la decisión de redireccionamiento se tome en el lado del servidor. La idea es crear una lista blanca de permitir redirecciones.

Recomendaría ver cómo algunos acortadores de URL funcionan como su concepto similar y pueden proporcionar algún código útil en su idioma de destino.

    
respondido por el Eric G 26.12.2015 - 17:03
fuente

Lea otras preguntas en las etiquetas