Inyecciones SQL, (como prevenir)

sql_injection_vulnerable
Es común encontrarnos con aplicaciones vulnerables a inyecciones SQL, estos ataques se deben a que los desarrolladores omiten la tarea de validar los datos introducidos por los usuarios, veamos un ejemplo de una aplicación vulnerable y luego veamos como prevenir inyecciones, usted puede descargar el código fuente desde:
https://gist.github.com/fitorec/9b8312d83a2b4aa902b38aee4a067962

La aplicación consta de la siguiente estructura:

src/
`-- inyeccionsql
    |-- BD.java
    |-- InyeccionSQL.java
    |-- LoginVista.fxml
    |-- LoginVistaController.java
    |-- base_datos.sql
    `-- style.css

El archivo de base_datos.sql contiene el esquema la cual contiene una sola tabla con nombre usuarios:

CREATE TABLE `usuarios` (
	`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	`username` VARCHAR(15) NOT NULL UNIQUE KEY,
	`password` CHAR(32) NOT NULL ,
	`fecha_nacimiento` DATE NOT NULL
) ENGINE = InnoDB;

-- Agregando dos usuarios

INSERT INTO `usuarios`
	(`id`, `username`, `password`, `fecha_nacimiento`) VALUES
	(NULL, 'fitorec', 'ABC123456...', NOW()),
	(NULL, 'pepe_grillo', 'ABC123456...', NOW());

BD.java Es una clase singletón que se encarga de la conexión a la base de datos, mientras que InyeccionSQL.java es la clase principal y solo se encarga de iniciar la aplicación, mandando abrir una escena con el contenido de LoginVista.fxml de la cual su controlador es LoginVistaController.java  esta tiene el método accionLogin encargado de validar el login como podemos ver en el siguiente código:

    @FXML
    private TextField username;
    @FXML
    private PasswordField password;
    @FXML
    private void accionLogin(ActionEvent event) {
        try {
            String sql = "SELECT * FROM usuarios "
                + "WHERE username='"+username.getText() + "'"
                + " AND password='"+password.getText()+"'";
            PreparedStatement ps = BD.getConexion().prepareStatement(sql);
            ResultSet r =  ps.executeQuery();
            if (r.next()) {
                String uname = r.getString("username");
                label.setText("Bienvenido: " + uname);
            } else {
                label.setText("Login invalido");
            }
        } catch(Exception e){
            label.setText("Error SQL");
        }
    }

En el ejemplo podemos ver como concatenamos literalmente el contenido de los inputs username y password, ¿pero que pasa si un usuario mal intencionado agrega los siguientes datos, para el username x y para el password x' OR 1='1?, esto nos genera la consulta:

SELECT * FROM usuarios
       WHERE username='x' AND password='x' OR 1='1';

login_correcto

Dicha consulta es conocida como “siempre cierta” y nos dará un acceso correcto al sistema,incluso podríamos concatenar la consulta con un DROP o TRUNCATE, como se muestra en la siguiente imagen =).
exploits_of_a_mom.png

Pero.. como evitar esto

private void accionLogin(ActionEvent event) {
        try {
            String sql = "SELECT * FROM usuarios "
                + "WHERE username=?"
                + " AND password=?;";
            PreparedStatement ps = BD.getConexion().prepareStatement(sql);
            ps.setString(1, username.getText());
            ps.setString(2, password.getText());
            ResultSet r =  ps.executeQuery();
            if (r.next()) {
                String uname = r.getString("username");
                label.setText("Bienvenido: " + uname);
            } else {
                label.setText("Login invalido");
            }
        } catch(Exception e){
            label.setText("Error SQL");
        }
    }

Del código previo podemos ver como creamos la consulta dejando el valor de los parámetros username y password como argumentos que posteriormente pasaremos(ver ? en las lineas 4,5) luego posteriormente en las lineas 7 y 8 pasamos los valores por medio de los métodos setText este metodo realiza los escapes adecuados y si agregamos como password el valor x' OR 1='1 al realizar los escapes se convertirá en algo como :

SELECT * FROM usuarios
      WHERE username='x' AND password='x\' OR 1=\'1';

Como conclusión en general debemos de limpiar todos los datos introducidos por el usuario ya que este es el medio por el cual las aplicaciones suelen fallar.

cmdchallenge.com Desafios en el CLI BASH

Hace un tiempo  un amigo @root_w33d me aviso que existia un proyecto conocido como “cmd challenge” (reto en comandos):

Cuando vi el mensaje me puse a revisar el proyecto el cual se me hizo muy interesante, tras una larga noche de bastante café, complete los desafíos:

cmdchallenger
https://cmdchallenge.com

Como no es mi intensión spoolear las respuestas, solo voy a poner las que considere interesantes, cabe mencionar que si revisas el repositorio del proyecto en github puedes ver las respuestas de cada desafió en la URL:

https://github.com/jarv/cmdchallenge/blob/master/challenges.yaml

remove_duplicate_lines

Description:

Print the file faces.txt, but only print the first instance of each
duplicate line, even if the duplicates don't appear next to each other.
Note that order matters so don't sort the lines before removing duplicates.

Consiste en imprimir las lineas de un archivo faces.txt(de 31 lineas) sin imprimir las lineas repetidas manteniendo el orden.

Fue entonces que de inmediato pensé en el comando uniq el cual en teoría elimina las lineas repetidas sin embargo, creo que no funciona del todo correcto cuando existen caracteres especiales, de tal forma que el resultado de:

uniq faces.txt

Nos devuelve 28 lineas lo cual me indicaba que eliminaba 3 lineas.

Cabe mencionar que el resultado esperado consta de 24 lineas, por un momento pensé que quizás el problema es que como las lineas repetidas no estaban continuas pues por eso el uniq no funcionaba bien, asi que pensé en ordenar y luego eliminar los elementos repetidos para ver que pasaba:

sort faces.txt | uniq

lo cual ya me genera las 24 lineas el problema ahora es que al ordenar, se pierde la secuencia, así que opte por ejecutar:

cat -n faces.txt | sort -k2 -u | sort | cut  -f2- 

el cual realiza el siguiente procedimiento:

  • cat -n faces.txt imprime las lineas agregando el numero de linea (algo similar a ejecutar nl faces.txt)
  • sort -k2 -uOrdena eliminando las lineas repetidas(-u) a partir del 2do parametro(-k2)
  • sortSimplemente ordena, regresando el orden del archivo.
  • cut -f2-Corta la salida a partir del parámetro 2.

Cabe mencionar que la respuesta oficial del repositorio es awk '!x[$0]++' faces.txt pero como todos sabemos en bash podemos hacer las cosas de muchas maneras 😉

Por otra parte hoy que escribí el post me doy cuenta que hay nuevos desafíos, así que asta aquí los dejo, ya que me pondré a jugar un ratito, esperando posteriormente escribir nuevas soluciones que me parecieron interesante =).

Ejemplo Modulo joomla con control de calendario

En ocasiones requerimos en nuestros sitios datos insertados por los usuarios, afortunadamente Joomla! cuenta con una serie de elementos que hacen mas amena esta tarea, el día de hoy quiero explicar como insertar el calendario de Joomla! tal y como lo vemos en la parte administrativa en las opciones de publicación al editar un articulo.

calendario joomla

calendario joomla

Este articulo ha sido movido a:
http://www.mundosica.com/blog/2013/agregando-el-calendario-de-joomla-a-nuestras-campos-de-formularios/

Paginación de Twitter Bootstrap en WordPress

El twitter Bootstrap entre sus componente que tiene trae incorporado un sistema de paginación con links activos, normales y deshabilitados.

Paginación de twitterBootstrap en WordPress

Resultado Paginación de twitterBootstrap en WordPress

http://twitter.github.com/bootstrap/components.html#pagination

Por otra parte el sistema WordPress suele agregar la paginación de los posts en el archivo loop.php de la plantilla en cuestión, desgraciadamente la función paginate_links nos genera un código html algo diferente a lo que requerimos para adaptarlo al bootstrap.

Salida en HTML necesaria

Salida en HTML necesaria

http://codex.wordpress.org/Function_Reference/paginate_links

Navegando por Internet encontré algunas implementaciones, p.e:

http://panosgalatis.com/2012/08/14/wordrpess-and-twitter-bootstrap-pagination/#.UHvXCqyqyio

Sin embargo incluyen modificaciones al CSS, cuando este renderizado se puede hacer solo con PHP como se muestra continuación:

loop.php

loop.php

Hice un gists en github con el código fuente para que se pueda descargar:

Reloj regresivo en Javascript clockCountdown

En ocasiones es necesario un reloj que cuente de forma regresiva(clockCountdown), por ejemplo si estamos esperando algún evento del cual faltan no sé 5 días(por ejemplo), entonces este reloj podría servir para indicar que faltan 5 días, 0 horas, 0minutos y 0 segundos posteriormente se desincrementaría quedando en 4 días, 23 horas, 59minutos y 59 segundos y así sucesivamente:

Imagen del reloj regresivo

Relog regresivo en acción

Principales características

  • Javascript puro apegado al ECMAScript
  • No depende de ninguna librería(jQuery, mootools, etc…).
  • Soporte de ejecución multiple basada en una pila de objetos.
  • Ligero.
  • Cross Browser.

Visitar proyecto

http://fitorec.github.com/clockCountdown.js/

Generando mapas con raphael.js

mapa_mexico

mapa_mexico

Este es un manual el cual espero tendrá de 4 a 3 artículos, lo empece hace un par de meses pero lo he tenido detenido por mucho tiempo(al igual que mi manual de jquery, el de php y el de inkscape), espero poder dedicarle algo de tiempo y acabar de publicarlo este año, sin mas dejo lo que vendría siendo un borrador de la 1ra sesión.

Cola de archivos del filezilla (queue.xml).

El filezilla es un cliente ftp con varias caracteristicas personalizables interesantes de las cuales guarda bitacolas y archivos de configuraciones para cada usuario de nuestro sistema operativo(ya que funciona en Linux, Mac y Windows). El directorio donde se almacena estos archivos cambia dependiendo del sistema operativo por ejemplo:

#en el caso de linux /home/nombre_usuario/.filezilla/ 
#en el caso de windows C:\Documents and Settings\nombre_usuario\Application Data\FileZilla\queue.xml 
#en el caso de MAC. #No lo se, si alguien lo sabe favor de comentarlo para que lo agregue. 

En mi caso mi maquina que tiene linux y mi usuario es fitorec por lo cual mi directorio es: /home/fitorec/.filezilla/ si revisamos estos archivos veremos la siguiente lista:

/home/fitorec/.filezilla/

 |-- bookmarks.xml <- Marcadores 
 |-- filezilla.xml <- Configuraciones y los datos de la ultima conexión
 |-- filters.xml <- Filtros
 |-- layout.xml <- Interfas grafica
 |-- lockfile <- No lo se,en mi caso estaba vacio.
 |-- queue.xml <- Cola de archivos(este es el que nos interesa por ahora).
 |-- recentservers.xml <- Lista de datos sobre las ultimas conexiones.
 `-- sitemanager.xml 

Estos archivos son muy interesantes y que espero describirlos con
detalles en entradas siguientes, sin embargo en esta entrada describire
las caracteristicas del archivo queue.xml este archivo almacena la cola de archivos que tienen un proceso pendiente(subir/baja el archivo) y que nos muestra el filezilla, como se puede ver en la siguiente imagen:

 

Mas especificamente en la parte inferior de la pantalla del filezilla es donde nos muestra la cola de archivos:

 

Como podemos ver nos muestra la siguiente información:

  • información de la conexión
    • Usuario
    • Servidor
  • Lista de archivos pendientes de los cuales para cada uno muestra informacion:
    • Ruta del archivo local.
    • Dirección si se va a descargar o subir del servidor.
    • Ruta del archivo remoto.
    • Tamaño del archivo.
    • Prioridad.
  • El numero total de archivos en la cola.
  • El tamaño en KB( kilobytes ) de la cola.

Ahora si abrimos el que nos aparece cuando

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<FileZilla3>
 <Queue>
 <Server>
  <Host>nombre_servidor.com</Host>
  <Port>21</Port>
  <Protocol>0</Protocol>
  <Type>0</Type>
  <User>fitorec</User>
  <Pass>contraseñaXXX</Pass>
  <Logontype>1</Logontype>
  <TimezoneOffset>0</TimezoneOffset>
  <PasvMode>MODE_DEFAULT</PasvMode>
  <MaximumMultipleConnections>0</MaximumMultipleConnections>
  <EncodingType>Auto</EncodingType>
  <BypassProxy>0</BypassProxy>
 <File>
  <LocalFile>/home/fitorec/proyecto/proyecto_actual/images/foto1.png</LocalFile>
  <RemoteFile>foto1.png</RemoteFile>
  <RemotePath>1 0 6 images</RemotePath>
  <Download>0</Download>
  <Size>5388</Size>
  <TransferMode>1</TransferMode>
 </File>
 <File>
  <LocalFile>/home/fitorec/proyecto/proyecto_actual/js/script.js</LocalFile>
  <RemoteFile>script.js</RemoteFile>
  <RemotePath>1 0 11 public_html 6 images 2 js</RemotePath>
  <Download>1</Download>
  <Size>2000</Size>
  <TransferMode>1</TransferMode>
 </File>
 </Server>
</Queue>
</FileZilla3> 

Descripción del archivo

Este archivo es un documento en formato xml desgraciadamente no pude
localizar el
dtd (la definción de los datos) que me definiera el contenido, asi que tratare de explicar lo que entendi del mismo:

estructura básica

La estructura basica es la siguiente:

<FileZilla3>
<Queue>
 <Server>
 <File> <!-- documento 1 --> </File>
 <File> <!-- documento 2 --> </File>
 </Server>
 <Server>
  <-- servidor 2 -->
 </Server>
</Queue>
</FileZilla3> 

Como vemos existe un <FileZilla3> el cual contiene una cola
<Queue> que asu vez contiene servidores <Server> los cuales
contiene archivos pendientes en dicha cola <File>.

FileZilla3

Este es el contenedor principal el cual hace referencia a la
definicion de datos para filezilla version 3 el cual acepta multiples
conexiones con servidores por medio de pestañas.

Queque

Es la cola, este es un subcontenedor el cual describe el documento en
si, veran como comentaba el filezilla almacena distinta información la
cual esta dividida en archivos en formato xml cada documento tiene
un nombre que refiere al contenido del documento en este caso el
domento es queque.xml y por lo contiene el elemento </Queue> en el
caso de los marcadores existe bookmarks.xml el cual tiene una
estructura parecida a:

<FileZilla3>
  <Bookmark>
  .... 
 </Bookmark>
 </FileZilla3> 

En el caso de las ultimas conexciones veremos existe el docmento
recentservers.xml el cual tiene una estructura similar a:

<FileZilla3>
 <RecentServers>
  <Server>
   <!-- servidor 1 -->
  </Server>
 </RecentServers>
</FileZilla3> 

Nota: Cuando abrimos nuestro filezilla y abrimos una conexion nueva esta se
almacena automaticamente en el documento recentservers.xml.

Server

Este contenedor almacena informacion del servidor asi como de su
acceso, la información que contiene es, host, puerto, usuario,
contraseña, modo pasivo/activo, códificación, etc.. entre otras.

File

Este se encuentra contenido dentro de un servidor (<Server>) e indica un
documento, un ejemplo es el siguiente:

<File>
 <LocalFile>/home/fitorec/proyecto/proyecto_actual/js/script.js</LocalFile>
 <RemoteFile>script.js</RemoteFile>
 <RemotePath>1 0 11 public_html 6 images 2 js</RemotePath>
 <Download>1</Download>
 <Size>2000</Size>
 <TransferMode>1</TransferMode>
</File> 

LocalFile: archivo local (en
nuestra maquina).
RemoteFile : nombre remoto(en el servidor).
RemotePath: directorio remoto.
Download: sentido (descargar=1 ó subir=0).
Size Tamaño de la trasferencia.

Se me ocurren varias ideas como alterar este documento de la cola
archivos del filezilla, a partir de los cambios en un
directorio que tenga un control de versiones(git,mercurial ó svn).

De esta forma al abrir el filezilla estaria listo para realizar la
trasferencia indicada.