Protegiéndose de los ataques de la consola

0

Estoy creando una aplicación web usando PHP y jQuery Ajax para mi lado del cliente. Cuando estaba probando algunas cosas de seguridad, pensé en insertar una cuenta de usuario malintencionado con acceso de administrador en la base de datos ejecutando una llamada Ajax desde la consola del desarrollador en Google Chrome:

$.ajax({
    url: base_url + "callbacks/AccountSettingsCallback/addUpdateAccount",
    type: "POST",
    data: {
        "addUpdateAccount": 1,
        "id": ""
        "first_name": "hack",
        "last_name: "hack",
        "username": "gethack",
        "password": "1234",
        "account_type": 1
    },
    dataType: "JSON",
    success: function(data) {
        console.log("get hacked")
    }
});

Para mi sorpresa, realmente se ejecutó y los datos se insertaron en la base de datos, ¡aunque no haya iniciado sesión y no debería haber podido hacer eso!

Sé que esta es una vulnerabilidad muy crítica, por lo que mi pregunta es, ¿cuáles son las formas de prevenir este tipo de ataque? ¿Hay alguna forma de verificar a través de PHP si la solicitud vino desde la consola?

    
pregunta Akio 24.10.2017 - 09:14
fuente

4 respuestas

3

No, no puede saber si una solicitud vino de la consola, porque cuando tiene una aplicación cliente-servidor, el cliente y el servidor son cajas negras entre sí. Una solicitud podría provenir de la ejecución de javascript en el navegador, la consola del navegador, un cliente telnet, un programa hecho a mano o un grupo de monos que escriben caracteres aleatorios en teclados directamente conectados a un cable Ethernet. No hay forma de distinguir uno del otro.

Entonces, cuando maneje las solicitudes en el servidor, asegúrese de que el controlador de solicitudes cada compruebe la autenticación. Esto incluye manejadores para servicios web ajax. El hecho de que el usuario promedio no deba notar que existen no significa que nadie los encontrará. Por lo tanto, la secuencia de comandos que escucha el punto final callbacks/AccountSettingsCallback/addUpdateAccount necesita verificar la cookie de sesión del usuario (o qué otro mecanismo utiliza para rastrear las sesiones de usuario), verificar si el usuario tiene el permiso necesario para ejecutar esa operación y que los datos pasados a La operación es plausible. Además, debe implementar medidas adecuadas contra falsificaciones de solicitudes entre sitios para que los propietarios de otros sitios web no puedan crear aplicaciones web que hacer que el usuario llame a los servicios web ajax en su sitio.

    
respondido por el Philipp 24.10.2017 - 09:30
fuente
1

Hay dos escenarios diferentes:

  1. el usuario que usaste para ejecutar la solicitud tiene permiso para hacerlo.

    En este caso, es posible que no pueda hacer mucho al respecto, excepto la inserción de protección CSRF para hacer frente a eso y / o XSS.

  2. el usuario que usaste para ejecutar la solicitud no tiene permiso para hacerlo.

    En este caso, debe agregar la autenticación y el control de acceso a los puntos finales ajax todos .

respondido por el Tobi Nary 24.10.2017 - 09:27
fuente
0

Sí, PUEDE decir si se trata de una solicitud ajax (según su código de consola) o una solicitud regular. Vea aquí una implementación de PHP: enlace

Sin embargo, es inútil. No es 100% confiable y, lo que es más importante, la seguridad nunca debe ocurrir en el lado del cliente. Agregue chequeos del lado del cliente por conveniencia, pero siempre el 100% del tiempo, sin excepciones, filtre, desinfecte y valide el lado del servidor .

    
respondido por el Trickycm 24.10.2017 - 11:18
fuente
0

No, no hay forma de distinguir si una solicitud se realizó desde la consola o no. Tampoco hay ningún punto para intentarlo. No es solo que las solicitudes pueden ser enviadas desde la consola. El código JS de su aplicación podría modificarse, o las solicitudes podrían enviarse desde un programa que ni siquiera es un navegador, y no hay forma de que usted sepa la diferencia.

Por lo tanto, la seguridad debe aplicarse en el servidor. Nunca, nunca puedes confiar en el cliente para hacer cumplir la seguridad por ti.

Si solo puedes crear nuevos usuarios cuando inicias sesión con una cuenta que está autorizada para hacerlo, está bien. Alguien que puede crear usuarios creó un usuario, eso es todo.

Sin embargo, si creó ese usuario sin haber iniciado sesión como alguien autorizado para hacerlo, tiene grandes problemas. Claramente, el servidor no verifica correctamente si los usuarios tienen permiso para hacer cosas. Eso significa que tu aplicación está totalmente abierta al abuso, y probablemente deberías desconectarla hasta que puedas solucionarlo.

Entonces, ¿cómo lo arreglas? En el servidor, en cada punto final, debe comprobar si el usuario que ha iniciado sesión está autorizado para acceder a él, y denegar si no.

    
respondido por el Anders 24.10.2017 - 09:30
fuente

Lea otras preguntas en las etiquetas