Monday, February 14, 2011

¿Cómo sé si tengo un script malicioso en mis páginas web?

Hola a todos,

Estoy desempolvando este blog con motivo de una pregunta que me hizo @Dary_urias en twitter, la cual decía: Que herramienta puedo utilizar para saber si tengo un script malicioso en mis paginas web?

Para poder responder esa pregunta, me gustaría en primer lugar definir qué es un script malicioso: se le puede considerar así a cualquier secuencia de líneas de código que realicen una acción no deseada por el usuario o no legítima (me acabo de inventar esa definición :p)

Por simplicidad supongamos que tenemos http://www.sitio.com que es una aplicación web en PHP. Para poder detectar un script debemos saber cómo es que llegó dicho script a nuestro sitio, les presento las opciones principales que he visto:

1) Introducido en el código PHP por el webmaster / atacante:
Lo importante es darse cuenta que la aplicación ("aplicativo", sitio web, página, etc, como gusten llamarle) ha sido modificada de tal manera que se está haciendo algo no deseado por el usuario. 

A menos de que el código realice alguna acción del lado del cliente (en el browser, con código HTML y/o javascript), no hay forma de detectarlo a menos que se haga una revisión manual línea por línea del código en busca de algo "sospechoso". Podríamos suponer que el atacante está enviándose datos del usuario usando la función mail() de PHP. Dicha acción sería completamente transparente para el usuario/browser y nunca se daría cuenta (aún un usuario avanzado, o inclusive el administrador del sistema)

¿Entonces cómo lo detecto?
Es prácticamente imposible, la única manera es revisar el código fuente línea por línea.

2) Introducido en código PHP, pero hace uso de HTML/JS
Pero qué pasa si el atacante está haciendo uso de HTML? Digamos, insertó dentro de PHP un código que hace que se le imprima al usuario un tag de imagen (), algún iframe o alguna función de JavaScript.

Este escenario es diferente del anterior debido a que en este caso el usuario/browser si se dará cuenta de lo que está pasando (aunque no sea aparente a la vista). Al insertar este tipo de código HTML se busca hacer llamadas hacia sitios externos con un fin determinado, como lo pueden ser robo de sesión o ejecutar acciones a nombre del usuario. 

¿Cómo lo detecto?
Este es el más simple de los casos, puedes analizar los requests HTTP que hace tu sitio y si se llegara a detectar un request hacía otro dominio ahí lo tienes. Existen muchas herramientas (proxies y plugins) que podrían ayudar. En lo personal recomiendo Firebug para Firefox.

En esta imagen se muestra que en firebug al entrar a twitpic.com se hacen varios requests hacía otros sitios como lo son google.com y twitter (salen en rojo porque los bloquea el proxy corporativo xD pero esa es la idea jo jo). De esta manera se podrían dar cuenta si se está haciendo una llamada hacia un sitio externo y así determinar un probable script malicioso.



3) Introducido por el usuario (cross-site scripting)
En este punto asumiré que conocen lo que es un XSS, así que al tener una vulnerabilidad de este tipo el código de la aplicación nunca se modificó y fue posible que un atacante introdujera dicho script gracias a una funcionalidad misma de la aplicación. Digamos una sección de comentarios (o un blog xD)

¿Cómo lo detecto/soluciono?
Se puede aplicar el mismo principio que en el caso anterior para detectar llamadas a sitios externos y es mucho más simple de eliminar, únicamente se borra el registro en la base de datos y listop. (claro, se tendría que modificar la aplicación para que no vuelva a ocurrir dicho ataque pero eso ya lo dejamos para otro post :P)
-------------------------------------------


Espero haber resuelto la duda de @Dary_urias, lamento si hice esto un poco técnico pero así era necesario D: Cualquier cosa me pueden encontrar en @vladkov y pues claro que en las sección de comentarios de este blog mismo

C ya!

1 comment:

Dariela Urías said...

Muchas gracias por el post!, y no fue nada dificil entenderte aunque hayas (asi se escribe hayas XD?) escrito en lenguaje tecnico, desgraciadamente suele entenderte,Saludos! y una vez mas gracias