API Penetration Testing Report — Sample
API Penetration Testing Report — REST & GraphQL Security Assessment. A fictional authenticated API penetration test of the OrionSphere Enterprise Platform, a fictional enterprise SaaS/FinTech infrastructure platform operated by OrionSphere Technologies, Inc., showing how TMG Security structures scope, methodology, attack-surface mapping, findings, risk analysis, and remediation guidance for a combined REST and GraphQL API security assessment.
OrionSphere Technologies, Inc. and the OrionSphere Enterprise Platform are fictional. No real production system was built, deployed, accessed, scanned, or tested, and no real client environment or customer data was involved in the creation of this document.
Overview
An API penetration test is an authorized, hands-on security assessment in which testers actively attempt to identify and manually validate exploitable weaknesses across an organization's REST and GraphQL interfaces — object- and function-level authorization, tenant isolation, business logic, and GraphQL resolver security — going beyond automated scanning or fuzzing to confirm which weaknesses are real, how they manifest across interfaces, and what they mean for the business. The result is a report that gives engineering and security leadership a prioritized, evidence-based roadmap for remediation.
This sample report shows how TMG Security structures that deliverable for a combined REST and GraphQL engagement. It is built around the OrionSphere Enterprise Platform, a fictional enterprise SaaS/FinTech infrastructure platform operated by OrionSphere Technologies, Inc., a fictional organization headquartered in New York, New York, and covers a simulated one-month assessment window of 01–31 August 2026.
What this sample demonstrates
OrionSphere Technologies, Inc. and the OrionSphere Enterprise Platform do not exist. Every finding, test case, endpoint, operation, and figure in this sample is fictional and constructed to show TMG's methodology and reporting standard for a combined REST and GraphQL API penetration test — not to describe any real organization's security posture.
- How TMG defines scope, rules of engagement, and testing objectives across parallel REST and GraphQL surfaces
- How REST endpoints are enumerated and how a GraphQL schema is discovered and mapped
- How authentication, session/token security, and role-based authorization are tested across both interfaces
- How object-level authorization (BOLA), function-level authorization (BFLA), field-level authorization, and tenant isolation are validated consistently between REST and GraphQL
- How GraphQL-specific risk — resolver authorization, nested-query authorization, introspection, query complexity/depth, and batching/aliases — is assessed
- How business logic, webhook security, and API server-side controls are tested
- How findings are rated for severity, evidenced, and root-caused with clear remediation guidance
- How a remediation roadmap, management action plan, and retest recommendations are structured for engineering follow-through
Application & API profile
The fictional OrionSphere Enterprise Platform is a multi-tenant enterprise SaaS/FinTech infrastructure platform serving approximately 4.2 million fictional registered customers across roughly 1,200 fictional employees' worth of operations. It exposes a versioned REST API (/api/v1/, with a subset of resources additionally available under /api/v2/) covering authentication, users, organizations and members/roles, accounts, transactions, invoices, subscriptions, files, notifications, webhooks, reports, and platform administration — alongside a single-endpoint GraphQL API (/graphql) modeling the same domain across Organization, User, Member, Role, Account, Transaction, Invoice, Subscription, Payment, File, Notification, Webhook, AuditEvent, Report, and Admin types, accessed through seven fictional API roles: Visitor, Standard User, Billing User, Manager, Support Agent, Administrator, and API Integration User.
The fictional technology stack pairs a Node.js/Express REST layer with a Node.js GraphQL server using a resolver-per-field execution model, a shared PostgreSQL data store, and a JWT access-token plus rotating refresh-token architecture (with independent API-key authentication for machine-to-machine integrations), deployed on an AWS-style fictional cloud environment behind a fictional cloud-based CDN/API gateway, with fictional object storage and centralized logging/audit-event infrastructure.
Testing scope & rules of engagement
In scope
- All
/api/v1/*and/api/v2/*REST endpoints supporting the platform - The full
/graphqlschema — Query, Mutation, and Subscription root types - Authentication — login, refresh, logout, MFA, MFA recovery, API-key issuance
- Authorization — role enforcement, object-, function-, and field-level access control, tenant isolation
- GraphQL resolver security — root and nested resolver authorization, schema introspection, query complexity/depth
- Organization management, billing workflows, file/object APIs, and webhook configuration and delivery
Out of scope
- Denial-of-service testing, including GraphQL resource-exhaustion exploitation — not performed under any circumstances
- Destructive testing, including destructive race-condition automation
- Social engineering and physical security
- Production infrastructure, third-party systems, and cloud-provider internals — testing restricted to the fictional staging environment
Testing was strictly non-destructive and used only the dedicated fictional test accounts listed in Appendix F of the full report — no real user accounts, API keys, or customer data were used at any point. GraphQL testing used only safe, synthetic queries and fictional test objects; no bulk-extraction technique or automated resource-exhaustion exploitation was performed, and no real customer data was accessed, used, or referenced during the engagement.
Methodology
TMG Security's API testing approach is conceptually informed by industry-recognized frameworks, including OWASP API Security guidance, OWASP GraphQL Security guidance, and the OWASP Web Security Testing Guide. TMG Security is not affiliated with or certified by OWASP, and no copyrighted material from these references is reproduced in this report — they are cited only as conceptual grounding for TMG's own methodology.
Testing followed a 26-stage illustrative lifecycle spanning both disciplines: reconnaissance and attack-surface discovery, REST API enumeration, GraphQL schema discovery, authentication and authorization testing, object-, function-, and field-level authorization and tenant-isolation testing, session and token security, REST and GraphQL input validation and injection testing, REST and GraphQL data-exposure and mass-assignment testing, GraphQL introspection, query-complexity/depth, batching/alias, resolver and mutation-security testing, subscription security, API rate limiting, business-logic testing, webhook and file/object API testing, configuration and abuse-case testing, manual vulnerability validation, and structured reporting with retest planning. Every candidate finding was manually validated by a TMG Security fictional tester before inclusion — no automated-scanner output was included without manual confirmation.
API attack surface discovery
TMG Security mapped the fictional OrionSphere Enterprise Platform's combined REST and GraphQL attack surface before beginning role-based testing, combining authenticated browsing, GraphQL introspection (available in this fictional staging environment), published API documentation, and systematic parameter/route enumeration. The result is a total logical API attack surface of 218 interfaces and operations across four categories.
| Category | Count |
|---|---|
| REST Endpoints | 126 |
| GraphQL Operations (Queries + Mutations + Subscriptions) | 78 |
| GraphQL Types | 41 |
| Webhook Callback Operations | 14 |
| Total Logical API Attack Surface | 218 |
REST API enumeration & GraphQL schema discovery
TMG Security enumerated the fictional REST surface through authenticated browsing across all seven roles, review of the published OpenAPI/Swagger documentation, and systematic testing of resource, sub-resource, and legacy-route variants — producing a complete 126-row REST endpoint register. In parallel, TMG Security mapped the fictional GraphQL schema using a combination of introspection, the published GraphQL documentation portal, and manual query construction validated against observed responses — producing a complete 78-row GraphQL operation register spanning 41 types.
Why REST and GraphQL together: the OrionSphere platform exposes materially the same underlying objects through both interfaces, so TMG Security tested REST and GraphQL representations of the same objects in parallel to identify inconsistent authorization enforcement between them. This proved to be the single most significant pattern in this assessment — several of the highest-severity findings (including API-001 and API-003) are reproducible through both interfaces, while others (API-002, API-007, API-008, API-011) are GraphQL-specific weaknesses that a REST-only assessment would not surface. Authorization consistency between REST and GraphQL matters because both interfaces converge on the same shared resolver/service layer, and a control implemented for one interface but not ported to the other creates a direct authorization-downgrade path.
| Endpoint | Method | Result |
|---|---|---|
| /api/v1/organizations/{id} | GET | Finding |
| /api/v1/invoices/{id} | PATCH | Finding |
| /api/v1/organizations/{id}/roles/{userId} | PATCH | Finding |
| /api/v1/files/{id} | GET | Finding |
| /api/v1/webhooks/validate | POST | Finding |
| /api/v1/reports/{id}/comments | POST | Finding |
| /api/v1/auth/login | POST | Clean |
| /api/v2/accounts/{id} | GET | Clean |
| Operation | Type | Result |
|---|---|---|
| organization(id) | Query | Finding |
| updateOrganizationBilling(id, input) | Mutation | Finding |
| organization.members.billing (nested) | Query (nested) | Finding |
| user(id) | Query | Finding |
| updateMemberRole(orgId, userId, role) | Mutation | Finding |
| me | Query | Clean |
| __schema | Query (introspection) | Finding |
Authentication & session/token security testing
TMG Security assessed the fictional OrionSphere authentication surface — credential login, refresh-token issuance and rotation, logout, MFA challenge/verification, and MFA account recovery — across both the REST API and the shared authentication service used by the GraphQL gateway, along with token lifecycle (issuance, rotation, expiration, revocation on logout) across both REST-issued and GraphQL-consumed tokens. Credential-based login correctly rejects invalid attempts with a generic error and enforces MFA where enrolled, and refresh-token rotation and expiration enforcement both operate as expected. Two gaps were confirmed: the MFA account-recovery flow does not bind a recovery confirmation code to its originating recovery request, allowing a code issued for one request to be accepted against a second, concurrently pending request on the same account; and token revocation on logout is not fully synchronous, leaving a narrow validity window during which a just-invalidated token remains technically usable.
Account Recovery API Weakness
The MFA-recovery confirmation step (POST /api/v1/auth/mfa/recovery) accepts a confirmation code that is not bound to the specific recovery request that generated it, allowing an already-authenticated low-privilege session to complete a recovery flow intended for a different, concurrently pending request. Recommendation: bind each confirmation code to its originating recovery-request ID and invalidate superseded pending requests when a new one is created.
Authorization testing — BOLA, BFLA, field-level & tenant isolation
Authorization testing was the most significant category in this fictional assessment, covering object-level authorization (BOLA), function-level authorization (BFLA), field-level authorization, and tenant isolation across all seven fictional roles, on both REST endpoints and their GraphQL equivalents. General role-boundary enforcement was found to be consistently applied at the root/entry-point level across both interfaces — the material exceptions are concentrated in these four dedicated categories. Object-level authorization testing confirmed a cross-tenant gap reproducible through both the REST organization endpoint and its GraphQL equivalent, the most severe finding in this report given its consistency across both interfaces. Function-level testing confirmed that a GraphQL billing mutation intentionally hidden from the UI remains callable by non-administrative roles, and that a role-change mutation insufficiently validates the caller's own authority over the target organization, enabling a privilege-escalation path. Tenant isolation requires enforcement at the resolver/service layer, not the presentation layer — flat, root-level tenant checks were consistently enforced, but the confirmed gaps are concentrated where tenant context must be re-derived deeper in the object graph or workflow.
Cross-Tenant BOLA Across REST and GraphQL Objects
Both the REST organization-profile endpoint (GET /api/v1/organizations/{id}) and the equivalent GraphQL organization(id) query accept a client-supplied object identifier and return the corresponding organization record without verifying that the requesting user's session is associated with that organization. Neither handler performs a server-side ownership check between the authenticated session and the requested object; both rely solely on the client-supplied identifier — indicating the tenant-ownership check is missing at the shared service layer rather than in either interface individually. Recommendation: implement a single, centrally enforced tenant-scoping check so REST and GraphQL inherit the same authorization guarantee.
Privilege Escalation Through Role Mutation
The GraphQL updateMemberRole mutation checks that the requesting user is authenticated and belongs to the organization, but does not additionally verify the requester's own role is authorized to grant the requested target role — a fictional Standard User account successfully updated its own role to Manager. Recommendation: add explicit requester-role authorization to the role-update resolver and disallow self-targeted role changes entirely.
REST & GraphQL input validation, injection & data exposure testing
TMG Security tested SQL/NoSQL-injection-style, command-injection-style, template-injection-style, and cross-site-scripting-style fictional payloads across REST parameters, GraphQL arguments, and free-text fields, using only safe, non-destructive markers. Database- and OS-level injection classes were not reproducible against the fictional target; parameterized queries and consistent input sanitization were observed throughout. The one confirmed injection-class finding is a stored cross-site scripting condition in API-supplied support content. Separately, REST and GraphQL data-exposure testing reviewed response payloads across all resource groups for fields returned beyond what the requesting role's function requires — REST input handling and structural validation were found generally sound, while a field-level authorization gap (detailed in Section 09) allows both interfaces to over-serialize sensitive fields to non-privileged roles.
Stored Cross-Site Scripting Through API-Supplied Support Content
The report-comment API (POST /api/v1/reports/{id}/comments) does not sufficiently encode HTML/script content before it is rendered in the internal Support Agent and Administrator report-review views. Encoding is applied on the customer-facing view but not consistently on the internal agent/admin view. Recommendation: apply a single shared, context-aware output-encoding component across all report-rendering views.
GraphQL Excessive Sensitive Data Exposure
GraphQL field resolvers on the User type return fields based on a broad, shared object serializer rather than role-aware field-level authorization, so an authenticated Standard User's query returns internal-only fields (internalRiskScore, billingAccountReference, adminNotes) not shown in that role's UI. Recommendation: introduce role-aware field resolvers (or a field-authorization directive) for all sensitive fields across the User, Organization, and Account types.
GraphQL-specific security
Because GraphQL's single-endpoint, client-driven query model introduces trust-boundary complexity that a flat REST authorization model does not, TMG Security applied dedicated GraphQL-specific testing. Introspection (__schema, __type) is available in this fictional staging environment, and exposure-versus-impact analysis found that introspection meaningfully shortens the discovery path to operations that are separately exploitable. Query complexity and depth controls were found not to be enforced server-side: a synthetic nested query well above the documented safe threshold was accepted and fully executed rather than rejected — a resource-consumption risk rather than a confirmed denial-of-service, consistent with the non-destructive rules of engagement. Batching and aliases testing found that individual authorization checks were correctly applied to each aliased object in a batch, but rate-limiting counters treat an aliased batch as a single call rather than counting each aliased sub-query independently.
Most significantly, GraphQL resolver authorization testing — verifying that authorization checks performed at a root query or mutation are independently re-validated at each nested field resolver — produced this report's most technically significant finding: the root organization query and its immediate child resolver both enforce tenant-ownership authorization correctly, but a resolver three levels deep in the object graph honors a caller-supplied override argument without re-checking authorization, trusting the parent object's already-authorized context instead. Mutation-security testing of all 28 fictional GraphQL mutations found this same pattern — authorization implemented per-mutation rather than through a shared, centrally enforced middleware — concentrating the majority of this report's most severe findings in the mutation layer.
GraphQL Privileged Mutation Authorization Bypass
The GraphQL mutation updateOrganizationBilling is hidden from the front-end UI for non-administrative roles, but the mutation itself performs no server-side role check and remains fully callable by any authenticated Standard User. A fictional Standard User account changed its own organization's billing tier to "enterprise" with no authorization error. Recommendation: apply the same shared role-authorization guard used by REST billing endpoints to every GraphQL mutation resolver that touches billing or entitlement state.
GraphQL Nested Resolver Authorization Bypass
The root organization query correctly authorizes access to the requester's own organization, but a nested resolver three levels deep (organization.members.billing.invoices) does not independently re-check tenant/role authorization, instead trusting the parent object's already-authorized context to resolve child invoice data that in fact belongs to a different fictional member record. Recommendation: adopt a per-resolver (or per-type) authorization pattern — e.g., a GraphQL directive applied to every sensitive field — so nested resolvers cannot bypass tenant/role checks by relying on parent-level authorization.
Business logic, webhook & API server-side security testing
Business-logic testing examined fictional multi-step workflows — subscription plan-tier transitions, discount redemption, invoice/refund state changes, and account-ownership transfer — for state-integrity and authorization gaps not caught by endpoint- or field-level testing alone. This category produced the assessment's third Critical finding: an invoice can be moved directly to a "refunded" state — via both REST and the equivalent GraphQL mutation — without a preceding approval or payment-reversal workflow event, and in the GraphQL case, against an invoice belonging to a different fictional tenant. Webhook-security testing assessed destination validation, payload signing, and replay protection for the fictional outbound event-delivery system: webhook payloads are signed and secrets are not re-exposed after issuance, but the destination-validation endpoint performs a server-side fetch to a client-supplied URL without restricting internal/private address ranges (a Server-Side Request Forgery-class finding), and webhook signatures do not incorporate a timestamp or nonce, so a captured payload could in principle be replayed. Rounding out this category: REST and GraphQL mass-assignment testing found both interfaces bind a subset of hidden fields from a Standard User session; API rate limiting is applied on the standard login endpoint but is inconsistent across other authentication-adjacent endpoints and the GraphQL endpoint generally; CORS configuration on both interfaces trusts an overly broad set of origins; error handling is generally sound on REST but GraphQL error responses include verbose internal resolver/database detail; and API documentation, versioning, and configuration hygiene showed only lower-severity, hardening-oriented gaps.
Business Logic Authorization Bypass Allowing Unauthorized Financial State Manipulation
Both the REST invoice-update endpoint and the equivalent GraphQL updateInvoice mutation accept a client-supplied invoice status/amount transition and apply it without validating that the transition is reachable from the invoice's current state or that the requesting role is permitted to perform it. A fictional Billing User was able to move a test invoice directly from "issued" to "refunded" — skipping the required "paid" and approval states — and, in the GraphQL case, the mutation simultaneously revealed invoice detail belonging to a different fictional tenant during the same test sequence. Recommendation: introduce an explicit, server-side invoice state machine shared by REST and GraphQL, gate every transition on both role authorization and current-state validity, and require an approval-reference for refund-class transitions.
Server-Side Request Forgery Through Integration Webhook API
The webhook "validate" feature (POST /api/v1/webhooks/validate), which performs a server-side test request to a customer-supplied callback URL before saving a webhook subscription, does not restrict the destination beyond basic URL-format validation. No destination allow-listing, DNS-resolution restriction, or private-IP-range blocking was observed in the fictional test environment. Recommendation: implement an egress allow-list and explicit blocklist for private/link-local/metadata IP ranges on all server-initiated outbound fetches; route validation requests through an isolated, non-privileged network egress path.
Findings summary
This fictional assessment identified 42 illustrative findings across the OrionSphere Enterprise Platform's REST and GraphQL API surface, drawn from 140 fictional test cases executed against 126 REST endpoints and 78 GraphQL operations (Appendices A–C of the full report). Every finding, severity rating, and evidence reference below is fictional and specific to this API penetration test — none are drawn from any other TMG sample report.
| ID | Title | Severity |
|---|---|---|
| API-001 | Cross-Tenant BOLA Across REST and GraphQL Objects | Critical |
| API-002 | GraphQL Privileged Mutation Authorization Bypass | Critical |
| API-003 | Business Logic Authorization Bypass Allowing Unauthorized Financial State Manipulation | Critical |
| API-004 | Stored Cross-Site Scripting Through API-Supplied Support Content | High |
| API-005 | Account Recovery API Weakness | High |
| API-006 | REST File Authorization Bypass | High |
| API-007 | GraphQL Excessive Sensitive Data Exposure | High |
| API-008 | GraphQL Nested Resolver Authorization Bypass | High |
| API-009 | Legacy API v1 Authorization Weakness | High |
| API-010 | Server-Side Request Forgery Through Integration Webhook API | High |
| API-011 | Privilege Escalation Through Role Mutation | High |
| API-012 | GraphQL Introspection Exposes Privileged Administrative Operations | Medium |
| API-013 | GraphQL Query Complexity Enforcement Gap | Medium |
| API-014 | GraphQL Query Depth Control Gap | Medium |
| API-015 | GraphQL Batching / Alias-Based Excessive Object Retrieval | Medium |
| API-016 | Insufficient Rate Limiting on Authentication Endpoints | Medium |
| API-017 | Access Token Revocation Weakness on Logout | Medium |
| API-018 | Mass Assignment via REST and GraphQL Update Operations | Medium |
| API-019 | Webhook Replay Protection Missing | Medium |
| API-020 | CORS Configuration Trusts Unnecessary Origins | Medium |
| API-021 | Verbose GraphQL Error Responses Reveal Internal Details | Medium |
| API-022 | API Versioning Weakness — Inconsistent Deprecation Enforcement | Medium |
| API-023 | Business Logic Replay in Discount Redemption Workflow | Medium |
| API-024 | Technology / Version Disclosure via Response Headers | Low |
| API-025 | Missing Security Header Hardening (Permissions-Policy / Referrer-Policy) | Low |
| API-026 | Unused / Unnecessary HTTP Methods Enabled | Low |
| API-027 | Minor Input Validation Inconsistencies Across Endpoints | Low |
| API-028 | Non-Sensitive GraphQL Schema Metadata Exposure | Low |
| API-029 | Residual Debug Logging in Client Bundle | Low |
| API-030 | API Documentation / Enforcement Mismatch | Low |
| API-031 | Stale Endpoint Metadata in API Registry | Low |
| API-032 | Incomplete Session Artifact Cleanup on Logout | Low |
| API-033 | Public GraphQL Documentation Portal (Intended Exposure — Review Recommended) | Informational |
| API-034 | Introspection Intentionally Available in Non-Production Environment | Informational |
| API-035 | Non-Sensitive Schema Metadata Present in Build Artifacts | Informational |
| API-036 | Security.txt Not Present | Informational |
| API-037 | API Inventory / Asset-Management Improvement Opportunity | Informational |
| API-038 | Logging Coverage Recommendation for Authorization Events | Informational |
| API-039 | Monitoring Enhancement Opportunity for GraphQL Resolver Errors | Informational |
| API-040 | API Lifecycle Governance Recommendation | Informational |
| API-041 | Deprecated Endpoint Cleanup Backlog | Informational |
| API-042 | Recommend Automated Authorization Regression Testing | Informational |
Risk heatmap & attack chain analysis
The full sample PDF plots all 42 fictional findings on a likelihood-versus-impact risk heatmap: the three Critical and eight High findings cluster in the "Likely/Almost Certain × Major/Severe" quadrant, the twelve Medium findings sit in the mid-range "Possible × Major" band, and the Low and Informational findings cluster toward "Rare/Unlikely × Minor" — a distribution that supports prioritizing the authorization and GraphQL resolver findings first.
Individual findings are often most meaningful in combination. The report's fictional composite attack-chain scenario illustrates how, starting from a low-privilege authenticated Standard User session, the GraphQL nested-resolver authorization gap (API-008) permits traversal into another member's billing and invoice data through a nested query, even though the root organization query is correctly scoped; the excessive GraphQL data-exposure finding (API-007) means that object — and equivalent objects reachable the same way — returns more internal detail than intended; and the business-logic authorization bypass in invoice/refund handling (API-003) shows that workflow-state enforcement has gaps elsewhere in the platform, reachable through both REST and GraphQL. Combined, this fictional path could reach cross-tenant financial data exposure together with unauthorized financial-state manipulation — a composite illustrative impact more significant than any single finding in isolation, and a concrete example of why resolver-level authorization testing is treated as a priority discipline in this methodology. This is a fictional composite scenario and must not be construed as an exploit chain against any real system.
Business impact analysis
The table below maps each Critical and High fictional finding to the illustrative business dimensions it most directly affects, supporting prioritization conversations beyond pure technical severity.
| Finding | Confidentiality | Integrity | Fraud / Revenue Risk | Customer Trust |
|---|---|---|---|---|
| API-001 | High | Low | Medium | High |
| API-002 | Low | High | High | Medium |
| API-003 | Medium | High | High | High |
| API-004 | Medium | Medium | Low | Medium |
| API-005 | Medium | Low | Low | Medium |
| API-006 | Medium | Low | Low | Medium |
| API-007 | High | Low | Low | Medium |
| API-008 | High | Medium | Medium | High |
| API-009 | Medium | Low | Low | Low |
| API-010 | Medium | Medium | Low | Low |
| API-011 | Low | High | Medium | Medium |
Remediation roadmap
The fictional sample remediation roadmap sequences all 42 findings across three phases, prioritizing the Critical authorization and GraphQL resolver findings first. All dates and timelines shown are illustrative.
0–30 days
- Critical cross-tenant BOLA across REST and GraphQL (API-001)
- GraphQL privileged mutation authorization bypass (API-002)
- Business logic / financial workflow authorization bypass (API-003)
- Legacy API v1 authorization weakness (API-009)
- Privilege escalation through role mutation (API-011)
31–60 days
- High GraphQL data exposure (API-007) and nested resolver authorization bypass (API-008)
- SSRF through the integration webhook API (API-010) and REST file authorization bypass (API-006)
- Stored XSS through API-supplied support content (API-004) and account recovery API weakness (API-005)
- Rate-limiting hardening and GraphQL query-control gaps (API-016, API-013, API-014, API-015)
61–90 days
- Configuration & header hardening (API-020, API-024, API-025, API-026)
- Logging & monitoring improvements (API-038, API-039)
- Documentation & schema governance (API-030, API-033, API-035, API-037)
- API lifecycle / deprecation controls (API-022, API-031, API-040, API-041)
- Remaining defense-in-depth backlog (API-017, API-018, API-019, API-021, API-023, API-027, API-028, API-029, API-032, API-036, API-042)
Management action plan & retest recommendations
The full sample PDF tracks fictional management response, ownership, and validation approach for every finding in a single management action plan, ensuring each of the 42 findings appears exactly once with an owner, priority, target date, status, and validation method. TMG Security recommends a structured retest following remediation: a full retest of all three Critical findings and all eight High findings, including role-based regression testing across related REST endpoints and GraphQL operations; a targeted retest of each Medium finding against its specific affected endpoint, GraphQL operation, or workflow, with independent verification that GraphQL resolver-authorization findings (API-002, API-008, API-011) are enforced at every nested resolver level; and a confirmation-only review of Low and Informational items, batched into the next general assessment cycle. This retest methodology is illustrative — this report does not claim that any finding has been remediated or retested.
Positive security controls & testing limitations
This fictional assessment is not intended to be entirely negative. TMG Security identified a number of controls operating effectively across the OrionSphere Enterprise Platform's REST and GraphQL surfaces, including functional MFA with single-use recovery codes for enrolled accounts, appropriate refresh-token rotation, disallowed deprecated TLS protocols and weak cipher suites, a centralized fictional API gateway fronting both layers, a baseline cloud-based WAF, type-level GraphQL input validation and REST schema validation, centralized authentication and role-change logging, root-level GraphQL query and mutation authorization correctly enforced in the majority of operations tested, effective rate limiting on the primary login endpoint, and root-level object-level authorization correctly enforced on the majority of REST endpoints and GraphQL queries tested.
The following limitations apply to this fictional sample assessment: OrionSphere Technologies, Inc. and the OrionSphere Enterprise Platform are fictional and no real organization, REST, or GraphQL API was assessed; no real credentials, API keys, cloud credentials, or production systems were used or accessed; no real customer data was accessed at any point; no production environment was tested — only a fictional staging/controlled assessment environment is represented; no destructive testing or denial-of-service testing, including GraphQL resource-exhaustion exploitation, was performed; no bulk-data-extraction technique was constructed or demonstrated, including from the batching/alias finding (API-015); no social engineering or physical security testing was performed; and all evidence, screenshots, GraphQL queries, and request/response examples referenced in the full report are synthetic.
OrionSphere Technologies, Inc. and the OrionSphere Enterprise Platform are fictional. They do not correspond to any real business or application, and any resemblance to an actual organization is purely coincidental. The REST API (api.orion-example.com) and GraphQL API (graphql.orion-example.com/graphql) referenced throughout this sample are fictional, non-resolving placeholder domains used only for illustration.
No real client was engaged and no real client API infrastructure was tested. No production environment, system, network, or cloud resource of any kind was accessed, scanned, or tested in the creation of this document. No real user data, personal information, or customer records were accessed, viewed, or processed, and no real credentials — including cloud, application, API, or third-party credentials — were used or disclosed anywhere in this report.
All GraphQL schemas, queries, mutations, subscriptions, and type definitions shown in this report are synthetic and constructed for illustration only. All vulnerabilities, findings, risk ratings, CVSS scores, dates, and remediation statuses described in this report are fictional and were constructed for demonstration purposes. All proofs of concept are illustrative, synthetic, and non-destructive; none were executed against a real or live target, and none involved denial-of-service exploitation or destructive race-condition automation. All screenshots, request/response examples, and evidence panels are synthetic or simulated representations created specifically for this sample report. No real exploitation occurred at any point, and no actual customer impact occurred.
This document is not an actual client API penetration test. It does not represent evidence of the security posture of any real organization, does not constitute a certification or compliance decision, and does not constitute security, legal, or compliance advice for any real system. It may be shared with prospective clients, partners, and other interested parties to illustrate TMG Security's API security testing methodology, technical reporting standards, and evidence-presentation quality across both REST and GraphQL interfaces, and should not be relied upon for any compliance, legal, contractual, or procurement decision.
Frequently asked questions
What is an API penetration testing report?+
An API penetration testing report is the formal deliverable produced after an authorized, hands-on security assessment of an organization's REST and/or GraphQL interfaces. It documents scope and methodology, the API attack surface tested, detailed findings with severity ratings and evidence, risk and business-impact analysis, and remediation guidance — giving engineering and security leadership an evidence-based roadmap for closing the gaps found.
What does an API penetration test cover?+
An API penetration test covers authentication and session/token security, authorization at the object, function, field, and tenant level, business logic, injection and input validation, data exposure, mass assignment, rate limiting, webhook security, and configuration hardening — tested across every defined API role under authenticated and unauthenticated conditions. When both REST and GraphQL interfaces exist, as illustrated in this sample, testing also validates that authorization is enforced consistently between them.
What is included in a REST API penetration test?+
A REST API penetration test typically includes systematic endpoint enumeration (including legacy and deprecated routes), authentication and session testing, object- and function-level authorization testing, input validation and injection testing, data-exposure and mass-assignment testing, rate-limiting and CORS review, and error-handling and configuration review — as demonstrated across Sections 07–12 of this sample report.
What is included in a GraphQL security assessment?+
A GraphQL security assessment covers schema discovery and introspection review, query-complexity and query-depth controls, batching and alias abuse, resolver-level authorization at both root and nested fields, mutation and subscription security, and data-exposure testing specific to GraphQL's flexible, client-driven query model — categories illustrated in Sections 07 and 11 of this sample report.
What is BOLA in API security?+
BOLA (Broken Object-Level Authorization) occurs when an API returns or modifies a specific object based on a client-supplied identifier without verifying the requesting user is actually authorized to access that particular object. It is one of the most common and highest-impact API vulnerability classes, illustrated in this sample by API-001, a cross-tenant BOLA finding reproducible through both the REST and GraphQL interfaces.
How does GraphQL resolver authorization differ from traditional REST authorization?+
REST authorization is typically checked once, at the endpoint that handles a single, flat request. GraphQL's resolver model lets a single query traverse an arbitrarily deep, client-shaped object graph, so authorization checked only at the root query or mutation does not automatically protect nested field resolvers deeper in that graph — each resolver that touches sensitive data must independently re-validate authorization. This distinction is illustrated in this sample by API-008, a nested-resolver authorization bypass.
Why is tenant isolation important in API security?+
In a multi-tenant API, tenant isolation ensures one customer's authenticated session can never read or modify another customer's data, regardless of how deeply nested the request or how the object is reached. Because tenant checks must be enforced at the resolver/service layer rather than inferred from the presentation layer, gaps often appear where tenant context must be re-derived deeper in a workflow or object graph — as illustrated by API-001, API-003, and API-008 in this sample.
Is this API penetration testing report based on a real client?+
No. This is a fictional, illustrative sample report created to demonstrate TMG Security's API security testing methodology and technical reporting depth across REST and GraphQL. OrionSphere Technologies, Inc. and the OrionSphere Enterprise Platform are fictional, and no real client environment, REST API, or GraphQL API was assessed.
View the full sample PDF
The complete 92-page illustrative report, including the full methodology, REST endpoint and GraphQL operation registers, all 42 detailed findings with dual REST/GraphQL evidence panels, the risk heatmap, attack-chain analysis, remediation roadmap, and every appendix — API test case register, REST endpoint register, GraphQL operation register, role & authorization matrix, finding register, and test account register.
Request a similar assessment
Looking to validate your own REST and GraphQL API security directly? TMG Security's API Security Testing team can scope a real API penetration test built with the same structure, methodology, and reporting depth shown in this sample — attack-surface discovery, authenticated role-based testing, object-, function-, and field-level authorization testing, GraphQL resolver security, a full finding register, and a remediation roadmap your engineering team can execute against. TMG's offensive security practice also covers Web Application Security Testing and the broader Offensive Security & Penetration Testing program this assessment type sits within. For a conceptual reference on common testing categories, see TMG's OWASP Top 10:2025 quick reference for penetration testers.
