01
Administrator action first

Do this now

Close the vulnerable path first. If you see evidence of compromise, preserve it before beginning cleanup.

  1. 1
    Preserve evidence when compromise is suspected

    Save current logs and take a full file-and-database backup before deleting accounts, files, or scheduled tasks. Restrict access or ask your host for help if changes are continuing.

  2. 2
    Update WooPayments

    Install the latest release supported by your WordPress and WooCommerce environment. Do not downgrade to the historically important 5.6.2 release.

  3. 3
    Confirm the active version

    In WordPress, open Plugins and verify the version shown for WooPayments, formerly named WooCommerce Payments.

  4. 4
    Investigate the period of exposure

    If version 5.6.1 or an earlier affected branch was active, review privileged accounts, content, software, tasks, files, and available audit logs.

02
At a glance

Quick facts

The affected range is historical. The safe operational choice today is the latest supported release.

CVE
CVE-2023-28121
Product
WooPayments, formerly WooCommerce Payments
Affected versions
NVD describes 5.6.1 and lower; Woo’s original advisory addresses the vulnerable 4.8.0–5.6.1 branches.
Historical fix
5.6.2 was the first fixed release in the 5.6 branch; Woo also issued patched releases for older branches.
Potential result
An unauthenticated attacker could act as an elevated user, including an administrator.
NVD severity
CVSS 3.1: 9.8 Critical (NVD assessment)

“Affected” means the vulnerable code was present. It does not mean every store running that version was targeted or compromised. This article intentionally does not repeat the old claim that hundreds of thousands of stores were hacked; the available sources do not support it.

03
Trust and identity

How the authentication bypass worked

The error occurred while WordPress was deciding which user, if any, belonged to the request.

WordPress uses the determine_current_user filter while establishing the current user. BitFire’s 2023 source review identified WooCommerce Payments logic for platform checkout that accepted request-controlled identity information during this decision without first establishing that the caller was trusted.

That mistake crossed a trust boundary: data supplied by a remote request influenced the server’s trusted user identity. The vulnerable code path could therefore make later WordPress permission checks run as an elevated account. This description explains the authorization failure without publishing a working request or payload.

04
Evidence, not assumptions

Was my store compromised?

No single access-log line can answer that question. Review several independent sources of evidence.

Illustration of a WordPress users list with expected, unconfirmed, and unfamiliar administrator accounts
Record unfamiliar accounts and confirm their owner before removing them.
  1. 1
    Administrator accounts and users

    Look for accounts you do not recognize, unexplained privilege changes, unusual email addresses, and creation times that overlap the exposure period.

  2. 2
    Posts, pages, plugins, and themes

    Review recently created content, installed software, activated components, and changes to theme or plugin files.

  3. 3
    Scheduled work and persistence

    Inspect WordPress cron, server cron, must-use plugins, startup files, and unexpected PHP files—especially in locations intended for media.

  4. 4
    Security, access, and audit logs

    Build a timeline from available events. Correlate suspicious requests with user creation, file changes, logins, and outbound activity.

HTTP 200 is not proof of compromise

It only says the server returned a successful HTTP response. Many harmless requests do that.

HTTP 403 is not proof the site is clean

It may show one request was blocked, not that every earlier or alternate attempt failed.

The IP address, response size, and single request pattern printed in the old article are not reliable standalone indicators and have been removed.

05
If something is unfamiliar

Recovery checklist

Contain malicious access, preserve enough evidence to understand it, then remove persistence and rotate secrets.

  1. 1
    Preserve logs and a complete backup

    Keep copies outside the affected hosting account when possible.

  2. 2
    Record and disable unauthorized administrators

    Capture the account details and relevant times before removing access. Confirm unfamiliar accounts are not maintained by your host, agency, or integration.

  3. 3
    Scan and investigate persistence

    Review files, database content, scheduled tasks, active sessions, and outbound connections. Follow the BitFire malware scanning and cleanup guide.

  4. 4
    Contain malicious code before changing secrets

    Active malware may capture new credentials. Isolate or remove it first whenever the incident allows.

  5. 5
    Rotate the credentials the store can reach

    As appropriate, reset administrator passwords, WordPress salts and sessions, API and payment-service keys, hosting and SFTP credentials, and database credentials.

  6. 6
    Update, test, and monitor

    Update all supported software, remove unused components, test checkout and integrations, and watch for the suspicious behavior returning.

06
Defense in depth

Why layered protection matters

The vendor update is the primary fix. Independent controls can reduce risk before a patch is installed or if another application mistake appears.

01 · PATCH

Remove the known flaw

Updating changes the vulnerable application logic and is the most direct, reliable control for this CVE.

02 · REQUEST

Inspect and restrict clients

Bot controls and WAF rules can reduce hostile traffic, though an identity-logic exploit may resemble a legitimate application request.

03 · RUNTIME

Enforce privileged operations

Runtime authorization controls can add another boundary when an unauthenticated request attempts an administrator-only account, file, or database operation.

These controls are complementary, not guarantees. A request-signature WAF may stop known patterns; runtime controls may stop a dangerous outcome; monitoring may reveal what was attempted. None replaces patching, secure application code, tested backups, or incident response.

07
Dated claims

Timeline and sources

The exploitation picture changed during March 2023. These statements preserve Woo’s dates and level of certainty.

  1. Vulnerability reported

    Woo says Michael Mazzolini of GoldNetwork reported the issue through its HackerOne program.

  2. Woo published its advisory

    Woo said it had no evidence of use outside its own security testing at that time and worked with WordPress.org on automatic patched updates.

  3. Possible exploitation reports investigated

    Woo updated the advisory to say a few customers had reported potential exploits and that it was investigating each report.

  4. NVD published CVE-2023-28121

    NVD describes remote unauthenticated administrator access and assigns a CVSS 3.1 base score of 9.8.

References

08
Common questions

WooPayments CVE FAQ

Historical version numbers are useful for investigation, not as downgrade targets.

Is 5.6.2 still the version I should install?

No. Version 5.6.2 is historically important as the first fix in the 5.6 branch. Install the latest supported WooPayments release available for your maintained environment.

Does updating remove an existing backdoor?

No. Updating closes this vulnerable path. It does not remove malicious files, accounts, tasks, sessions, or database changes created earlier.

Should every customer reset a password?

Woo’s advisory said standard WordPress passwords were hashed and did not claim every password was exposed. Use the evidence and exposure period to guide response. If suspicious activity exists, contain malicious code and then rotate affected administrator passwords, sessions, salts, API keys, payment or service keys, and infrastructure credentials as appropriate.

Does an affected version mean my store was hacked?

No. It means the vulnerable code was present. “Vulnerable,” “targeted,” and “confirmed compromised” describe different conditions and should not be treated as synonyms.

About the author

Cory Marsh

Cory has more than 20 years of internet security experience and is a lead developer on the BitFire project.

Read more BitFire research →
Concerned about a store?

Investigate before evidence disappears.

Preserve current logs and a backup, close the vulnerable path, and get help if privileged accounts or files are changing.

Protect my site free →