¿Por qué funciona esta vulnerabilidad Laravel CSRF?

3

Recientemente se actualizó Laravel 4 para solucionar un problema de seguridad: hubo una vulnerabilidad CSRF en su código .

Aquí está el código antiguo:

if (Session::token() != Input::get('_token'))
{
    throw new Illuminate\Session\TokenMismatchException;
}

Y aquí está su corrección (note el !== ):

if (Session::token() !== Input::get('_token'))
{
    throw new Illuminate\Session\TokenMismatchException;
}

Entiendo la diferencia entre == y === en PHP (básicamente este último es más estricto porque verifica el tipo), y entiendo qué es CSRF y cómo abordarlo, pero no entiendo completamente por qué este caso específico crea una vulnerabilidad, o cómo un atacante la explotaría.

    
pregunta Jason 24.11.2014 - 13:57
fuente

2 respuestas

3

Chrismsnz aquí ...

En pocas palabras, DarkLighting está bastante bien.

Input::get() generalmente lee desde los parámetros de solicitud, pero si la solicitud es JSON, entonces lee desde el cuerpo de JSON. JSON le permite especificar el tipo de datos, por lo que en lugar de una cadena de token CSRF, envié un int (0) que pasará esa comparación perdida la mayor parte del tiempo.

El otro truco es que normalmente no puede enviar solicitudes JSON entre sitios, debido a la comprobación de CORS en los navegadores. Sin embargo, Laravel tiene una comprobación JSON muy deficiente, básicamente verifica si la cadena '/json' está en algún lugar del tipo de contenido y si está allí, ejecuta toda la solicitud a través de un analizador JSON y la alimenta en Input .

Por lo tanto, puedes explotarlo usando algo como esto (ejemplo de jQuery)

$.ajax("http://<laravel app>/sensitiveaction", {
    type: 'post',
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8; /json',
    data: '{"sensitiveparam": "sensitive", "_token": 0}',
});
    
respondido por el Chris S 17.02.2015 - 03:47
fuente
3

Parece que fue una divulgación privada, por lo que parece que no lo sabremos con seguridad a menos que alguien se tome el tiempo para analizar el código del marco (o @chrismsnz decide explicárnoslo).

Pero por lo que pude ver, parece que Session :: token () devuelve una cadena y Input :: get () devuelve un objeto mixed

Por la explicación más bien corta que dieron, el investigador encontró una manera de hacer que la variable contenga datos arbitrarios usando JSON , pero el valor no tenía el tipo correcto ( cadena ). Como el marco solo comprobaba el valor correcto, pudo omitir el filtro.

    
respondido por el DarkLighting 24.11.2014 - 18:41
fuente

Lea otras preguntas en las etiquetas