TECHNOLOGIES: PAYLOAD

Payload CMS Penetration Testing

Payload’s Local API skips access control by default, and that API runs inside the same Next.js app as your front end. We test what each collection, role and endpoint can actually reach. CREST-certified testers, fixed price from £2,540 for a 2-day single-platform scope, quoted within 24 hours.

  • Unlimited retesting
  • Unlimited pre-retesting
  • No hidden fees
Accredited & recognised
Cyber Essentials certified Cyber Essentials Plus certified IASME certifying body ISO 27001 certified ISO 9001 certified Crown Commercial Service supplier UK Cyber Security Council member
CREST
Approved Provider
10
Payload Test Areas
FREE
Retest Until Closed
24h
Scope to Active Test
CLIENT REFERENCE
“I would highly recommend EJN Labs to any organisation seeking reliable, detailed, and well-managed penetration testing services, particularly for government or enterprise-level projects.”
SquareOneImran SaghirProject Lead, SquareOneRead the SquareOne case study →
CLIENT REFERENCE
“There wasn’t another company we could find that could deliver what we needed in the timeframe we needed. The client loved it, and we got instant ROI from the engagement.”
CelloriDan WilcocksonFounder, CelloriRead the Cellori case study →
See all case studies →
WHY IT MATTERS
Skipped

By default, Payload’s Local API skips every access control check, so a call to payload.find or payload.update from your own server code runs with the same reach as an administrator unless overrideAccess is explicitly set to false.

Why Payload access control is code you write, not a role you tick

Payload ships no default roles or example permission matrix. Every collection’s create, read, update and delete function is a plain function your team writes, and Payload’s own access control documentation confirms that read, update and delete can each return a Query constraint that narrows the result to matching documents, while create can only return a boolean because no document exists yet to filter against. Left undefined, an operation falls back to Payload’s own default, a single check for whether a user is present on the request, so the absence of a rule quietly becomes ‘anyone logged in, on everything’. We test what each function actually returns against what the collection is meant to expose, not what a role name implies.

A second, independent layer sits on individual fields: field-level create, read and update functions run in addition to the collection’s own rules, but they can only return a boolean, never a Query constraint, and a field denied on update is silently dropped rather than throwing an error, so a blocked write can look like it succeeded. Authentication adds a third dimension. Auth-enabled collections issue an HTTP-only cookie and a JWT on login, with revocable sessions on by default, and a collection can also carry a non-expiring API key per user, sent as an Authorization header naming the collection slug, checked against the same access control as a password. We test all three layers, collection, field and authentication, for where a permission was written once and assumed to cover the rest.

Payload’s most consequential default sits outside the Admin Panel entirely. Its Local API skips access control by default, so any payload.find, payload.create or other call runs with overrideAccess set to true unless the code explicitly sets it to false and supplies a user, and because Payload runs fully inside your own Next.js application, this is the exact API your React Server Components, custom route handlers and seed scripts call directly. Custom endpoints carry the same responsibility in the other direction: Payload states plainly that they are not authenticated by default, and a plain Next.js Route Handler dropped into the app directory sits outside Payload’s endpoint config altogether. We test every server-side call and every custom route for whether it checks who is asking, rather than assuming the framework already did.

SCOPE

What we pen test on a Payload application

PC-01

Collection Access Control Functions

Every collection’s create, read, update and delete function is a plain function you write yourself, since Payload ships no default roles or permission matrix to start from. Read, update and delete can each return a Query constraint that narrows access to matching documents instead of a flat boolean, while create only ever returns true or false because there is no existing document to filter against.

PC-02

Field-Level Access Control

Individual fields carry their own create, read and update functions on top of the collection-level rules, but a field function can only return a boolean, never a Query constraint. A field denied on read is dropped from the response entirely, and one denied on update is silently discarded without an error, so the request can appear to succeed while the value never actually changes.

PC-03

Default Access and the Access Operation

Any operation left without an access function falls back to Payload’s own default, a single check for whether a user is present on the request, so an undefined function requires login but restricts nothing more specific than that. The same functions also drive the Access operation that Payload runs on login to decide what the Admin Panel shows a user, so a function written loosely enough to pass that check can grant more than the interface implies.

PC-04

Authentication Collections: Cookies, JWT and Sessions

Auth-enabled collections issue an HTTP-only cookie and a JWT together on login, with Payload using revocable sessions by default; switching useSessions off moves to stateless JWTs that stay valid until they expire even after a password change. We test each collection’s tokenExpiration, its cookie flags such as secure and sameSite, and whether sessions or stateless tokens are actually in play, since that choice decides what revoking access can achieve.

PC-05

API Keys and Custom Authentication Strategies

A collection with useAPIKey enabled lets any user hold a non-expiring key that authenticates as that user under the same access control as email and password, sent as an Authorization header naming the collection slug. We test which users and integrations hold a live key, whether disableLocalStrategy locks a service account to API-key-only authentication as intended, and how any custom authentication strategy identifies a request before Payload’s own checks run.

