¿Por qué la misma política de origen hace que mi PoC falle cuando no necesito leer los datos de devolución?

3

Estoy realizando un análisis de vulnerabilidad autorizado en un servicio web personalizado y he descubierto una vulnerabilidad CSRF.

Debido a que no hay tokens de formularios junto con el servicio sin verificar el encabezado de origen, creí que podía falsificar solicitudes a través de POST de AJAX desde una página de prueba de concepto "infectada".

Debido a la forma en que el servidor web mantiene el estado, se requieren una serie de seis POST secuenciales para completar mi ataque. Aquí viene el problema:

Mi primer PoC involucró la creación de seis páginas html simples (cada una con un formulario) que cargaría y enviaría una por una, con el fin de validar mis suposiciones. Esto funcionó bien, así que convertí estas acciones de formulario a POST AJAX secuenciales. Mi ataque dejó de funcionar en este punto. Comparé las solicitudes HTTP reales tanto para el contenido como para el pedido: todas las coincidencias de datos de la capa de aplicación.

Sospeché de la misma política de origen por algún motivo, a pesar de que NO tuve que leer ningún dato de devolución, así que inicié Chrome con la opción --disable-web-security (para deshabilitar la política), probé mi ataque nuevamente, y esto tiempo que tuvo éxito. Parece que la misma política de origen está de alguna manera impidiendo mi ataque, pero no tengo idea por qué ya que no necesito leer ningún dato devuelto. ¿Qué es lo que no entiendo? ¿En qué no he pensado? ¿Hay alguna forma de lograr lo que quiero hacer?

    
pregunta Ryan 17.10.2014 - 04:30
fuente

3 respuestas

2

No hay razón para que esto no funcione siempre que las cookies de terceros estén habilitadas en su navegador.

Se pueden usar los POST de formulario HTML, o en el caso de que los formularios sean un proceso de múltiples etapas, esto será más útil para ejecutar como solicitudes XHR, ya que su página de ataque puede controlar las solicitudes y emitirlas a su vez, solo como tu estas haciendo.

Asegúrese de que está configurando withCredentials en sus solicitudes de AJAX.

En jQuery esto se hace de la siguiente manera

$.ajax({
  type: "POST",
    url: 'http://www.example.com/Controller/Action',
    data: 'foo=bar',
    async: true,
    xhrFields: {
      withCredentials: true
   }
});

Otras respuestas sugieren que usar withCredentials significa que una CORS se envía una solicitud antes del vuelo a la recurso en lugar del GET o POST previsto. Este no es el caso siempre que la solicitud sea una "solicitud simple". Si su exploit trabajó con formularios HTML, entonces el equivalente correcto de AJAX sería una simple solicitud, así que verifique que todo su código sea correcto.

  

Las solicitudes de origen cruzado vienen en dos tipos:

     
  • solicitudes simples
  •   
  • "solicitudes no tan simples" (un término que acabo de inventar)
  •   

Las solicitudes simples son solicitudes que cumplen con los siguientes criterios:

     
  • El método HTTP coincide (distingue entre mayúsculas y minúsculas) uno de:

         
    • CABEZA
    •   
    • GET
    •   
    • POST
    •   
  •   
  • coincidencias de encabezados HTTP (no distinguen mayúsculas y minúsculas):      
    • aceptar
    •   
    • Aceptar-Idioma
    •   
    • contenido-lenguaje
    •   
    • ID del último evento
    •   
    • Tipo de contenido, pero solo si el valor es uno de los siguientes:      
      • application / x-www-form-urlencoded
      •   
      • multipart / form-data
      •   
      • texto / plano
      •   
    •   
  •   

Las solicitudes simples se caracterizan como tales porque ya se pueden realizar desde un navegador sin usar CORS.

