WordPress security / Case 03
Real scenario · client identity private
WordPress Security Audit: Suspicious Accounts and File-Editing Plugins on Client Sites
This WordPress security audit case study covers the review that ran alongside our October 2026 PHP2Shell patching work on several live and staging WordPress sites. Besides checking for signs of earlier misuse, the review found file editor and file manager plugins that let a logged-in user change server files, and user accounts nobody could readily match to a known owner. We documented the findings with concise follow-up actions, and no confirmed compromise appeared in the sampled evidence.
Plain-English summary
What this solved for the business or user
This review gave the website owners a written, evidence-based look at the question a patch cannot settle: whether anything already on their sites could let someone back in. We kept what we actually saw apart from what still needed checking, and we described nothing as clean beyond what the evidence supported.
Read the original patching project: PHP2Shell patching and security review
Project snapshot
At a glance
| Client | Website owners, kept anonymous |
|---|---|
| Scope | Several live (production) and staging (test copy) WordPress environments on different PHP branches and hosting setups, including managed hosting |
| Services | WordPress user access audit, log review, file-access findings, documentation and follow-up planning |
| Platform | WordPress on PHP, across managed and other hosting configurations |
| Timeline | October 2026, alongside the PHP2Shell patching project |
| Headline result | Findings documented with concise follow-up actions. No confirmed compromise in the sampled evidence, which was not a full forensic clearance. |
01 / How it started
How this started
This review started in October 2026, during our PHP2Shell patching project for several live and staging WordPress environments on different PHP branches and hosting setups, including managed hosting. The patching has its own case study, so this page covers the other question that work raised: what a patched server cannot tell you. While investigating, the review also turned up file editor and file manager plugins, and user accounts nobody could readily match to a known owner.
02 / Why it mattered
Why patching alone was not enough
A patched PHP runtime closes a known hole, but it says nothing about access someone may already have, such as a login created earlier or a plugin that lets a logged-in user edit files on the server. Patching closes the door. The security review checks whether anyone already walked through it, and what would make the next break-in worse.
03 / Investigation
How we investigated
- Before looking closely at anything, we created recovery points where the hosting supported them and kept a dated record of the environment state. That gave every later comparison a fixed starting point.
- We went through the visible WordPress user accounts and their roles, including who held the administrator (admin) role, the role with full control of a site, alongside the available security-related activity. Every account that can sign in is a way into the dashboard, so each one needs a known owner.
- Accounts we could not readily match to a known owner went on the list as suspicious, with their ownership marked for verification. We did not label them malicious, because a missing owner is a warning sign, not proof.
- We read the web-server and PHP error logs we could export, watching for odd requests and error patterns that deserved a closer look. We wrote the time window and sampling limits beside each result, so nobody could mistake a sample for a full history.
- We recorded the file editor and file manager plugins as findings in their own right, because these dashboard tools let a logged-in user edit server files whether or not anyone has misused them yet.
- We wrote up what we saw apart from what still needed proof: account ownership, file integrity checks (comparing site files against known-good copies), fuller log coverage, and host confirmation for unresolved runtimes. That way a suspicion never became a fact, and a gap in the evidence never became a clean result.
- We updated the activity-logging plugin in the reviewed environment to support ongoing change tracking, then prepared concise follow-up actions.
Findings
What the WordPress security audit found
| Finding | Evidence | Risk (plain English) | Action | Status |
|---|---|---|---|---|
| File editor and file manager plugins | Found in the review: dashboard tools that let a logged-in user edit server files | With an admin login, or a flaw in the plugin itself, someone can change the site's code from a browser | Recorded as an observed finding | Documented in the written findings |
| Suspicious user accounts | User accounts that could not be readily matched to a known owner | An account nobody can vouch for may be a forgotten login, or a way in for someone else | Recorded for ownership verification instead of being judged on sight | Ownership listed as a task to validate |
| Signs of compromise | No confirmed compromise in the sampled evidence | A sample covers a set time window, so it cannot rule out activity outside it | Time window and sampling limits written down with the result | Not a full forensic clearance; fuller log coverage and file integrity checks listed for validation |
WordPress includes a Theme File Editor and a Plugin File Editor that let any administrator edit PHP files from the browser, and file manager plugins go further, with upload, edit and delete access to any file. Plugin flaws can open that access to people with no login at all: NVD records that CVE-2020-25213 let unauthenticated attackers upload and run PHP in File Manager versions before 6.9, with exploitation in August and September 2020 (public context, not a finding from this review). Even without these tools, an admin can upload a plugin containing PHP unless DISALLOW_FILE_MODS is set, so every admin login is effectively the power to run code on the server.
An account nobody can match to a person might be a former contractor or an old support login, or it might be someone else's way back in, and the account list alone cannot tell you which. The safe default is to treat an unrecognized account as a possible compromise until its owner is confirmed, without calling it malicious. That is why account ownership went on the validation list instead of being settled on a guess.
04 / Follow-up
What we did with the findings, and what we recommend
- Accounts, what we did: we listed ownership of the unrecognized accounts as a task needing further validation.
- Accounts, hardening guidance: record an unrecognized account before changing anything, confirm it with a named person, and remove or downgrade it if nobody can vouch for it. Then rotate passwords and the salts (the site's security keys; changing them logs everyone out) and turn on two-factor authentication (2FA), a second check at login, for every admin.
- Plugins and file access, what we did: we documented the file editor and file manager plugins as observed findings.
- Plugins and file access, WordPress hardening guidance: delete file manager plugins and use SFTP (a secure file transfer connection) or the host's file manager instead. Adding DISALLOW_FILE_EDIT to wp-config.php, the main WordPress settings file, removes the built-in editors. DISALLOW_FILE_MODS goes further and blocks installing, updating and deleting plugins and themes from the dashboard, so it only suits sites updated another way, such as WP-CLI (the WordPress command-line tool), the host or a deployment pipeline.
- Integrity and monitoring, what we did: recovery points and a dated record give a known starting point, and we updated the activity-logging plugin in the reviewed environment to support ongoing change tracking.
- Integrity and monitoring, what stays open: file integrity checks, fuller log coverage and host confirmation on unresolved runtimes stayed on the validation list instead of being assumed. As general guidance, WP-CLI can compare core files and WordPress.org plugins against the official originals.
05 / Results
The results
The website owners now have a written set of findings, a dated record of the environment state, recovery points where the hosting supported them, and concise follow-up actions for what is still open. We updated activity logging in the reviewed environment to support ongoing change tracking. No confirmed compromise appeared in the sampled evidence, and we reported it as exactly that: a limited sample, not a full forensic clearance or a blanket all-clear.
Reusable lessonDo not let a patch stand in for an audit: confirm who holds each key to the site, and write down what the evidence cannot yet show.
Lessons
Lessons for other WordPress site owners
- A patch fixes the hole, not the intruder. If someone got in before the update, their login or file access is still there afterward.
- Every admin account is a key to your server. If you cannot name the person behind an account, find out before you trust it.
- Remove anything that lets the browser edit code. File manager plugins and the built-in file editor can turn one stolen admin login into code running on your server.
Current note
How I would evaluate this today
Today we would give a similar site its own review of accounts, file access and logs, scoped and documented the same way. Nothing here discloses an incident, replaces a full WordPress incident investigation, or certifies that any site was free of compromise; we share it, anonymized, to show how the work was scoped.
References
Official documentation and standards
Next step
Not sure who still has access to your site?
If your site is patched but you are not certain which accounts and plugins can still change it, we can review it with the same care. You get a written record of what we saw, what is still open, and what the evidence does and does not show.
