Comprobaciones en el cliente
Necesitaba saber si esa comprobación
se hacía sólo en la parte cliente, en el navegador, o si el router
también lo miraba. De ser sólo en el cliente sería fácil saltarse
la restricción. Por ejemplo, en Firefox se podría utilizar las
herramientas para desarrollador web del navegador para localizar el
punto en que se fija la longitud máxima...
… y cambiar el 16 por 1600...
Y con eso me podría poner a escribir a
gusto. Probé entonces a poner como marca y modelo:
";alert("XSS");aaa=" |
… pero, a pesar de todo mi trabajo, no me hizo caso.
La página comprobaba si en la marca y
el modelo había caracteres “raros”. Pero... ¿qué pasaría si
yo realizaba la petición directamente al servidor y evitaba el
código JavaScript de la página?
Para probar, utilicé un proxy que
permite interceptar y modificar las peticiones que realiza el
navegador. El que tenía más a mano era WebScarab. Un poco
anticuado, sí, pero aún válido para muchas cosas. Lo inicié,
indicándole que quería interceptar todas las peticiones, y
configuré el navegador para que lo usara.
Después, rellené el formulario de
configuración de impresora con valores válidos e hice clic en
aceptar. Webscarab me presentó la petición y se puso a mis órdenes:
Yo, confiado, sustituí el valor de
ippMake
… y le dije a Webscarab que siguiera
adelante con la petición. La respuesta del router traía regalo:
¡Un XSS que permite inyectar
directamente dentro del código JavaScript! Eso no se lo encuentra
uno todos los días.
MORALEJA: Está muy bien eso de
restringir la longitud de los campos de texto y los caracteres que
pueden contener, porque así puedes poner difícil las cosas a quien
quiera hacer un uso indebido del sistema. Pero si sólo lo haces en
la parte cliente, si no realizas también esas comprobaciones en la
parte del servidor, estos controles pueden ser fácilmente evitados.
Además, había otra cosita que no me
entretuve en estudiar. Parece que el programa del router no comprueba
adecuadamente los límites, los tamaños, de las variables, porque
una prueba que hice fue poner una cadena un poco más larga de la
cuenta como marca/modelo:
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 |
… y por la respuesta del router,
parecía que me había metido en el principio de otra cadena, puesto
que me mostraba el final de ésta (“/dev/printer0”) concatenada
con lo que yo había puesto.
Un overflow que, bien aprovechado,
quizá diera mucho juego. Pero eso es otra historia...
No hay comentarios:
Publicar un comentario