Salesforce

Salesforce representa una plataforma de Customer Relationship Management (CRM) basada en la nube que utiliza arquitecturas multi-tenant y tecnologías web modernas como Aura Framework y Lightning Web Components (LWC).

La plataforma implementa un modelo de seguridad basado en perfiles, conjuntos de permisos y configuraciones de sharing, creando múltiples vectores de enumeración y potencial elevación de privilegios. Los componentes Aura, en particular, exponen endpoints específicos que pueden ser explotados para reconocimiento avanzado y extracción de información, mientras que las clases Apex y consultas SOQL presentan oportunidades de explotación del lado servidor.

Reconocimiento

Identificación de componentes Aura

Los componentes Aura constituyen el framework JavaScript de Salesforce para desarrollo de aplicaciones dinámicas. La identificación de objetivos comienza con enumeración DNS para dominios que terminan en *.force.com, *.secure.force.com y *.live.siteforce.com.

Los componentes Aura constituyen el framework JavaScript de Salesforce para desarrollo de aplicaciones dinámicas.

Rutas comunes

/s/sfsites/aura
/aura
/sfsites/aura
/sales/aura

Identificadores de contenido Aura

"actions":[
aura:clientOutOfSync
aura:invalidSession
aura.context
aura.token
aura.fwuid
markup://

Descriptores de enumeración interesantes

Los controladores Aura exponen funcionalidades específicas para extracción de metadatos y enumeración de objetos:

HostConfigController

Devuelve datos de app con lista de objetos accesibles y a menudo objetos personalizados bajo apiNamesToKeyPrefixes, sin parámetros.

OneController

Devuelve información de la app y a veces un listado extendido de objetos, sin parámetros.

RecordUiController

Definición completa de objeto, campos, relaciones y permisos por perfil

Dado objectApiName, devuelve definición del objeto, campos y relaciones, útil para validar acceso por perfil/usuario.

SelectableListDataProviderController

Enumeración de registros con paginación.

Parámetros: entityNameOrId, pageSize (máximo 1000), layoutType (FULL para máxima información)

DetailController

Recupera un registro por recordId cuando existen permisos.

ScopedResultsDataProviderController

Búsqueda para términos de al menos 4 caracteres.

ProfileMenuController

Detalles menores del usuario actual, ayuda a confirmar contexto de permisos.

ListUiController

Enumera listas definidas para un objeto, útil para comprender vistas disponibles.

Enumeración de objetos

El payload mostrado para HostConfigController retorna apiNamesToKeyPrefixes, donde __c indica objetos personalizados; este paso funciona tanto para invitado como autenticado según configuración de la comunidad.

Los objetos pueden ser enumerados modificando el parámetro message por el siguiente payload:

Se pueden extraer los objetos personalizados debido a que la cadena termina con __c, por lo que, usando el siguiente comando, se puede obtener la lista de objetos:

La lista completa de objetos en Salesforce se puede consultar en:

  • https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_list.htm

Si se quiere obtener la lista actualizada de objetos de Salesforce, puedes usar tu IA de confianza para extraer la información con el siguiente prompt:

Esto dará una lista como la siguiente:

Uniendo la lista de objetos por defecto y la lista de objetos personalizados, se podrá crear una lista que luego se podrá usar con intruder para obtener los registros de dichos objetos.

Enumeración de registros de objetos

Con intruder (Burp Suite) es posible automatizar la obtención de información de cada uno de los objetos:

  1. Se copia la lista en la sección de "Payloads" de intruder, seleccionando la opción de "Simple list".

  2. Se modifica el parámetro message de la petición con el siguiente payload.

  3. Se cambia itera sobre el valor de entityNameOrId.

  4. Se modifica pageSize con un valor en el rango 100–1000 y currentPage para paginar.

Ejemplo de json de la respuesta:

Si se copia el json de la respuesta, es posible filtrar con jd el resultado obtenido. Por ejemplo:

  • Obtención de identificadores de registros:

Patrones de IDs y prefijos

Los identificadores de Salesforce implementan un esquema de prefijos de 3 caracteres seguidos de 15 dígitos alfanuméricos (case-sensitive):

Prefijos estándar críticos:

  • 005: User

  • 500: Case

  • 001: Account

  • 003: Contact

  • 00Q: Lead

  • a00: Custom Objects (variable)

En los siguientes enlaces se encuentran los identificadores por defecto:

Generación de patrones para brute force:

Si se quiere identificar cuáles son los caracteres que varían en los identificadores para posteriormente realizar un ataque de fuerza bruta para obtener identificadores no conocidos, se puede usar el siguiente comando:

Ejemplo de salida:

Vulnerabilidades

Acceso como usuario invitado

El contexto de usuario invitado representa el vector de ataque más crítico, ya que el acceso no autenticado ocurre cuando aura.token=null o aura.token=undefined. Esta configuración permite a los atacantes explotar permisos de objeto mal configurados, ejecutar métodos Apex privilegiados y extraer datos sensibles sin autenticación.

Referencia directa segura a objetos

Los ataques de Insecure Direct Object Reference (IDOR) en Salesforce trascienden la simple modificación de parámetros. La plataforma implementa múltiples capas de control de acceso que incluyen permisos a nivel de objeto, campo y registro.

Acceso a información de objetos no autorizados, por ejemplo, habiendo iniciado sesión con el usuario A, modificar el recordId por el del usuario B.

  • recordId: "0015g00000A7T3AAK" → Usuario A

  • recordId: "0015g00000B5T7BBL" → Usuario B

Exposición de información sensible vía token y contexto

Los parámetros aura.context (base64) y aura.token (jwt) están codificados en urlencode y base64, por lo que, se puede decodificar el contenido de los mismos y buscar información sensible que pueda estar expuesta.

XSS

Inyección SOQL

SOQL (Salesforce Object Query Language) difiere significativamente del SQL tradicional pero sigue siendo vulnerable a ataques de inyección cuando la entrada del usuario se concatena directamente en las consultas.

Técnicas de inyección basadas en errores explotan parámetros contentDocumentId a través de análisis de mensajes de respuesta:

  • Documento válido: "Cannot invoke 'common.udd.EntityInfo.getEntityId()'"

  • Documento inválido: "Error in retrieving content document"

Referencias

Última actualización

¿Te fue útil?