CSRF Attack Detected - ¿Qué es?

Day 2,278, 18:33 Published in Spain Spain by MaTaJaRo


¡Saludos desde el manicomio!

Hoy vengo a explicaros lo que es el mensajito de CSRF Attack Detected, por qué aparece, y por qué los programadores de eRepublik aún no lo han arreglado.

Bien, lo primero... ¿Qué es un ataque tipo CSRF? CSRF son las siglas de "Cross-Site Request Forgery", o lo que es lo mismo, "Falsificación de Peticiones de Sitios Cruzados". Dicho ataque se produce cuando, creando un enlace a una web especialmente manipulado, podemos hacer que, si esa persona tiene una sesión iniciada en dicho sitio web, se produzca, de manera involuntaria, una acción determinada. Pongamos un ejemplo:

La página "banco.com" tiene un sistema para enviar dinero de un cliente a otro. En nuestro panel de control, tenemos un enlace para enviar dinero a Pepito, cuyo ID de usuario es "12345". En ese caso, el enlace que nos aparecería sería el siguiente:

www.banco.com/enviar_dinero.php?cantidad=200&destino=12345

[*] Cantida😛 200(€).
[*] Destino: 12345 (El usuario con ID 12345, en este caso, Pepito).

El origen del dinero (nosotros) es definido porque, previamente, habremos iniciado sesión en la página con nuestro usuario y contraseña. Bien...

¿Qué ocurriría si alguien manipulara ese enlace? Imaginaos a un atacante, con ID 54321. Dicho atacante se dedica a enviar correos electrónicos aleatoriamente, como podría ser:

Buenas, he visto esta foto tuya en esta página y la verdad es que me sorprende que pudieras hacer algo así... ¿Qué te ha pasado?

Si pasais el ratón por encima de "esta foto tuya", veréis que el enlace es el siguiente: www.banco.com/enviar_dinero.php?cantidad=1000&destino=54321

[*] Cantida😛 1000(€).
[*] Destino: 54321 (El usuario con ID 54321, en este caso, el atacante).

Si alguien que haya iniciado sesión en la página www.banco.com pulsa sobre dicho enlace, enviará 1000€ a la cuenta con ID 54321... Y el atacante podrá pagarse unas lujosas vacaciones a su costa. Y esto, señores, es un bonito ataque CSRF.

Ahora bien... ¿Cómo evitamos un ataque CSRF (de parte del servidor)?

Bien, para protegerse de el uso indiscriminado de estos enlaces, cuando se carga una página, se crea un identificador único para esa página llamado "token", que servirá para certificar que, efectivamente, hemos sido nosotros (y no otro) el que ha cargado dicha página y no se ha accedido externamente a través de un enlace malicioso. Dicho token varía de una petición a otra (cuando cambiamos de una página a otra, tenemos otro token diferente), y tiene un tiempo de caducidad. Cuando dicho tiempo de caducidad ocurre, aunque sigamos logueados en la web en cuestión, tendremos que volver a cargar la página para obtener otro token y que nuestras acciones sean válidas. Es por esto que si tratamos de ejecutar una acción que requiera un token válido, aparezca (aunque no sea cierto) el mensajito de CSRF Attack Detected. Esto implica enviar formularios (como crear entradas en el periódico, o leer los comentarios de los feeds).

Y finalmente... ¿Por qué aparece el mensaje de CSRF Attack Detected?

Bien, Apache (servidor HTTP que, supongo, será el que utilice este juego) tiene un plugin llamado "mod_security" que, entre otras cosas, tiene incorporado un sistema de protección contra ataques CSRF mediante el uso de csrf_token. Dicho plugin no está de ninguna manera creado ni soportado por los creadores de eRepublik, por lo que ellos no pueden hacer nada por que dicho mensaje desaparezca. De hecho, que aparezca ese mensaje es muestra de que, al menos, la seguridad se la toman en serio.

No es fallo de eRepublik, es el protocolo que se ha de seguir para garantizar la seguridad. Si te tiras dos horas en una misma página, no haces nada, y publicas tu tochopost sin hacer un CTRL+C al menos, te la juegas a que te salga el mensajito del CSRF Attack Detected.

Todo esto lo cuento desde el conocimiento que tengo, pues las páginas web son a lo que me dedico en la vida real.

Espero no haberos abrumado con mi artículo, cualquier duda, contestaré por comentarios (y algo más en profundidad, por MP).

¡Saludos locuelos!