los peligros del informador

27 de agosto de 2009

Una de las cosas que más gusta a un programador es saber en que servidor y que configuración por defecto tiene antes de empezar a programar su Web. Para los programadores de PHP tenemos una función muy bonita llamada phpinfo() que nos muestra una tabla colorida con toda la información de estado actual del motor de PHP, la versión del sistema Linux (o Windows), la ruta por defecto del php.ini, los módulos cargados del Apache, etc.

Muchas veces estas paginas quedan olvidadas dentro de nuestra aplicación Web a la espera que gente "despistada" las llame... nombres como hello.php, info.php e incluso phpinfo.php es lo normal.
Una búsqueda rápida en Yahoo o Google nos da una idea de los despistados programadores que han ido dejando sus pruebas.


La información que puedes encontrar en estas paginas es muy valiosa para la gente "con mucho tiempo libre", ya que puede encontrar números de versiones, módulos de Apache a los cuales poder atacar si existiera un bug, estado de los permisos de archivo o safe_mode o incluso en la variable path puedes encontrar otro tipo de software que corre en la maquina, como por ejemplo: NetBackups, tools de servidores Dell, antivirus, etc.

formularios php con muuu (parte ii de ii)

24 de agosto de 2009

muu posee diferentes tipos de datos que podrán utilizarse dentro de la función addField(). Estos pueden ser: text, textarea, password, select, radio o checkbox. Como vemos representan las estrucutas típicas de un formulario HTML.

Estos son algunos ejemplos:

$form->addField("text", "fecha", "Fecha de compra", array("instructions"=>"En 
       formato dd/mm/aaaa"));
$form->addField("checkbox", "vehiculo", "¿Qué vehiculo tienes?", 
       array("checkbixValues"=>array("moto"=>"Motocicleta","coche"=>"coche")));
$form->addField("select", "colores", "Seleccione un color", 
       array("selectValues"=>array("rojo"=>"Rojo","Azul"=>"Azul")));
$form->addField("radio", "sexo", "Sexo", 
       array("radioValues"=>array("hombre"=>"Hombre","mujer"=>"mujer")));
$form->addField("textarea", "opinion", "Su opinion");

Por otro lado, tambien tenemos un montón de tipos de reglas de validación. Veamos las más importantes:

- required: el campo no puede estar vacio.
- email: el campo debe ser una dirección de correo.
- emailorblank: el campo debe ser una dirección de correo o estar en blanco.
- rangelength: la longitud del campo debe estar dentro de un minlength y un maxlength
- equal: el valor del campo debe ser igual a otro valor
- lettersonly: el valor del campo debe tener solo letras
- aphanumeric: el valor del campo contiene letras y numeros
- numeric: el valor del campo contiene solo numeros
- maxvalue: el valor del campo no puede ser mayor del maxvalue
- minvalue: el valor del campo debe ser mayor que el minvalue
- float: el valor del campo debe ser un numero real
- integer: el valor del campo debe ser un numero entero
- ip: el valor del campo debe ser una dirección IP
- url: el valor del campo debe ser una dirección URL
- date: el valor del campo debe contener una fecha en formato dd/mm/aaaa.

Existen otras más y por si aun no se nos satisface nuestras necesidades siempre podemos utilizar la opción de regla "regex" que nos permite crear nuestra propia expresión regular para satisfacer nuestra propia regla de filtrado.

Veamos algunos ejemplos de estas reglas:
$form->addRule("required", "apellido", "El apellido no puede estar en blanco");
$form->addRule("date", "fecha_compra", "La fecha de compra no es correcta");
$form->addRule("rangelength", "password" , "La contraseña debe tener más de 3 
               caracteres", array("minlength"=>4,"maxlength"=>256) );
$form->addRule("equals", "clave", "Contraseñas diferentes", array("equalfield"=>"clave2"));

Para finalizar y una vez comprendido cómo funciona muuu, este es el código completo de una pagina de login desarrollada utilizando las librerías de muuu:
<?php
   include_once("muuu-v0.5.class.php");
   
   //--- campos de mi formulario
   $form= new muuu("form", "post", "login.php");
   $form->addField("text", "login", "Usuario: ", array("instructions"=>"(utiliza tú 
                   dirección de correo)") );
   $form->addField("password", "password", "Contraseña: ");
   $form->addField("submit", "boton", "", array("fieldAdd"=>"value='Enviar'"));

   //--- reglas de mi formulario
   $form->addRule("email", "login", "El nombre de usuario tiene que ser una 
                  direccion de correo válida.");
   $form->addRule("rangelength", "password" , "La contraseña debe tener más de 3 
                  caracteres", array("minlength"=>4,"maxlength"=>256) );
   
   if ( $form->formSuccess() == true ) {
      //--- procesamos los datos del formulario. En este caso se trata de una validación de usuario
      if ( $form->formValue("login")=="usuario@miempresa.com" &&
           $form->formValue("password")=="12345" )
         echo "Ok, estas dentro";
      else
         echo "Este usuario no es correcto";      
   } else {
      //--- arrancamos el formulario
      $form->startForm();
      echo "<fieldset>";
      echo "<legend>Inicio</legend>";
      //--- imprimimos el formulario
      foreach ( $form->fieldsarray as $key=>$value ) {
         echo "<p><label for='$key'>" . $form->labelsarray[$key] . "</label>$value</p>";
         echo "<p id='instructions'>" . $form->instructionsarray[$key] . "</p>";
         echo "<p id='error'>" . $form->errorarray[$key] . "</p>";   
      }
      echo "</fieldset>";
      $form->endForm();
   }
?>


formularios php con muuu (parte i de ii)

23 de agosto de 2009

Aunque suene a mugido de vaca española, "muuu" es una clase en PHP para facilitar a los programadores el desarrollo de formularios en PHP. Resulta muy pesado el escribir todo el código HTML del form, los campos, luego validarlos, repetir el campo si este no es correcto...

Para solucionar esto existe una librería libre llamada muuu que con dos funciones addField() y addRule() nos permite crear campos en nuestro formulario y lo más importante crear reglas que validen nuestro formulario. Para ver como funciona imaginemos que queremos una pagina PHP para validar a un usuario (una login.php). Con dos campos: nombre de usuario y contraseña. Como dos reglas, el nombre de usuario será una dirección de correo y la contraseña deberá tener más de 3 caracteres. Si no se cumple ninguna de estas reglas, el formulario no se procesa.

Lo primero que tenemos que hacer es cargar la librería, crear el formulario y añadir los campos que necesitamos (dos campos de texto y el botón de enviar):

   include_once("muuu-v0.5.class.php");
   $form= new muuu("form", "post", "login.php");
   $form->addField("text", "login", "Usuario: ", array("instructions"=>
                   "(utiliza tú dirección de correo)") );
   $form->addField("password", "password", "Contraseña: ");
   $form->addField("submit", "boton", "", array("fieldAdd"=>"value='Enviar'"));

Posteriormente debemos crear las reglas que deben cumplir nuestros campos. El usuario debe ser una dirección de correo electrónico y la contraseña debe tener más de 3 caracteres:
   $form->addRule("email", "login", "El nombre de usuario tiene que ser una 
                  direccion de correo válida.");
   $form->addRule("rangelength", "password" , "La contraseña debe tener más de 3 
                  caracteres", array("minlength"=>4,"maxlength"=>256) );

Una vez configurado nuestro formulario solo falta arrancarlo, imprimirlo en la Web y procesar el formulario si todos los campos han pasado las reglas:
   if ( $form->formSuccess() == true ) {
      //--- procesamos el formulario
   } else {
      //--- arrancamos el formulario
      $form->startForm();
      foreach ( $form->fieldsarray as $key=>$value ) {
         echo "<p><label for='$key'>" . $form->labelsarray[$key] . "</label>
              $value</p>";
         echo "<p id='instructions'>" . $form->instructionsarray[$key] . "</p>";
         echo "<p id='error'>" . $form->errorarray[$key] ."</p>";   
      }
      echo "</fieldset>";
      $form->endForm();
   }

El próximo post veremos el código completo de login.php

obtener todas las direcciones de correo

18 de agosto de 2009

La siguiente linea de comandos obtiene todas las direcciones de correo que aparecen dentro del log de Zimbra o cualquier otro archivo de log.

# sed -n -e '/postfix\/smtp\[.*status=sent/s/^.*to=<\([^>]*\).*$/\1/p' /var/log/zimbra.log | sort -u


hackeando el cristal glaseado con celo

7 de agosto de 2009



orden de preferencias en mysql

3 de agosto de 2009

En infomática por regla general la multiplicación y la división tienen preferencia sobre operaciones como la suma y la resta. Algo similar tambien sucede con operaciones lógicas como AND y OR. Las ANDs tienen preferencia sobre las OR. Una mala construcción de una consulta SQL nos puede jugar malas pasadas:

select true and false --> FALSE
select true or true and false --> TRUE

Esta característica se puede utilizar para saltarse mediante injección SQL paginas de login (en este caso PHP) que tengan una consulta así:
$sql = "
   SELECT * 
   FROM users 
   WHERE username='".$_POST["username"]."' AND password='".md5($_POST["psw"])."'";

Como vemos el campo password no es injectable ya que cualquier valor introducido es filtrado por una función. En este caso un hash md5.
El único parámetro injectable es username. Pongamos lo que pongamos en username siempre arrastraremos un "AND password=md5()" que por tanto deberá evaluarse.

Si tenemos en cuenta la prioridad en las operaciones AND/OR de MySQL podemos injectar con:
Username: ' or username<>'' or password<>'
Password: foo

La consulta SQL queda así:
SELECT * 
FROM users 
WHERE username='' or username<>'' or password<>'' 
      AND password='acbd18db4cc2f85cedef654fccc4a4d8'

La consulta siempre será evaluada a TRUE.

proteger ficheros en apache para su descarga

29 de julio de 2009

Muchas veces cuando programamos directamente sobre una carpeta del DocumentRoot dejamos sin querer todo tipo de archivos como backups de una carpeta, volcado sql de una tabla, backup de un archivo php generado por nuestro editor de texto, archivos de include, etc. Todos estos archivos quedan disponibles para la descarga.

La directiva <FilesMatch> de Apache evita que cualquier archivo no deseado con información sensible pueda ser descargada. Para ello simplemente tenemos que pasarle una expresión regular con los archivo que queremos denegar el acceso y el Apache devolverá un error 403 cada vez que se intente acceder a ellos:

<FilesMatch "\.(old|bak|tgz|sql|inc|tar\.gz|zip|rar)$">
   Order Deny,Allow
   Deny from All
</FilesMatch>

La ultima vez que utilicé esto era para proteger dumps de SQL que se generaban automáticamente (ddmmaaa-backup.sql.tgz) y que por narices debían de permanecer dentro del DocumentRoot de la aplicación.

Solo hace falta darse un a vuelta por la Google Hacking Database para encontrar todo tipo de ficheros como estos por Internet.

¿qué es ITIL? (ii de ii)

24 de julio de 2009

3. Transmisión del servicio

Consiste en preparar y dejar listo el servicio garantizando el menor impacto posible sobre los servicios en producción, las operaciones y la propia organización. Esta fase consta de tres procesos: gestión de cambios, gestión de la configuración y gestión de versiones.

La gestión de cambios tiene como objetivo emplear medios y procedimientos estandarizados para una tramitación eficaz y rápida de todos los cambios, a fin de reducir al mínimo el impacto sobre los servicios relacionados. Se define la figura del comité de cambios como un asesor que se reúne periódicamente para evaluar cambios y ayudar a priorizarlos.

La gestión de la configuración define y controla todos los componentes de una infraestructura IT y mantiene una base de datos con toda la información de las configuraciones (CMDB, Configuration Management Database).

Por último la gestión de versiones garantiza que existen planes de cambios y despliegues necesarios para mantener la alineación con los clientes y el negocio en los proyectos de cambios. Asegura que las versiones podrán crearse, instalarse, testearse y desplegarse exitosamente dentro de los plazos establecidos.

4. Operación del servicio

Consiste en coordinar y ejecutar las actividades, procedimientos y procesos necesarios para entregar y gestionar servicios con los niveles acordados. En esta fase se administra el servicio contratado por el cliente y se le da soporte.

Aparecen cinco procesos: gestión de incidencias, gestión de problemas, gestión de peticiones de servicio, gestión de accesos y gestión de eventos.

La gestión de incidencias tiene como objetivo restaurar la operación normal del servicio tan rápido como sea posible y minimizar el impacto negativo.

La gestión de problemas estudia más tarde y más detalladamente todas las incidencias producidas para evitar que se vuelvan a producir.

La gestión de peticiones define un único canal para que el cliente pueda recibir o solicitar servicios estándares (de nuestro catálogo) y aprobados.

El objetivo de la gestión de accesos es proporcionar a los usuarios autorizados el derecho a utilizar los servicios mientras se impide el acceso a otros. Se basa siempre sobre la gestión de disponibilidad y la gestión de seguridad de los puntos anteriores.

Por último la gestión de eventos proporciona la detección de fallos, proporcionando la capacidad en tiempo de real de comparar el rendimiento de nuestro servicio IT con lo contratado por el cliente en la SLA.

5. Mejora continua del servicio

Su objetivo es hacer recomendaciones sobre cualquier oportunidad de mejora durante toda la fase de vida del servicio. También intenta mejorar la rentabilidad de la prestación del servicio sin sacrificar la satisfacción del cliente.

¿qué es ITIL? (i de ii)

Últimamente están apareciendo en muchos centros una nueva certificación llamada ITIL Foundation. Yo en su día me tuve que preguntar que era esto de la ITIL...
ITIL son las siglas de Information Technology Infraestructure Library, y como en muchas certificación IT consta de muchos cursos, cada uno con su examen y su pasta para desembolsar.

El primer curso de ITIL es el que se conoce como la ITIL Foundation v3, que básicamente es la base que se debe conocer. El concepto de ITIL recoge un conjunto de las mejores prácticas para la gestión eficiente de una infraestructura de servicios IT. Fue escrita por la agencia de telecomunicaciones británica en los 80 y se ha demostrado con el tiempo su utilidad en cualquier empresa de cualquier tamaño.

La ITIL Foundation se estructura y se estudia según cinco libros (no necesariamente en este orden):

- 1. Estrategia del servicio
- 2. Diseño del servicio
- 3. Transmisión del servicio
- 4. Operación del servicio
- 5. Mejora continua de la calidad del servicio

Como veis se trata de un orden lógico en el diseño, implementación y puesta en marcha de un servicio.

En la ITIL Foundation se da una explicación muy detallada de cada una de estas fases y como se relacionan entre sí. Además proporciona todo un vocabulario muy extenso que debe aprenderse ya que se utiliza constantemente en todos las fases.

Explico que es cada una de estas fases:

1. Estrategia del servicio

El objetivo de esta fase es identificar a la competencia y hacer diferenciar nuestro producto o servicio. Debemos encontrar respuestas a ¿qué servicios ofreceremos y a quién?, ¿cómo nos diferenciaremos?, ¿cómo alcanzamos una calidad de servicio?... En esta fase ITIL distingue tres procesos llamados: gestión financiera, gestión de la demanda y gestión del portfolio.

En la gestión financiera debemos de cuantificar, a través de una análisis de inversión, el coste de cada uno de nuestros servicios IT a lo largo de todo su proceso de vida.

En el proceso de gestión de la demanda debemos calcular con precisión la demanda que puede suponer un servicio y de esta forma ajustar al máximo los recursos IT que poseemos.

Por último en la gestión del porfolio encontraremos todo lo que sabemos hacer. No todo está disponible, pero un buen porfolio nos permite anticipar nuestros servicios IT a la competencia.

2. Diseño del servicio

El objetivo de esta fase es diseñar el servicio IT siempre minimizando los riesgos, cumpliendo los objetivos marcados en la estrategia y ahorrando en tiempo y dinero. En el diseño del servicio se definen 5 procesos: gestión del catálogo, gestión del nivel del servicio, gestión de la disponibilidad, gestión de la continuidad, gestión de los proveedores, gestión de la seguridad y gestión de la capacidad.

La gestión del catálogo es proporcionar una única fuente de información de todos los productos que proporciona nuestra empresa. Se trata de un subconjunto de servicios disponibles en nuestro porfolio (definido en la estrategia del servicio). Nosotros ofrecemos nuestro catálogo de servicio al cliente y cualquier otra cosa que no se encuentre en nuestro catálogo, para ITIL no se puede ofrecer.

La gestión del nivel del servicio controla y mejora los niveles acordados al comprar un servicio. Se define el concepto de SLA (Service Level Agreemet) que se estipula en el contrato del cliente (tiempos de respuesta, tiempos de parada, horarios de atención al cliente, etc).

La gestión de la disponibilidad optimiza los recursos de nuestra IT para que todo funcione correctamente para cumplir la SLA firmada por el cliente.

La gestión de la continuidad del servicio se preocupa de que todo siga funcionando en caso de una fuerza mayor. Por ejemplo redundando lo servicios en otro lugar y siempre teniendo en cuenta que la continuidad de nuestro servicio debe cumplir la SLA.

La gestión de los proveedores negocia y acuerda todos los contratos con terceros. El mantenimiento de una política con nuestros proveedores debe asegurar como siempre los niveles de SLA. No podemos dejar de prestar un servicio porque nuestro proveedor nos ha fallado.

La gestión de la seguridad como este todas políticas de seguridad debe asegurar la confidencialidad, la integridad y la disponibilidad de toda la información que manipulamos. Además incluye políticas sobre control de contraseñas, acceso remoto y el uso correcto de todos los activos por parte de los trabajadores.

Por último la gestión de la capacidad es la encargada de que todos los servicios se vean respaldados por una capacidad de proceso y almacenamiento suficiente. Debemos estudiar que los recursos se aprovechen adecuadamente (ni más ni menos) para evitar inversiones innecesarias. O peor aun, que los recursos que tengamos se queden cortos y no nos permitan cumplir la SLA.

hackeando las pilas