lunes, julio 09, 2007

Blind SQL Injection (III de ...).
SQLNinja

Como ya hemos visto en algunos posts [Hackeando un servidor de Juegos] una de la formas de automatizar las vulnerabilidades Blind SQL Injection es utilizando un sistema basado en tiempos.

La idea es inyectar un comando junto con una cadena que genere un retardo si la respuesta es positiva. Con esto cuando se haga una pregunta, del tipo "¿Es la tercera letra del nombre del usuario una "a"?" si añade un "si es así tarda 10 segundos en responder". A partir de este momento cuando se automatizan las peticiones se va mirando el tiempo de respuesta frente a las peticiones.

Como os imaginaréis este sistema tiene el problema de la latencia de red y el índice de falsos positivos es alto. Además, si de por sí el sistema Blind es de explotación lenta debido al número de peticiones que hay que realizar, al añadir retardos se hace aun más lento. No obstante, funciona.

¿Cómo se añaden retardos?. Hay dos formas de hacerlo, la primera es utilizar procedimeintos almacenados en los motores de bases de datos que los tienen. Para SQL Server de Spectra, Chrish Anley, en el (more) Advanced SQL Injection del año 2002 pone el siguiente ejemplo de inyección:

if (ascii(substring(@s, @byte, 1)) & ( power(2, @bit))) > 0 waitfor delay '0:0:5'

…it is possible to determine whether a given bit in a string is '1' or '0'. That is, the above query will pause for five seconds if bit '@bit' of byte '@byte' in string '@s' is '1'.

For example, the following query:

declare @s varchar(8000) select @s = db_name() if (ascii(substring(@s, 1, 1)) & ( power(2, 0))) > 0 waitfor delay '0:0:5'

…will pause for five seconds if the first bit of the first byte of the name of the current database is '1'. We can then run:

declare @s varchar(8000) select @s = db_name() if (ascii(substring(@s, 1, 1)) & ( power(2, 1))) > 0 waitfor delay '0:0:5'

…to determine the second bit, and so on...


Realmente el documento no se centra en Blind, pero con este párrafo da una forma de explotar las vulnerabilidades en base a tiempo utilizando el método waitfor.


Este mecanismo ha sido el empleado por la herrmaienta SQLNinja. Es un programa hecho en perl del cual está disponible la versión 0.1.2. Está en Sourceforge y tenemos acceso al código para ver como está programado. Aquí tenéis el procediemiento que comprueba si el usuario que utiliza la aplicación web tiene permisos de administración:

sub fingerprint_sysadmin
{
print "[+] Check whether user is member of sysadmin server role....\n";
my $cmd;
$cmd = "if+is_srvrolemember('sysadmin')+=+1+waitfor+delay+'0:0:".
$blindtime."';";
my $delay = tryblind($cmd);
if ($delay > $blindtime - 2) {
return 1;
} else {
return 0;
}
}


El procediemiento tryblind comprueba el tiempo que ha tardado en responder al realizar la llamada al servidor inyecctando el comando $cmd. Como se ve en la inyección si el valor es igual a 1 se llama a waitfor con un valor de $blindtime (es decir, que el motor tarde en responder $blindtime segundos). Luego se comprueba si el tiempo es mayor que $blindtime - 2 (ajuste del programador) y si es así el programa asume que la respuesta es Verdadero, y si no, asume que es Falso.

Para hacer funcionar este programa basta con configurar un fichero de parámetros llamado SQLNinja.conf que se puede crear con un asistente en modo test en el que se pone el servidor vulnerable, la URL, el programa, el puerto, el método, etc... y el BlindTime:


A partir de ahí, basta seguir el menú del progrma para ir extrayendo toda la información:


Tenéis una demo en flash publicada en la siguiente dirección: http://sqlninja.sourceforge.net/sqlninjademo.html y podéis descargar el programa desde: http://sqlninja.sourceforge.net

Saludos!

3 comentarios:

  1. Debo estar alucinando, juraría haber visto en tu post una shell con un #

    :)

    ResponderEliminar
  2. La herramienta no se llevó bien con el Active Perl de mi equipo y la lancé en Linux sí. No obstante, las capturas son de la demo .swf.

    Saludos!

    ResponderEliminar