Web App & API Testing

When a read-only user could pull stored credentials

Client
Software company
Service
Web application and API penetration testing
Engagement
Short engagement, 10+ findings
Verified
All findings closed; retested by ioSENTRIX
The challenge

What did the client need?

A software company asked ioSENTRIX to test its multi-tenant web platform and the APIs behind it. In a short, focused engagement, we found more than ten issues.

Engagement details

Client
Software company
Product
Multi-tenant web platform and APIs
Scope
Web application, backend APIs and role-based access across tenants
Access
Test accounts at several permission levels
Engagement
A short, focused engagement
Verified
All findings closed; retested by ioSENTRIX
Tested by
ioSENTRIX application security testers
Our approach

How did ioSENTRIX approach it?

Our testers held accounts at several permission levels, then replayed each API call under every role and against other customers’ records to compare what each was allowed to see.

Beyond the signature findings: settings and schedules exposed to restricted roles, an internal ID leak that enabled the credential chain, a missing function-level check, no rate limit on search, and weak input validation.

What we found

What did ioSENTRIX find?

A read-only role reached stored secrets, and tenant isolation failed too. Both are now fixed and retested.

CriticalFinding 1

Changing one number opened another customer’s records

The record endpoint checked that a user was signed in, but not which organisation the record belonged to. Record IDs were sequential and the endpoint had no rate limit, so every customer’s records could be collected by a simple script.

Business impact. One customer could read another customer’s confidential business data, breaking the platform’s core promise of isolation.

HighFinding 2

A read-only role could pull stored credentials

Access was checked on parent objects but not on their sub-resources. A user with the platform’s lowest, read-only role could request authentication settings directly and receive HTTP Basic credentials and OAuth client secrets in plain text. Webhook secrets and one-time-password seeds leaked the same way.

Business impact. Stolen credentials would let an attacker act as a customer’s own service accounts on the systems those credentials unlock.

Two paths across a boundary the platform was built to enforce
Path 1 · another tenant · Critical
  1. 1Signed inas customer A
  2. 2Record ID changedIDs are sequential
  3. 3No tenant checkrecord returned
Path 2 · read-only role · High
  1. 1Read-only loginlowest-privilege role
  2. 2Profile ID exposedby another endpoint
  3. 3Sub-resource opencredentials returned
Outcome: Data exposed (other customers’ records and stored secrets)
The impact

What changed as a result?

The worst let any signed-in user read other customers’ records by changing one number. A second let a read-only role pull stored integration credentials. The client closed every finding, and ioSENTRIX retested the fixes.

10+
findings, 5 of them Critical or High
1
read-only role was enough to reach stored credentials
2
separate paths across the tenant boundary

How many findings, and how severe?

10+ findings in total, including 1 Critical and 4 High.

  • Critical 1
  • High 4
  • Low
  • Info

What changed after the test?

  • Tenant checks. Every record endpoint now verifies the organisation, with rate limiting.
  • Role checks. Permissions are enforced on every sub-resource, not inferred from parents.
  • Secrets. Credentials, webhook secrets and seeds are no longer returned in plain text.
  • Hardening. Search is rate-limited and inputs are validated server-side.

✓ Verification: All closed by the client; retested by ioSENTRIX.

Key insight

The interface hid the secrets. The API handed them over.

Lessons

Lessons for software teams

01

Check the tenant on every request

Being signed in is not permission to see a record (OWASP API1).

02

Authorise sub-resources too

A role allowed to see a profile is not allowed to see its secrets.

03

Hiding is not access control

If the API returns a value, the user has it, whatever the interface shows.

  1. Severity rated on a five-level likelihood and impact matrix based on NIST SP 800-30 Rev. 1.
  2. OWASP API Security Top 10 (2023): API1 Broken Object Level Authorization, API5 Broken Function Level Authorization. Cited as alignment guidance.
Next step

Running a multi-tenant platform? See a sample API test report or book a strategy session on tenant isolation.

Service
Web application and API penetration testing
Explore the service

Details in this case study are anonymised and generalised. Methods that could harm other products are withheld.

FAQ

Frequently asked questions

What did ioSENTRIX test in this case study?

A software company asked ioSENTRIX to test its multi-tenant web platform and the APIs behind it. In a short, focused engagement, we found more than ten issues.

What was the most serious issue?

Changing one number opened another customer’s records. One customer could read another customer’s confidential business data, breaking the platform’s core promise of isolation.

How many findings were there, and how severe?

10+ findings in total, including 1 Critical and 4 High.

Were the fixes verified?

All closed by the client; retested by ioSENTRIX.

Which ioSENTRIX service does this case study cover?

Web application and API penetration testing, delivered by the ioSENTRIX application security testers.

How to get started

Ready to strengthen your security? Fill out our quick form, and a cybersecurity expert will reach out to discuss your needs and next steps.
DecorativeDecorative