PC-06

Custom Endpoints and Route Handlers

Endpoints added to a collection, global or the top-level config are not authenticated by default, and Payload’s own documentation states that securing them is the developer’s responsibility. A Next.js Route Handler placed directly in the app directory sits outside that endpoints array altogether, so we test both kinds of custom route for whether they check req.user, or an equivalent, before returning or changing data.

PC-07

Hooks and Document Lifecycle Logic

beforeChange, afterChange, beforeRead and afterRead hooks run on every matching operation and can mutate data, call third-party services, or read other collections through the Local API inside the same request. We test hook logic for data returned or written outside what the operation’s own access control intended, and for expensive logic placed on a high-frequency hook such as beforeRead rather than one that only runs on writes.

PC-08

Local API and the overrideAccess Default

The Local API skips access control entirely by default, so every payload.find, payload.create and other operation runs with overrideAccess set to true unless the calling code explicitly sets it to false and supplies a user. Because Payload runs inside your own Next.js app, this is the exact API your React Server Components, custom route handlers and seed scripts call directly, so we test every server-side call for whether it scopes access to the requesting user or quietly trusts the default.

PC-09

Uploads, MIME Restrictions and File Access

Files uploaded to a collection inherit that collection’s own read access control, so a Media collection left open for convenience makes every uploaded file reachable the same way its metadata is. Defining a mimeTypes list restricts the file picker but also skips Payload’s own check against known dangerous file extensions, so we test the read access on upload collections, how tightly mimeTypes is actually scoped, and how disableLocalStorage or an external storage adapter serves the files that get through.

PC-10

GraphQL and REST API Exposure

Every collection and global opens the same find, create, update and delete operations through REST and GraphQL side by side, enforced by the same access control functions either way, with file uploads available through REST and the Local API only. GraphQL introspection and the Playground are disabled in production by default and a maxComplexity limit can be set against expensive queries, so we test that both are actually configured rather than left open, alongside any custom queries or mutations added to the schema.

OUR PROCESS

Payload CMS Penetration Testing: From Scope to Attestation

01

Scope and Access Mapping

We agree the environments, collections and roles in scope, then map every access control function, hook, custom endpoint and Local API call in the config before testing begins.

02

Automated and Role-Based Scanning

Authenticated and unauthenticated scanning across every role and API key, plus targeted checks against known Payload configuration weaknesses.

03

Manual Exploitation

A CREST-certified tester manually tests access control functions, session and token handling, and the custom endpoints and hooks built on top of Payload, chaining findings where they compound.

04

Reporting and Retest

You get a technical report with CVSS scores and reproduction steps, a walkthrough call, a free retest once fixes are deployed, and an attestation letter for auditors.

CREDENTIALS

Verified Accreditations Auditors Accept

Every credential below is independently verifiable. UK procurement teams, FCA supervisors, ISO 27001 / SOC 2 auditors, and cyber insurance underwriters all recognise these standards.

GET YOUR QUOTE

Get a CREST Payload pen test quote in 24 hours

A fixed-price quote back in one business day, from a named CREST assessor. No sales pipeline, no chasing.

  • CREST and IASME accredited. Testing your auditors and clients already recognise.
  • Fast-track testing within 24 hours where required. Free retest of every fix included.
  • Live findings via your client portal, not a four-week PDF.
  • Fixed price from £3,500 for a single-role, single-app scope, agreed up front. Most engagements run £5,000 and up. No day-rate surprises.
What clients say
There wasn’t another company we could find that could deliver what we needed in the timeframe we needed. The client loved it, and we got instant ROI from the engagement.
CelloriDan WilcocksonFounder, Cellori

Under NDA Further named references available on a scoping call.

What happens next
  1. We reply within one business day with a fixed-price quote from a named CREST assessor.
  2. You approve the scope and we book a start date, usually within 24 hours.
  3. Live findings land in your client portal as we test, with a free retest of every fix.
Accredited & recognised
CREST member Cyber Essentials certified Cyber Essentials Plus certified IASME certifying body ISO 27001 certified ISO 9001 certified UK Cyber Security Council Crown Commercial Service supplier

Get your fixed pen test quote in 24 hours

⚡24h reply ✓CREST tester ↻Free retests

or book a 20-min scoping call first

We reply within one business day. Your data stays with us. No newsletter signup.

COMPLIANCE READY

Reports Mapped to Every Framework

Findings are written so your team can reference the report against each framework without translation work.

ISO 27001:2022

Annex A.8.8 management of technical vulnerabilities plus A.5.15-5.18 and A.8.2-8.5 access control validation.

SOC 2 Type I & II

CC6 logical access, CC7 system operations, CC8 change management evidence.

PCI DSS

Requirement 11.4 application penetration testing across cardholder data environments, including ecommerce penetration testing for online retail platforms.

