lunes, agosto 06, 2007

Protección contra las técnicas de Blind SQL Injection (III de IV)

***************************************************************************************
Protección contra las técnicas de Blind SQL Injection (I de IV)
Protección contra las técnicas de Blind SQL Injection (II de IV)
Protección contra las técnicas de Blind SQL Injection (III de IV)
Protección contra las técnicas de Blind SQL Injection (IV de IV)
***************************************************************************************
En el artículo del mes pasado se explicó como mediante técnicas a ciegas es posible sacar información de una base de datos sin llegar a ver los resultados de las consultas. En el presente mes vamos a ver una serie de herramientas que podéis utilizar para analizar y para probar la seguridad de vuestras bases de datos. Muchas de ellas son gratuitas y de libre por lo que va a ser fácil que las probéis en vuestras aplicaciones.

SQLInjector

La primera herramienta que hay que conocer es ésta. A raíz de los estudios de David Litchfield y Chrish Anley, ambos de la empresa NGS Software, desarrollaron la herramienta SQLInjector. Esta herramienta utiliza como forma de automatización la búsqueda de palabras clave en los resultados positivos. Es decir, se busca encontrar una palabra que aparezca en los resultados positivos y que no aparezca en los resultados negativos.

Recordad que el objetivo de las técnicas de Blind SQL Injection es conseguir inyectar lógica binaria con consultas del tipo “y existe esta tabla” o “y el valor ASCII de la cuarta letra del nombre del administrador es menor que 100”. Siempre se busca realizar consultas que devuelvan verdad o mentira con lo que la aplicación al procesarlo devolvería la página original (que llamamos de verdad o cierta) o la página cambiada (que llamamos de mentira o falsa). Pero si no te acuerdas, te recomiendo releer el artículo del mes pasado dónde se explica en detenimiento.

Para probar si el parámetro es susceptible a Blind SQL Injection utiliza un sistema basado en inyecciones de código de cambio de comportamiento cero sumando y restando el mismo valor. Es decir, si tenemos un parámetro vulnerable que recibe el valor 100, el programa ejecuta la petición con 100 + valor – valor. Si el resultado es el mismo entonces el parámetro es susceptible a ataques de SQL Injection.

Como utiliza búsqueda de palabra clave en resultados positivos hay que ofrecerle la palabra clave manualmente, es decir hay que lanzar la consulta normal y ver que palabras devuelve el código HTML. Después tenemos que lanzar una consulta con algo que haga que sea falso, por ejemplo con AND 1=0 y ver que palabras aparecen en los resultados de Verdad y no aparecen en los falsos (con seleccionar una palabra valdría). El código fuente de esta aplicación está escrito en Lenguaje C, es público y se puede descargar de la web:

SQL Injector

Para ejecutarse se hace con un comando como el siguiente:

C:\>sqlinjector -t www.ejemplo.com -p 80 -f request.txt -a query -o where -qf query.txt -gc 200 -ec 200 -k 152 -gt Science -s mssql

Donde:

- t : Es el servidor
- p : Es el puerto
- f : La aplicación vulnerable y el parámetro. En un fichero de texto.
- a : La acción a realizar
- o : fichero de salida
- qf : La consulta a ejecutar a ciegas. En un fichero de texto.
- gc : Código devuelto por el servidor cuando es un valor correcto
- ec : Código devuelto pro el servidor cuando se produce un error
- k : Valor de referencia correcto en el parámetro vulnerable
- gt : Palabra clave en resultado positivo
- s : Tipo de base de datos. La herramienta está preparada para MySQL, Oracle, Microsoft SQL Server, Informix, IBM DB2, Sybase y Access.


Ejemplo de fichero request.txt

GET /news.asp?ID=#!# HTTP/1.1
Host: www.ejemplo.com


Ejemplo de query.txt

select @@version

La aplicación anterior hay que nombrarla obligatoriamente cuando se habla de técnicas de Blind SQL Injection, pero hoy en día existen otras muchas alternativas. Una especialmente pensada para motores de MySQL es SQLbftools.

SQLbftools

Publicadas por “illo” en reversing.org en diciembre de 2005. Son un conjunto de herramientas escritas en lenguaje C destinadas a los ataques a ciegas en motores de bases de datos MySQL basadas en el sistema utilizado en SQLInjector de NGS Software. El autor ha abandonado la herramienta y a día de hoy es mantenida por la web http://www.unsec.net por “dab”.

Esta compuesta de tres aplicaciones:

- mysqlbf: Es la herramienta principal para la automatización de la técnica de BlindSQL. Para poder ejecutarla se debe contar con un servidor vulnerable en el que el parámetro esté al final de la url y la expresión no sea compleja.

Soporta códigos MySQL:
o version()
o user()
o now()
o sytem_user()
o ….

Su funcionamiento se realiza mediante el siguiente comando:

Mysqlbf “host” “comando” “palabraclave”

Donde:

o host es la URL con el servidor, el programa y el parámetro vulnerable.
o Comando es un comando a ejecutar de MySQL.
o Palabraclave es el valor que solo se encuentra en la página de resultado positivo.

En la siguiente imagen vemos como lanzamos la aplicación contra una base de datos vulnerable y podemos extraer el usuario de la conexión.


Imagen: Extracción user()

Como se puede ver el programa ha necesitado 230 peticiones para sacar 18 bytes. En la siguiente imagen se ve como extraer la versión de la base de datos:

Imagen: Extracción version()


- mysqlget: Es la herramienta pensada para descargar ficheros del servidor. Aprovechando las funciones a ciegas y los comandos del motor de base de datos se puede ir leyendo letra a letra cualquier fichero del servidor.

En la siguiente imagen se ve como se puede descargar el fichero /etc/password a partir de una vulnerabilidad Blind SQL Injection usando mysqlget:

Imagen: Extracción version()

- mysqlst: Esta herramienta se utiliza para volcar los datos de una tabla. Primero se consulta al diccionario de datos para extraer el número de campos, los nombres, los tipos de datos de cada campo y por último el volcado de las filas.

Tienes más info en Blind SQL Injection en MySQL

Bfsql

Evolución de SQLBfTools, cuando “illo” abandonó las herramientas SQLbfTools A. Ramos, actualmente trabajando en la empresa Española SIA, la migró al lenguaje Perl en poco más de 500 líneas. La herramienta sigue utilizando el sistema de palabra clave en valores positivos. La herramienta no pide la intervención del usuario para averiguar cual es la palabra clave, sino que realiza peticiones con inyecciones de cambio de comportamiento cero e inyecciones de cambio de comportamiento positivo. Recibe las respuestas, un archivo de respuesta para el valor correcto y otro archivo para el valor incorrecto y las compara línea a línea buscando la primera diferencia. A partir de ese momento realiza peticiones y mira a ver a que valor corresponde.

La herramienta es de código abierto y la última versión, de Julio de 2006, está disponible para todo el mundo en la siguiente URL: http://www.514.es

SQL PowerInjector

Esta herramienta está escrita en .NET por Francois Larouche y ha sido liberada en el año 2006. SQL PowerInjector utiliza técnicas de SQL Injection tradicionales basadas en mensajes de error y técnicas de Blind SQL Injection usando dos sistemas. Comparación de resultados completos, equivalente a realizar un HASH MD5 de la página de resultados o bien, para los motores de Microsoft SQL Server, y sólo para esos motores, también se puede realizar utilizando el sistema basado en tiempos con WAIT FOR (o time delay) descrito por Chrish Anley en “(more) Advanced SQL Injection”. Para los motores de Oracle utiliza también, desde Mayo de 2007 inyección basada en tiempos llamando a los procedimientos almacenados de Oracle DBMS_LOCK y utilizando las funciones de Benchmark para generar retados en MySQL. La herramienta no ayuda a buscar parámetros vulnerables y se maneja mediante un trabajado interfaz gráfico.

Imagen: Extracción SQL PowerInjector

La herramienta está adaptada a MS SQL Server, Oracle, MySQL y Sybase, es de código abierto y está disponible para descarga en la siguiente URL: http://www.sqlpowerinjector.com

3 comentarios:

Anónimo dijo...

Hablando de inyección SQL lo más habitual es hablar de MySQL y SQL server, sin embargo hay un paper y una herramienta asociada para PostgreSQL muy buenos:

Paper: http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt
Tool:
http://www.leidecker.info/pgshell/

NetVicious dijo...

Sólo una sugerencia, sería mucho más útil para la gente de a pie explicar como proteger él código además de poner herramientas para testear nuestras aplicaciones web.

Ejemplo:

PHP + MySql

Limpiar antes los parámetros que vamos a utilizar en las consultas con mysql_escape_string o mysql_real_escape_string y ponerlos siempre entre comillas en la consulta para evitar Blind SQLs.

$sql_query = mysql_query("SELECT * from table where id='$num');

Chema Alonso dijo...

Hola, holita!

Gracias a los dos por la información dada. Es un placer.

Net, creo que le daré un poco más de caña a eso. Saludos!

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares