miércoles, 9 de junio de 2010

Falsear votaciones de LaSexta

Últimamente estoy hablando mucho sobre los bookmarklets pero es que realmente tienen muchas aplicaciones. Normalmente son pequeños scripts que nos facilitan la vida al realizar tareas monotonas pero también permiten acceder a funcionalidad de la página lo cual puede ser "peligroso" si el programador no ha previsto que el usuario pueda hacer llamadas con parámetros modificados.

Concretamente, en LaSexta.com, son las votaciones las que pueden ser victima de este tipo de "ataques" ya que el programador ha supuesto que nadie alteraria los parámetros de entrada de sus funciones.

Veamos un ejemplo. Si accedemos esta página de LaSexta.com vemos un video de Dani Mateo en el programa "Se lo que hicisteis...", y un sistema de votaciones con las típicas estrellitas abajo a la derecha.


Si somos algo curiosos y miramos el código fuente de la página veremos que cada una de las estrellas tiene asociado un código javascript que se ejecutará al pulsar sobre ella.


Se puede apreciar que al pulsar sobre las estrellas se llama a la función votar indicandole un código que, a priori, no nos dice nada pero llama la atención ver como el primer caracter se corresponde con el número de puntos a sumar a la votación.

votar('1_155802_28_3_11') -- 1 punto
votar('2_155802_28_3_11') -- 2 puntos
votar('3_155802_28_3_11') -- 3 puntos
votar('4_155802_28_3_11') -- 4 puntos
votar('5_155802_28_3_11') -- 5 puntos

¿Que pasaría si forzamos una llamada a la función votar modificando ese parámetro?, por ejemplo:

votar('100_155802_28_3_11')

¿Se contabilizarian 100 puntos?. Para probarlo podemos escribir este código en la barra del navegador, al estilo de un bookmarklet.


Vaya, parece que no hemos tenido exito y la votación no ha sido reconocida, o, por lo menos, esa es la sensación que da al ver el texto "Undefined" junto a las estrellas de la votación. Debe ser que el programador ha tenido en cuenta este problema y verifica los datos de entrada de la función... ¿o no?

Veamos con otro ejemplo:
votar('5+70_273381_2_1_10')

Nuevamente, lo ejecutamos en la barra de direcciones del navegador y... ¡sorpresa!


¿Su voto fué guardado correctamente? ¿querra decir esto que efectivamente se ha actualizado la votación? ¿cuantos puntos se habrán contabilizado? Todas estas preguntas tienen respuesta al recargar la página ya que vemos que el computo final de la votación asciende a ¡¡¡75 votos!!!


Así que se puede apreciar que el código javascript modificado ha tenido exito y, de 0 votos ha pasado a tener 75, es decir 0+5+70. Curioso ¿verdad? ¿querrá decir esto que se puede indicar cualquier operación aritmética como parámetro en la función votar? vamos a ver otro ejemplo...

votar('5-15_155802_28_3_11')

Al ejecutarlo en el navegador podemos ver que efectivamente, se le han restado 10 votos (5-15 = -10) y que actualmente la votación tiene 65 puntos, es decir, 75+5-15.


Con lo que parece que se puede concluir que la función votar acepta cualquier tipo de operación aritmética de forma que es facil manipular este tipo de votaciones, incrementando o decrementando el número total de votos a nuestro gusto.

Una cosa a tener en cuenta en este proceso es que tanto el código de la función votar como el código utilizado para visualizar el número de votos se encuentra en el lado del cliente (código HTML/Javascript) por lo que normalmente el navegador lo tendrá cacheado y es por eso que parezca que no siempre se modifica la votación cuando debería (con borrar la caché se verá la votación actualizada). También hay que tener en cuenta que el sistema de votaciones de LaSexta no funciona demasiado bien con Internet Explorer (yo he usado Firefox) por lo que si lo intentais utilizando IE es posible que obtengais algún error de JavaScript.

No hay comentarios:

Publicar un comentario