Estoy construyendo un servicio web que utiliza exclusivamente JSON para su contenido de solicitud y respuesta (es decir, sin cargas útiles codificadas en forma).
¿Es un servicio web vulnerable al ataque CSRF si se cumple lo siguiente?
Cualquier
POST
solicitud sin un objeto JSON de nivel superior, por ejemplo,{"foo":"bar"}
será rechazada con un 400. Por ejemplo, unaPOST
solicitud con el contenido42
sería rechazada.Cualquier
POST
solicitud con un tipo de contenido diferente aapplication/json
se rechazará con un 400. Por ejemplo, unaPOST
solicitud con un tipo de contenidoapplication/x-www-form-urlencoded
se rechazará.Todas las solicitudes GET serán seguras y, por lo tanto, no modificarán ningún dato del lado del servidor.
Los clientes se autentican a través de una cookie de sesión, que el servicio web les proporciona después de proporcionar un par de nombre de usuario / contraseña correcto a través de un POST con datos JSON, por ejemplo
{"username":"[email protected]", "password":"my password"}
.
Pregunta auxiliar: ¿Son PUT
y las DELETE
solicitudes alguna vez vulnerables al CSRF? Lo pregunto porque parece que la mayoría (¿todos?) Los navegadores no permiten estos métodos en formularios HTML.
EDITAR: elemento agregado # 4.
EDITAR: Muchos buenos comentarios y respuestas hasta ahora, pero nadie ha ofrecido un ataque CSRF específico al que este servicio web sea vulnerable.
Respuestas:
Forjar solicitudes CSRF arbitrarios con los tipos de medios arbitrarios es efectiva sólo es posible con XHR, porque un método de formulario se limita a GET y POST y un cuerpo del mensaje POST del formulario también está limitada a los tres formatos
application/x-www-form-urlencoded
,multipart/form-data
ytext/plain
. Sin embargo, con la codificación de datos del formulariotext/plain
, todavía es posible falsificar solicitudes que contengan datos JSON válidos .Entonces, la única amenaza proviene de los ataques CSRF basados en XHR. Y esos solo tendrán éxito si son del mismo origen, por lo que básicamente de su propio sitio de alguna manera (por ejemplo, XSS). Tenga cuidado de no confundir la desactivación de CORS (es decir, no configurar Access-Control-Allow-Origin: *) como protección. CORS simplemente evita que los clientes lean la respuesta. El servidor aún envía y procesa toda la solicitud.
fuente
application/json
que se usa para mantener a raya los ataques CSRF en esta respuesta. El estándar propuesto le permitirá establecer enctypeapplication/json
, lo que anularía las verificaciones de tipo de contenido descritas en la respuesta y abriría la aplicación a CSRF.application/json
publicaciones de formulario deben cumplir con la misma política de origen, lo que significa que el ataque no es más fuerte que XHR.Sí, es posible. Puede configurar un servidor atacante que devolverá una redirección 307 al servidor de destino a la máquina víctima. Necesita usar flash para enviar el POST en lugar de usar Form.
Referencia: https://bugzilla.mozilla.org/show_bug.cgi?id=1436241
También funciona en Chrome.
fuente
Es posible hacer CSRF en servicios Restful basados en JSON usando Ajax. Probé esto en una aplicación (usando Chrome y Firefox). Debe cambiar contentType a text / plain y dataType a JSON para poder realizar una solicitud de verificación previa. Luego puede enviar la solicitud, pero para enviar datos de sesión, debe configurar el indicador withCredentials en su solicitud ajax. Discuto esto con más detalle aquí (se incluyen referencias):
http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html
fuente
Tengo algunas dudas sobre el punto 3. Aunque se puede considerar seguro, ya que no altera los datos del lado del servidor, los datos aún se pueden leer y el riesgo es que puedan ser robados.
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/
fuente
Si. Sigue siendo HTTP.
si
¿Crees que un navegador es la única forma de realizar una solicitud HTTP?
fuente