Scroll to top

Trading Platform Pentest — Unauthenticated API to Rogue Admin

Penetration testing a trading platform
Network and infrastructure testing

Project Overview

A financial-technology client (confidential) asked me to test a trading platform before it carried real money: a GraphQL core API, the .NET services that route and match orders, and the internal consoles operators use to approve users and move positions. I ran it as a grey-box penetration test against a full production mirror. The result was not a list of hygiene issues — it was a chain. Privileged GraphQL queries were answered with no token at all. The account-creation path trusted a client-supplied role field, so an ordinary signup produced a working administrator. Seeded accounts shared a single password across environments, signing keys and database credentials were committed to the repository and still readable inside the published container images, and the order-intake service reconstructed attacker-influenced types from a message body. Each step was proven non-destructively, rated with CVSS, written up with exact reproduction steps, and retested once the fixes shipped.

Challenges

  1. Test a live-money order path without ever placing, altering or cancelling a real trade.
  2. Cover three very different stacks in one window — a GraphQL core API, .NET order services and the operator consoles.
  3. Prove privilege escalation end to end instead of filing a theoretical mass-assignment note.
  4. Separate genuinely missing authentication from controls enforced somewhere else in the request chain.
  5. Give a team shipping to a regulatory deadline a remediation order they could actually execute.

Approach

  1. Mapped the GraphQL schema through introspection and enumerated every resolver reachable without a bearer token.
  2. Built the escalation chain on the production mirror, stopping at proof and never touching live order flow.
  3. Audited git history and the published container images for keys, credentials and configuration left behind.
  4. Rated every finding with CVSS, attached reproduction steps, and grouped fixes into three deployable waves.
  5. Retested after remediation and confirmed each chain was broken outright, not merely blocked at one hop.

What the Test Found

What Fixed It

Authentication moved to a single enforced gateway rather than being re-implemented per resolver, and introspection was disabled outside development. Role assignment became server-side only, with the registration payload treated as untrusted input. Every seeded credential was rotated, the exposed keys were revoked and reissued, and the container images were rebuilt from a clean layer so the old values stopped shipping. The deserialization sink was replaced with an explicit allow-list of types. The retest confirmed the chain no longer existed at any hop — and the team kept the gateway pattern for the services they built afterwards, which mattered more than any single fix.

Scope at a Glance