FCA SYSC

SYSC 4.1.1R, 6.1.1R, 13 mapped to each finding for FCA-regulated firms.

UK GDPR

Article 32 effectiveness testing, customer-data security controls, ICO-acceptable evidence.

Cyber Essentials Plus

Direct certification through our IASME body status, single-vendor delivery.

PRICING

Transparent Payload CMS Penetration Testing Pricing

Pricing depends on the number of roles, integrations and environments in scope. See our pricing page for how we quote.

✦ ALWAYS · ON EVERY TIER · NO EXCEPTIONS ✦
✓Free retests, no time limit
✓Free rescheduling
✓No cancellation fees
✓24-hour scope to active testing
✓Live findings to client portal
✓Executive + technical report
✓60-min walkthrough call
✓Letter of attestation
SMALL / SMB
£2,540–£3,730
2 to 3 testing days

Single user role, basic CRUD application, marketing website with auth. Around 5 working days from kickoff to report.

Get a fixed quote
ENTERPRISE
£5,970–£9,090
5 to 7 testing days

Multi-tenant platform, complex authorisation matrix, integration-heavy applications. Around 15 to 20 working days from kickoff to report.

Get a fixed quote

Full UK pen test cost guide

WHY EJN LABS

What You Get From Payload CMS Penetration Testing

Six concrete differentiators competitors don’t all match.

CREST-Certified Testers, Verifiable

Every test by a CREST-certified pen tester (CRT, CCT APP, CCT INF where applicable). Verify our company status at crest-approved.org.

24-Hour Startup, Where Required

From signed scope to active testing in a single business day for incident response, audit deadlines, or regulator-driven timelines.

Live Findings, Not 4-Week PDFs

Critical issues reported during testing through your client portal. Your team remediates while testing continues.

Audit-Ready Reports

Executive summary plus full technical report with CVSS scores and explicit framework mappings (ISO 27001, SOC 2, PCI DSS, FCA SYSC).

Free Retests, Standard

Verify remediation of every finding before close-out. Letter of attestation for audit submission included. Most competitors charge £1,500-£3,000 per retest.

UK-Based CREST Testers

Every engagement performed by vetted, UK-based CREST-certified testers, matched to your needs, security clearance, and compliance scope.

FAQ

Frequently Asked

What access do you need to test our Payload application?

An account in each meaningfully different auth-enabled collection or role you use, so we test the same access control your users actually get, plus an API key where useAPIKey is enabled on a collection. Sight of the Payload Config, in particular the access functions, hooks and custom endpoints, speeds up coverage significantly but is not required for black-box testing.

Does this touch our live data?

No. We test against a staging environment or a cloned copy of your content wherever one exists. Where only production is available, any check that could change real data, including one that could trigger a hook with a third-party side effect, is agreed and scoped in advance, and read-only checks are logged as they happen.

How long does a Payload penetration test take?

A single-platform Payload engagement is scoped at 2 testing days as a starting point, rising with the number of collections, custom endpoints, hooks and integrations in the config. Reporting and a walkthrough call follow testing, with a free retest once fixes are in.

Is a self-hosted Payload application tested differently from one on Payload Cloud?

Not fundamentally. Payload is an open-source framework that runs inside your own Next.js application wherever it is deployed, on Payload Cloud, Vercel, or your own infrastructure, so your server, database and file storage sit in scope alongside the collections, access control and custom code you have written. Payload Cloud manages the underlying hosting rather than your application code, so the difference is about infrastructure access, not about what we test in the application itself.

What is out of scope?

The Payload core framework codebase, since that is Payload’s own code to secure rather than something your configuration changes. Third-party npm plugins you have not installed, and any infrastructure outside the Next.js application, unless you scope a wider cloud or network review alongside it.

Does Payload have a policy for reporting security issues?

Payload runs a security disclosure process for its own framework: vulnerabilities are reported to security@payloadcms.com under its GitHub security policy. That covers issues in Payload’s core code, not the access control functions, hooks, custom endpoints and Local API calls your team has written, which is what this engagement tests. We confirm Payload’s and your hosting provider’s current terms with you during scoping before any testing starts.

Do you test the GraphQL API as well as REST?

Yes. GraphQL exposes the same collections and globals through the same access control functions as REST, so we test both, with one exception: file uploads only work through the REST and Local APIs, so we test that boundary rather than assuming GraphQL coverage carries over completely.

EXPLORE EVERY SERVICE

20+ CREST-accredited testing services in one place

Web, mobile, API, cloud, AI, infrastructure, red team. Pick the test that fits your environment.

Penetration testing services
READY TO START

Get a fixed price for your Payload application

Payload’s Local API skips access control by default, and that API runs inside the same Next.js app as your front end. We test what each collection, role and endpoint can actually reach. CREST-certified testers, fixed price from £2,540 for a 2-day single-platform scope, quoted within 24 hours.