Esto se menciona en realidad en la especificación de CORS e indica que CORS no agrega seguridad, solo habilita la cruz -dominio de la comunicación cuando tanto el cliente como el servidor optan por la especificación. Si ambas partes no se inscriben (como en un ataque CSRF en el que el sitio de la víctima no desea ser comunicado de esta manera), el navegador actuará de manera similar a pre-CORS. es decir, se enviarán cookies aunque la respuesta no será legible:

  

los recursos que se ajustan a esta especificación siempre deben estar preparados para esperar solicitudes de origen cruzado simples con credenciales. Debido a esto, los recursos para los cuales las solicitudes simples tienen un significado distinto al de la recuperación deben protegerse de la falsificación de solicitudes entre sitios (CSRF) al exigir la inclusión de un token indiscutible en el contenido de la solicitud proporcionado de forma explícita.

Vuelve a tu pregunta:

  

Comparé las solicitudes HTTP reales tanto para el contenido como para el pedido: todas las coincidencias de datos de la capa de aplicación.

Le sugiero que utilice un proxy de interceptación como Burp o Fiddler2 para verificar las solicitudes. La verificación de las solicitudes desde el interior del navegador no es una forma precisa de verificar esto porque las solicitudes que se ven en Chrome están sujetas a la interpretación del Origen de la página desde la que se emiten y si el Origen no ve la respuesta debida a la misma Política de origen, entonces tampoco lo harás en herramientas de desarrollo. Chrome te informa de esto a través del mensaje “CAUTION: provisional headers are shown” .

Por ejemplo, la siguiente es la misma solicitud que se muestra en las herramientas de desarrollo de Chrome y luego en Burp. Observe que solo la herramienta externa muestra las cookies.

He probado este comportamiento con Chrome 38, Firefox 32 e Internet Explorer 11 en Windows 7 x64, y es consistente en todos los navegadores (sin embargo, asegúrese de que las cookies de terceros estén habilitadas en la configuración), por lo que esto es una indicación más de que esto El comportamiento cumple con las normas actuales.

Por lo tanto, mi consejo es que compruebe dos veces su código y las solicitudes utilizando un proxy interceptor. Tal vez los publique aquí para que otro par de ojos compruebe que está funcionando de una manera pero no la otra, entonces debe haber un error en alguna parte porque las solicitudes no serán las mismas.

Además, asegúrese de que su código no salga antes debido al error devuelto debido a la violación de la Política del mismo origen.

    
respondido por el SilverlightFox 19.10.2014 - 11:29
fuente
0

Intenta atrapar el error sin nada. El error SOP genera una excepción, lo que detiene la ejecución de su script. Si, en cambio, detecta el error, la solicitud se rechazará, se filtrará su respuesta, se lanzará una excepción que se detectará y su secuencia de comandos continuará con la siguiente solicitud.

Básicamente, ahora funciona así:

attackstep1() << script stop here due to a exception, thus only step1 of attack is performed
attackstep2()
attackstep3()
.....

En su lugar, intente algo como esto:

try {
attackstep1()
}
Catch(e) {}
try {
attackstep2()
}
Catch(e) {}
try {
attackstep3()
}
Catch(e) {}
try {
....
}
Catch(e) {}

Esto ignorará el error de permiso SOP y continuará la ejecución del script. Tenga en cuenta que no obtendrá acceso a ningún recurso que devuelva el recurso protegido.

    
respondido por el sebastian nielsen 17.10.2014 - 05:43
fuente
0

El mensaje de error que recibió es porque Intercambio de recursos de origen cruzado (CORS) no está habilitado en la servidor intentas atacar Por lo tanto, todas las solicitudes de AJAX no serán aceptadas por el servidor que hospeda los servicios web.

Por lo tanto, si habilita CORS en su servidor de destino, el servidor aceptará sus solicitudes AJAX. No utilice AJAX, ya que si CORS no está habilitado, se rechazará su solicitud. Puede usar las herramientas de línea de comandos de curl a nice que pueden llamar a servicios web.

    
respondido por el Ubaidah 17.10.2014 - 06:05
fuente

Lea otras preguntas en las etiquetas